Skip to content

Commit 93f95e9

Browse files
beatlines, all lifts issue, move some stuff, hit window lines
1 parent 849a446 commit 93f95e9

File tree

3 files changed

+106
-85
lines changed

3 files changed

+106
-85
lines changed

Encore/include/song/chart.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ struct Note
88
double len;
99
double heldTime=0.0;
1010
int lane;
11-
bool lift;
11+
bool lift = false;
1212
bool hit = false;
1313
bool held = false;
1414
bool valid = false;

Encore/include/song/song.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ class Song
109109
//Parts order will always be Drums, Bass, Guitar, Vocals, Plastic Drums, Plastic Bass, Plastic Guitar
110110
std::vector<SongPart*> parts{ new SongPart,new SongPart,new SongPart,new SongPart ,new SongPart ,new SongPart ,new SongPart };
111111

112+
std::vector<std::pair<double, bool>> beatLines; //double time, bool downbeat
113+
112114
std::vector<std::string> stemsPath{ "","","","","" };
113115

114116
std::filesystem::path midiPath = "";
@@ -258,5 +260,12 @@ class Song
258260
}
259261
ifs.close();
260262
}
261-
263+
void parseBeatLines(smf::MidiFile& midiFile, int trkidx, smf::MidiEventList events) {
264+
for (int i = 0; i < events.getSize(); i++) {
265+
if (events[i].isNoteOn()) {
266+
double time = midiFile.getTimeInSeconds(trkidx, i);
267+
beatLines.push_back({ time, (int)events[i][1] == 12 });
268+
}
269+
}
270+
}
262271
};

Encore/src/main.cpp

+95-83
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ vector<std::string> ArgumentList::arguments;
2121
bool compareNotes(const Note& a, const Note& b) {
2222
return a.time < b.time;
2323
}
24+
2425
std::vector<int> KEYBINDS_5K{ KEY_D,KEY_F,KEY_J,KEY_K,KEY_L };
2526
std::vector<int> KEYBINDS_4K{ KEY_D,KEY_F,KEY_J,KEY_K };
2627
std::vector<int> prev4k = KEYBINDS_4K;
2728
std::vector<int> prev5k = KEYBINDS_5K;
29+
bool changing4k = false;
30+
2831
rapidjson::Value vectorToJsonArray(const std::vector<int>& vec, rapidjson::Document::AllocatorType& allocator) {
2932
rapidjson::Value array(rapidjson::kArrayType);
3033
for (const auto& value : vec) {
@@ -126,6 +129,29 @@ std::string getKeyStr(int keycode)
126129
return "UNKNOWN";
127130
}
128131
}
132+
133+
int instrument = 0;
134+
int diff = 0;
135+
bool midiLoaded = false;
136+
bool isPlaying = false;
137+
bool streamsLoaded = false;
138+
int selectStage = 0;
139+
std::vector<Music> loadedStreams;
140+
int curPlayingSong = 0;
141+
int curNoteIdx = 0;
142+
int curODPhrase = 0;
143+
int curBeatLine = 0;
144+
145+
std::vector<float> bns = { 0.5f,0.75f,1.0f,1.25f,1.5f,1.75f,2.0f };
146+
int bn = 4;
147+
std::string bnsButton = "Track Speed 1.5x";
148+
149+
150+
std::vector<double> laneTimes = { 0.0,0.0,0.0,0.0,0.0 };
151+
std::vector<double> liftTimes = { 0.0,0.0,0.0,0.0,0.0 };
152+
std::vector<bool> heldFrets = { false,false,false,false,false };
153+
154+
129155
int main(int argc, char* argv[])
130156
{
131157
#ifdef NDEBUG
@@ -158,8 +184,7 @@ int main(int argc, char* argv[])
158184
double updateDrawTime = 0.0;
159185
double waitTime = 0.0;
160186
float deltaTime = 0.0f;
161-
int instrument = 0;
162-
int diff = 0;
187+
163188

164189

165190
float timeCounter = 0.0f;
@@ -263,23 +288,6 @@ int main(int argc, char* argv[])
263288
}
264289

265290
SongList songList = LoadSongs(songsPath);
266-
bool midiLoaded = false;
267-
bool isPlaying = false;
268-
bool streamsLoaded = false;
269-
int selectStage = 0;
270-
std::vector<Music> loadedStreams;
271-
int curPlayingSong = 0;
272-
int curNoteIdx = 0;
273-
int curODPhrase = 0;
274-
275-
////////////////////////////////////
276-
//
277-
// BREAKNECK SPEED
278-
//
279-
280-
float bns = 2.0f;
281-
bool bn = true;
282-
const char* bnsButton = "Breakneck On";
283291

284292
ChangeDirectory(GetApplicationDirectory());
285293

@@ -305,8 +313,6 @@ int main(int argc, char* argv[])
305313
expertHighway.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE;
306314
emhHighway.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = highwayTexture;
307315
emhHighway.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE;
308-
// expertHighway.materials[1].maps[MATERIAL_MAP_ALBEDO].texture = sidesTexture;
309-
// expertHighway.materials[1].maps[MATERIAL_MAP_ALBEDO].color = WHITE;
310316
Model noteModel = LoadModel((directory / "Assets/note.obj").string().c_str());
311317
Texture2D noteTexture = LoadTexture((directory / "Assets/note_d.png").string().c_str());
312318
Texture2D emitTexture = LoadTexture((directory / "Assets/note_e.png").string().c_str());
@@ -325,10 +331,7 @@ int main(int argc, char* argv[])
325331
liftModel.materials[0].maps[MATERIAL_MAP_ALBEDO].color = Color{ 172,82,217,127 };
326332
Model liftModelOD = LoadModel((directory / "Assets/lift.obj").string().c_str());
327333
liftModelOD.materials[0].maps[MATERIAL_MAP_ALBEDO].color = Color{ 217, 183, 82 ,127 };
328-
std::vector<double> laneTimes = { 0.0,0.0,0.0,0.0,0.0 };
329-
std::vector<double> liftTimes = { 0.0,0.0,0.0,0.0,0.0 };
330-
std::vector<bool> heldFrets = { false,false,false,false,false };
331-
bool changing4k = false;
334+
332335

333336
while (!WindowShouldClose())
334337
{
@@ -432,41 +435,32 @@ int main(int argc, char* argv[])
432435

433436
}
434437
else if (selectStage == 0) {
435-
438+
streamsLoaded = false;
436439
midiLoaded = false;
437440
float curSong = 0.0f;
438-
for (Song song : songList.songs) {
439-
if (GuiButton({ (float)GetScreenWidth() - 100,0,100,60}, "Keybinds")) {
440-
selectStage = -1;
441+
if (GuiButton({ (float)GetScreenWidth() - 100,0,100,60 }, "Keybinds")) {
442+
selectStage = -1;
443+
}
444+
if (GuiButton({ (float)GetScreenWidth() - 100,60,100,60 }, "Fullscreen")) {
445+
windowToggle = !windowToggle;
446+
ToggleBorderlessWindowed();
447+
if (windowToggle) {
448+
SetWindowPosition(50, 50);
449+
SetWindowSize(1600, 800);
441450
}
451+
else {
452+
SetWindowSize(1920, 1080);
453+
};
454+
}
455+
if (GuiButton({ (float)GetScreenWidth() - 150,120,150,60 }, bnsButton.c_str())) {
456+
if (bn == 6) bn = 0; else bn++;
457+
bnsButton = "Track Speed "+std::to_string(bns[bn])+"x";
458+
}
459+
for (Song song : songList.songs) {
442460
if (GuiButton({ 0,0 + (60 * curSong),300,60 }, "")) {
443461
curPlayingSong = (int)curSong;
444462
selectStage = 1;
445463
}
446-
if (GuiButton({ (float)GetScreenWidth() - 100,60,100,60 }, "Fullscreen")) {
447-
windowToggle = !windowToggle;
448-
ToggleBorderlessWindowed();
449-
if (windowToggle) {
450-
SetWindowPosition(50, 50);
451-
SetWindowSize(1600, 800);
452-
}
453-
else {
454-
SetWindowSize(1920, 1080);
455-
};
456-
}
457-
if (GuiButton({ (float)GetScreenWidth() - 100,120,100,60}, bnsButton)) {
458-
if (!bn) {
459-
bns = 2.0f;
460-
bn = true;
461-
bnsButton = "Breakneck On";
462-
}
463-
else
464-
{
465-
bns = 1.0f;
466-
bn = false;
467-
bnsButton = "Breakneck Off";
468-
};
469-
}
470464
DrawTextureEx(song.albumArt, Vector2{ 5,(60 * curSong) + 5 }, 0.0f, 0.1f, RAYWHITE);
471465

472466
DrawText(song.title.c_str(), 60, (60 * curSong) + 5, 20, BLACK);
@@ -490,18 +484,22 @@ int main(int argc, char* argv[])
490484
}
491485
SongParts songPart = partFromString(trackName);
492486
std::cout << "TRACKNAME " << trackName << ": " << int(songPart) << std::endl;
493-
if (songPart != SongParts::Invalid) {
494-
songList.songs[curPlayingSong].parts[(int)songPart]->hasPart = true;
495-
std::string diffstr = "ESY: ";
496-
for (int diff = 0; diff < 4; diff++) {
497-
Chart newChart;
498-
newChart.parseNotes(midiFile, i, midiFile[i], diff);
499-
std::sort(newChart.notes.begin(), newChart.notes.end(), compareNotes);
500-
if (diff == 1) diffstr = "MED: ";
501-
else if (diff == 2) diffstr = "HRD: ";
502-
else if (diff == 3) diffstr = "EXP: ";
503-
songList.songs[curPlayingSong].parts[(int)songPart]->charts.push_back(newChart);
504-
std::cout << trackName << " " << diffstr << newChart.notes.size() << std::endl;
487+
if (trackName == "BEAT")
488+
songList.songs[curPlayingSong].parseBeatLines(midiFile, i, midiFile[i]);
489+
else {
490+
if (songPart != SongParts::Invalid) {
491+
songList.songs[curPlayingSong].parts[(int)songPart]->hasPart = true;
492+
std::string diffstr = "ESY: ";
493+
for (int diff = 0; diff < 4; diff++) {
494+
Chart newChart;
495+
newChart.parseNotes(midiFile, i, midiFile[i], diff);
496+
std::sort(newChart.notes.begin(), newChart.notes.end(), compareNotes);
497+
if (diff == 1) diffstr = "MED: ";
498+
else if (diff == 2) diffstr = "HRD: ";
499+
else if (diff == 3) diffstr = "EXP: ";
500+
songList.songs[curPlayingSong].parts[(int)songPart]->charts.push_back(newChart);
501+
std::cout << trackName << " " << diffstr << newChart.notes.size() << std::endl;
502+
}
505503
}
506504
}
507505
}
@@ -591,25 +589,36 @@ int main(int argc, char* argv[])
591589
}
592590
else {
593591
DrawModel(smasherReg, Vector3{ diffDistance - (i + 2), 0, 0 }, 1.0f, WHITE);
594-
592+
595593
}
596594
}
597595
for (int i = 0; i < 3; i++) {
598596
DrawLine3D(Vector3{ lineDistance - i, 0.05f, 0 }, Vector3{ lineDistance - i, 0.05f, 20 }, Color{ 255,255,255,255 });
599597
}
600598
}
601-
602-
599+
if (songList.songs[curPlayingSong].beatLines.size() >= 0) {
600+
for (int i = curBeatLine; i < songList.songs[curPlayingSong].beatLines.size(); i++) {
601+
double relTime = (songList.songs[curPlayingSong].beatLines[i].first - musicTime) * bns[bn];
602+
if (relTime > 1.5)
603+
break;
604+
float radius = songList.songs[curPlayingSong].beatLines[i].second ? 0.05f : 0.025f;
605+
DrawCylinderEx(Vector3{ -diffDistance-0.5f,0,2.5f + (12.5f * (float)relTime) }, Vector3{ diffDistance + 0.5f,0,2.5f + (12.5f * (float)relTime) }, radius, radius, 4, WHITE);
606+
607+
if (relTime < -1 && curBeatLine < songList.songs[curPlayingSong].beatLines.size())
608+
curBeatLine++;
609+
610+
}
611+
}
603612
// DrawTriangle3D(Vector3{ 2.5f,0.0f,0.0f }, Vector3{ -2.5f,0.0f,0.0f }, Vector3{ -2.5f,0.0f,20.0f }, BLACK);
604613
// DrawTriangle3D(Vector3{ 2.5f,0.0f,0.0f }, Vector3{ -2.5f,0.0f,20.0f }, Vector3{ 2.5f,0.0f,20.0f }, BLACK);
605614

606615
// DrawLine3D(Vector3{ 2.5f, 0.05f, 2.0f }, Vector3{ -2.5f, 0.05f, 2.0f}, WHITE);
607-
Chart& dmsExpert = songList.songs[curPlayingSong].parts[instrument]->charts[diff];
608-
if (dmsExpert.odPhrases.size() > 0 && curODPhrase < dmsExpert.odPhrases.size()) {
609-
if (dmsExpert.notes[curNoteIdx].time+dmsExpert.notes[curNoteIdx].len > dmsExpert.odPhrases[curODPhrase].end && curODPhrase < dmsExpert.odPhrases.size()) curODPhrase++;
616+
Chart& curChart = songList.songs[curPlayingSong].parts[instrument]->charts[diff];
617+
if (curChart.odPhrases.size() > 0) {
618+
if (curChart.notes[curNoteIdx].time+curChart.notes[curNoteIdx].len > curChart.odPhrases[curODPhrase].end && curODPhrase < curChart.odPhrases.size()-1) curODPhrase++;
610619
}
611-
for (int i = curNoteIdx; i < dmsExpert.notes.size(); i++) {
612-
Note& curNote = dmsExpert.notes[i];
620+
for (int i = curNoteIdx; i < curChart.notes.size(); i++) {
621+
Note& curNote = curChart.notes[i];
613622
if (curNote.lift == true) {
614623
if (curNote.time - 0.075 < liftTimes[curNote.lane] && curNote.time + 0.075 > laneTimes[curNote.lane]) {
615624
curNote.hit = true;
@@ -618,20 +627,20 @@ int main(int argc, char* argv[])
618627
else {
619628
if (curNote.time - 0.075 < laneTimes[curNote.lane] && curNote.time + 0.075 > laneTimes[curNote.lane]) {
620629
curNote.hit = true;
621-
if ((curNote.len * bns) > 0.25) {
630+
if ((curNote.len * bns[bn]) > 0.25) {
622631
curNote.held = true;
623632
}
624633
}
625-
if (laneTimes[curNote.lane] == 0.0 && (curNote.len * bns) > 0.25) {
634+
if (laneTimes[curNote.lane] == 0.0 && (curNote.len * bns[bn]) > 0.25) {
626635
curNote.held = false;
627636
}
628637
}
629638

630-
double relTime = (curNote.time - musicTime) * bns;
631-
double relEnd = ((curNote.time + curNote.len) - musicTime) * bns;
639+
double relTime = (curNote.time - musicTime) * bns[bn];
640+
double relEnd = ((curNote.time + curNote.len) - musicTime) * bns[bn];
632641
bool od = false;
633-
if (dmsExpert.odPhrases.size() > 0 && curODPhrase < dmsExpert.odPhrases.size()) {
634-
if (curNote.time >= dmsExpert.odPhrases[curODPhrase].start && curNote.time <= dmsExpert.odPhrases[curODPhrase].end) {
642+
if (curChart.odPhrases.size() > 0) {
643+
if (curNote.time >= curChart.odPhrases[curODPhrase].start && curNote.time <= curChart.odPhrases[curODPhrase].end) {
635644
od = true;
636645
}
637646

@@ -651,9 +660,9 @@ int main(int argc, char* argv[])
651660
}
652661
else {
653662
// sustains
654-
if ((curNote.len * bns)> 0.25) {
663+
if ((curNote.len * bns[bn])> 0.25) {
655664
if (curNote.hit == true && curNote.held == true) {
656-
if (curNote.heldTime < (curNote.len * bns)) {
665+
if (curNote.heldTime < (curNote.len * bns[bn])) {
657666
curNote.heldTime = 0.0 - relTime;
658667
if (relTime < 0.0) relTime = 0.0;
659668
}
@@ -672,16 +681,19 @@ int main(int argc, char* argv[])
672681
DrawLine3D(Vector3{ diffDistance - (1.0f * curNote.lane),0.05f,2.5f + (12.5f * (float)relTime) }, Vector3{ diffDistance - (1.0f * curNote.lane),0.05f,2.5f + (12.5f * (float)relEnd) }, Color{ 172,82,217,255 });
673682
}
674683
// regular notes
675-
if (((curNote.len * bns) >=0.25 && (curNote.held==true||curNote.hit==false)) || ((curNote.len * bns)<0.25 && curNote.hit==false)) {
684+
if (((curNote.len * bns[bn]) >=0.25 && (curNote.held==true||curNote.hit==false)) || ((curNote.len * bns[bn])<0.25 && curNote.hit==false)) {
676685
if (od == true)
677686
DrawModel(noteModelOD, Vector3{ diffDistance - (1.0f * curNote.lane),0,2.5f + (12.5f * (float)relTime) }, 1.0f, WHITE);
678687
else
679688
DrawModel(noteModel, Vector3{ diffDistance - (1.0f * curNote.lane),0,2.5f + (12.5f * (float)relTime) }, 1.0f, WHITE);
680689
}
681690
}
682-
if (relEnd < -1 && curNoteIdx < dmsExpert.notes.size()) curNoteIdx = i + 1;
691+
if (relEnd < -1 && curNoteIdx < curChart.notes.size()) curNoteIdx = i + 1;
683692

684693
}
694+
DrawLine3D(Vector3{ -diffDistance - 0.5f,0,2.5f + (12.5f * 0.075f*bns[bn])}, Vector3{diffDistance + 0.5f,0,2.5f + (12.5f * 0.075f * bns[bn] )}, Color{0,255,0,255});
695+
DrawLine3D(Vector3{ -diffDistance - 0.5f,0,2.5f - (12.5f * 0.075f * bns[bn]) }, Vector3{ diffDistance + 0.5f,0,2.5f - (12.5f * 0.075f * bns[bn] )}, Color{ 0,255,0,255 });
696+
685697
EndMode3D();
686698
}
687699

0 commit comments

Comments
 (0)