Skip to content

Commit 4303840

Browse files
committed
itr based logic + sustains
1 parent 3aa5561 commit 4303840

32 files changed

+1083
-377
lines changed
204 KB
Binary file not shown.

Encore/src/RhythmEngine/ChartLoaders/BaseLoader.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include "midifile/MidiFile.h"
1010

1111
namespace Encore::RhythmEngine {
12-
template <typename ChartType>
1312
class BaseLoader {
1413
// returns -1 for no event, good for plastic guitar i think
1514
virtual void GetChartEvents(smf::MidiEventList track) {};
@@ -33,7 +32,7 @@ namespace Encore::RhythmEngine {
3332
// midiFile.doTimeAnalysis();
3433
BaseLoader(int diff_, int thresh_) : Difficulty(diff_), Threshold(thresh_) {}
3534

36-
ChartType chart;
35+
BaseChart chart;
3736
int Difficulty;
3837
int Threshold; // shouldnt be here but who care
3938
virtual void LoadChart(smf::MidiEventList track) {
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
//
2+
// Created by maria on 17/05/2025.
3+
//
4+
5+
#include "DrumsLoader.h"
6+
// i hate sysex
7+
8+
void Encore::RhythmEngine::DrumsLoader::CheckToms(const smf::MidiEvent &event) {
9+
if (event.isNoteOn()) {
10+
if (event[1] == 110) {
11+
YellowTom.emplace(event.tick, event.getLinkedEvent()->tick);
12+
} else if (event[1] == 111) {
13+
BlueTom.emplace(event.tick, event.getLinkedEvent()->tick);
14+
} else if (event[1] == 112) {
15+
GreenTom.emplace(event.tick, event.getLinkedEvent()->tick);
16+
};
17+
;
18+
}
19+
}
20+
21+
[[nodiscard]] int
22+
Encore::RhythmEngine::DrumsLoader::GetNoteType(const smf::MidiEvent &event) {
23+
if (GetEventLane(Difficulty, event) == 4) {
24+
if (!GreenTom.empty()) {
25+
if (GreenTom.front().first <= event.tick) {
26+
return 0;
27+
}
28+
}
29+
}
30+
if (GetEventLane(Difficulty, event) == 3) {
31+
if (!BlueTom.empty()) {
32+
if (BlueTom.front().first <= event.tick) {
33+
return 0;
34+
}
35+
}
36+
}
37+
if (GetEventLane(Difficulty, event) == 2) {
38+
if (!YellowTom.empty()) {
39+
if (YellowTom.front().first <= event.tick) {
40+
return 0;
41+
}
42+
}
43+
}
44+
if (GetEventLane(Difficulty, event) <= 1) {
45+
return 0;
46+
}
47+
return 1;
48+
}
49+
void Encore::RhythmEngine::DrumsLoader::CheckEvents(const smf::MidiEvent &event) {
50+
if (!chart.solos.empty()) {
51+
if (CurrentSolo < chart.solos.size() - 1
52+
&& chart.solos[CurrentSolo].StartTick + chart.solos[CurrentSolo].EndTick
53+
< event.tick)
54+
CurrentSolo++;
55+
}
56+
57+
if (!chart.overdrive.empty()) {
58+
if (CurrentOverdrive < chart.overdrive.size() - 1
59+
&& chart.overdrive[CurrentOverdrive].StartTick
60+
+ chart.overdrive[CurrentOverdrive].EndTick
61+
< event.tick)
62+
CurrentOverdrive++;
63+
}
64+
}
65+
void Encore::RhythmEngine::DrumsLoader::GetChartEvents(smf::MidiEventList track) {
66+
track.linkNotePairs();
67+
for (int eventInt = 0; eventInt < track.size(); eventInt++) {
68+
smf::MidiEvent &event = track[eventInt];
69+
if (event[1] == 116 && event.isNoteOn()) {
70+
chart.overdrive.emplace_back(
71+
event.tick,
72+
event.seconds,
73+
event.getLinkedEvent()->tick - event.tick,
74+
event.getLinkedEvent()->seconds - event.seconds
75+
);
76+
}
77+
if (event[1] == 103 && event.isNoteOn()) {
78+
chart.solos.emplace_back(
79+
event.tick,
80+
event.seconds,
81+
event.getLinkedEvent()->tick - event.tick,
82+
event.getLinkedEvent()->seconds - event.seconds
83+
);
84+
}
85+
}
86+
}
87+
void Encore::RhythmEngine::DrumsLoader::CreateNote(const smf::MidiEvent &event) {
88+
int lengthTicks = event.getLinkedEvent()->tick - event.tick;
89+
double lengthSec = event.getLinkedEvent()->seconds - event.seconds;
90+
if (event.getLinkedEvent()->tick - event.tick < 170) {
91+
lengthTicks = 0;
92+
lengthSec = 0;
93+
}
94+
chart[GetEventLane(Difficulty, event)].emplace_back(
95+
event.tick, lengthTicks, event.seconds, lengthSec, GetNoteType(event)
96+
);
97+
if (!chart.solos.empty()) {
98+
if (event.tick >= chart.solos[CurrentSolo].StartTick) {
99+
chart.solos[CurrentSolo].NoteCount++;
100+
}
101+
}
102+
}
103+
104+
void Encore::RhythmEngine::DrumsLoader::GetNoteModifiers(smf::MidiEventList track) {
105+
track.linkNotePairs();
106+
for (int eventInt = 0; eventInt < track.size(); eventInt++) {
107+
smf::MidiEvent &event = track[eventInt];
108+
CheckToms(event);
109+
// can have events for things like overdrive here
110+
// ugh
111+
// can i just have notes work for now
112+
}
113+
}
114+
115+
void Encore::RhythmEngine::DrumsLoader::CheckModifiers(const smf::MidiEvent &event) {
116+
if (!BlueTom.empty()) {
117+
if (BlueTom.front().second <= event.tick)
118+
BlueTom.pop();
119+
}
120+
if (!YellowTom.empty()) {
121+
if (YellowTom.front().second <= event.tick)
122+
YellowTom.pop();
123+
}
124+
if (!GreenTom.empty()) {
125+
if (GreenTom.front().second <= event.tick)
126+
GreenTom.pop();
127+
}
128+
}
129+
130+
void Encore::RhythmEngine::DrumsLoader::GetNotes(smf::MidiEventList track) {
131+
track.linkNotePairs();
132+
for (int eventInt = 0; eventInt < track.size(); eventInt++) {
133+
smf::MidiEvent &event = track[eventInt];
134+
// im tired boss
135+
if (event[0] == 255)
136+
continue;
137+
CheckEvents(event);
138+
CheckModifiers(event);
139+
if (IsInPitchRange(Difficulty, event) && event.isNoteOn()) {
140+
CreateNote(event);
141+
}
142+
}
143+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// Created by maria on 17/05/2025.
3+
//
4+
5+
#ifndef DRUMSLOADER_H
6+
#define DRUMSLOADER_H
7+
8+
#include "BaseLoader.h"
9+
10+
namespace Encore::RhythmEngine {
11+
class DrumsLoader final : public BaseLoader {
12+
// start, end
13+
std::queue<std::pair<int, int> > GreenTom = {};
14+
std::queue<std::pair<int, int> > BlueTom = {};
15+
std::queue<std::pair<int, int> > YellowTom = {};
16+
std::queue<int> OpenMarker = {};
17+
int CurrentSolo = 0;
18+
int CurrentOverdrive = 0;
19+
20+
void CheckToms(const smf::MidiEvent &event);
21+
void CheckModifiers(const smf::MidiEvent &event);
22+
void CheckEvents(const smf::MidiEvent &event);
23+
void CreateNote(const smf::MidiEvent &event);
24+
int GetNoteType(const smf::MidiEvent &event) override;
25+
26+
void GetChartEvents(smf::MidiEventList track) override;
27+
void GetNoteModifiers(smf::MidiEventList track) override;
28+
void GetNotes(smf::MidiEventList track) override;
29+
30+
public:
31+
DrumsLoader(int diff_) : BaseLoader(Difficulty = diff_, Threshold = 0) {}
32+
};
33+
}
34+
35+
#endif // DRUMSLOADER_H

Encore/src/RhythmEngine/ChartLoaders/GuitarLoader.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,16 @@ Encore::RhythmEngine::GuitarLoader::GetNoteType(const smf::MidiEvent &event) {
104104
void Encore::RhythmEngine::GuitarLoader::CheckEvents(const smf::MidiEvent &event) {
105105
if (!chart.solos.empty()) {
106106
if (CurrentSolo < chart.solos.size() - 1
107-
&& chart.solos[CurrentSolo].EndTick < event.tick)
107+
&& chart.solos[CurrentSolo].StartTick + chart.solos[CurrentSolo].EndTick
108+
< event.tick)
108109
CurrentSolo++;
109110
}
110111

111112
if (!chart.overdrive.empty()) {
112113
if (CurrentOverdrive < chart.overdrive.size() - 1
113-
&& chart.overdrive[CurrentOverdrive].EndTick < event.tick)
114+
&& chart.overdrive[CurrentOverdrive].StartTick
115+
+ chart.overdrive[CurrentOverdrive].EndTick
116+
< event.tick)
114117
CurrentOverdrive++;
115118
}
116119
}
@@ -119,19 +122,19 @@ void Encore::RhythmEngine::GuitarLoader::GetChartEvents(smf::MidiEventList track
119122
for (int eventInt = 0; eventInt < track.size(); eventInt++) {
120123
smf::MidiEvent &event = track[eventInt];
121124
if (event[1] == 116 && event.isNoteOn()) {
122-
chart.overdrive.push_back(
123-
{ event.tick,
124-
event.seconds,
125-
event.getLinkedEvent()->tick - event.tick,
126-
event.getLinkedEvent()->seconds - event.seconds }
125+
chart.overdrive.emplace_back(
126+
event.tick,
127+
event.seconds,
128+
event.getLinkedEvent()->tick - event.tick,
129+
event.getLinkedEvent()->seconds - event.seconds
127130
);
128131
}
129132
if (event[1] == 103 && event.isNoteOn()) {
130-
chart.solos.push_back(
131-
{ event.tick,
132-
event.seconds,
133-
event.getLinkedEvent()->tick - event.tick,
134-
event.getLinkedEvent()->seconds - event.seconds }
133+
chart.solos.emplace_back(
134+
event.tick,
135+
event.seconds,
136+
event.getLinkedEvent()->tick - event.tick,
137+
event.getLinkedEvent()->seconds - event.seconds
135138
);
136139
}
137140
}
@@ -143,13 +146,13 @@ void Encore::RhythmEngine::GuitarLoader::CreateNote(const smf::MidiEvent &event)
143146
lengthTicks = 0;
144147
lengthSec = 0;
145148
}
146-
chart[0].push_back(
147-
{ event.tick,
148-
lengthTicks,
149-
event.seconds,
150-
lengthSec,
151-
GetNoteType(event),
152-
PlasticFrets[GetEventLane(Difficulty, event)] }
149+
chart[0].emplace_back(
150+
event.tick,
151+
lengthTicks,
152+
event.seconds,
153+
lengthSec,
154+
GetNoteType(event),
155+
PlasticFrets[GetEventLane(Difficulty, event)]
153156
);
154157
if (!chart.solos.empty()) {
155158
if (event.tick >= chart.solos[CurrentSolo].StartTick) {

Encore/src/RhythmEngine/ChartLoaders/GuitarLoader.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "BaseLoader.h"
99

1010
namespace Encore::RhythmEngine {
11-
class GuitarLoader final : public BaseLoader<GuitarChart> {
11+
class GuitarLoader final : public BaseLoader {
1212
// start, end
1313
std::queue<std::pair<int, int> > ForceHopoOn = {};
1414
std::queue<std::pair<int, int> > ForceHopoOff = {};
@@ -33,7 +33,9 @@ namespace Encore::RhythmEngine {
3333

3434
public:
3535
GuitarLoader(int diff_, int thresh_)
36-
: BaseLoader(Difficulty = diff_, Threshold = thresh_) {}
36+
: BaseLoader(Difficulty = diff_, Threshold = thresh_) {
37+
chart.Lanes.resize(1);
38+
}
3739
};
3840
}
3941

Encore/src/RhythmEngine/ChartLoaders/PadLoader.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,10 @@ void Encore::RhythmEngine::PadLoader::CreateNote(const smf::MidiEvent &event) {
8686
lengthTicks = 0;
8787
lengthSec = 0;
8888
}
89-
chart[GetEventLane(Difficulty, event)].push_back(
90-
{
91-
event.tick,
92-
lengthTicks,
93-
event.seconds,
94-
lengthSec,
95-
GetNoteType(event),
96-
}
89+
chart[GetEventLane(Difficulty, event)].emplace_back(
90+
91+
event.tick, lengthTicks, event.seconds, lengthSec, GetNoteType(event)
92+
9793
);
9894
// i hate how solos need note counts before entering lol
9995
if (!chart.solos.empty()) {
@@ -107,7 +103,8 @@ void Encore::RhythmEngine::PadLoader::GetNotes(smf::MidiEventList track) {
107103
track.linkNotePairs();
108104
for (int eventInt = 0; eventInt < track.size(); eventInt++) {
109105
smf::MidiEvent &event = track[eventInt];
110-
if (event[0] == 255) continue;
106+
if (event[0] == 255)
107+
continue;
111108
CheckEvents(event);
112109
if (IsInPitchRange(Difficulty, event) && event.isNoteOn()) {
113110
CheckModifiers(event);

Encore/src/RhythmEngine/ChartLoaders/PadLoader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "BaseLoader.h"
99

1010
namespace Encore::RhythmEngine {
11-
class PadLoader final : public BaseLoader<PadChart> {
11+
class PadLoader final : public BaseLoader {
1212
std::array<std::queue<int>, 5> LiftMarkers = {};
1313
int CurrentSolo = 0;
1414
int CurrentOverdrive = 0;

0 commit comments

Comments
 (0)