From a71bb2830a9c784f864670830460470240b0642c Mon Sep 17 00:00:00 2001 From: Gordon Weeks <627684+gcweeks@users.noreply.github.com> Date: Sat, 31 Jan 2026 09:54:44 -0800 Subject: [PATCH] Added instruments to mary.json. Fixed Window resize. --- assets/songs/json/mary.json | 303 ++++++++---------------------------- src/samples/ghhb_game.h | 114 ++++++-------- src/samples/title_screen.h | 2 +- 3 files changed, 116 insertions(+), 303 deletions(-) diff --git a/assets/songs/json/mary.json b/assets/songs/json/mary.json index 34ffd7e..a438306 100644 --- a/assets/songs/json/mary.json +++ b/assets/songs/json/mary.json @@ -25,246 +25,77 @@ { "channel": 0, "controlChanges": { - "1": [ - { - "number": 1, - "ticks": 0, - "time": 0, - "value": 0 - } - ], - "6": [ - { - "number": 6, - "ticks": 0, - "time": 0, - "value": 0.5039370078740157 - }, - { - "number": 6, - "ticks": 0, - "time": 0, - "value": 0.5039370078740157 - }, - { - "number": 6, - "ticks": 0, - "time": 0, - "value": 0.09448818897637795 - } - ], - "7": [ - { - "number": 7, - "ticks": 0, - "time": 0, - "value": 0.7874015748031497 - } - ], - "10": [ - { - "number": 10, - "ticks": 0, - "time": 0, - "value": 0.5039370078740157 - } - ], - "11": [ - { - "number": 11, - "ticks": 0, - "time": 0, - "value": 1 - } - ], - "38": [ - { - "number": 38, - "ticks": 0, - "time": 0, - "value": 0 - } - ], - "100": [ - { - "number": 100, - "ticks": 0, - "time": 0, - "value": 0.015748031496062992 - }, - { - "number": 100, - "ticks": 0, - "time": 0, - "value": 0.007874015748031496 - }, - { - "number": 100, - "ticks": 0, - "time": 0, - "value": 0 - } - ], - "101": [ - { - "number": 101, - "ticks": 0, - "time": 0, - "value": 0 - }, - { - "number": 101, - "ticks": 0, - "time": 0, - "value": 0 - }, - { - "number": 101, - "ticks": 0, - "time": 0, - "value": 0 - } - ], - "121": [ - { - "number": 121, - "ticks": 0, - "time": 0, - "value": 0 - } - ] + "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}] }, - "pitchBends": [ - { - "ticks": 0, - "time": 0, - "value": 0 - } - ], + "pitchBends": [{"ticks": 0, "time": 0, "value": 0}], "instrument": { - "family": "piano", - "number": 0, - "name": "acoustic grand piano" + "family": "pipe", + "number": 73, + "name": "flute" }, - "name": "", + "name": "Melody 1", "notes": [ - { - "duration": 0.5, - "durationTicks": 480, - "midi": 64, - "name": "E4", - "ticks": 0, - "time": 0, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 62, - "name": "D4", - "ticks": 480, - "time": 0.5, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 60, - "name": "C4", - "ticks": 960, - "time": 1, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 62, - "name": "D4", - "ticks": 1440, - "time": 1.5, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 64, - "name": "E4", - "ticks": 1920, - "time": 2, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 64, - "name": "E4", - "ticks": 2400, - "time": 2.5, - "velocity": 0.7874015748031497 - }, - { - "duration": 1, - "durationTicks": 960, - "midi": 64, - "name": "E4", - "ticks": 2880, - "time": 3, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 62, - "name": "D4", - "ticks": 3840, - "time": 4, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 62, - "name": "D4", - "ticks": 4320, - "time": 4.5, - "velocity": 0.7874015748031497 - }, - { - "duration": 1, - "durationTicks": 960, - "midi": 62, - "name": "D4", - "ticks": 4800, - "time": 5, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 64, - "name": "E4", - "ticks": 5760, - "time": 6, - "velocity": 0.7874015748031497 - }, - { - "duration": 0.5, - "durationTicks": 480, - "midi": 67, - "name": "G4", - "ticks": 6240, - "time": 6.5, - "velocity": 0.7874015748031497 - }, - { - "duration": 1, - "durationTicks": 960, - "midi": 67, - "name": "G4", - "ticks": 6720, - "time": 7, - "velocity": 0.7874015748031497 - } + {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 0, "time": 0, "velocity": 0.7874015748031497}, + {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 480, "time": 0.5, "velocity": 0.7874015748031497}, + {"duration": 0.5, "durationTicks": 480, "midi": 60, "name": "C4", "ticks": 960, "time": 1, "velocity": 0.7874015748031497} + ], + "endOfTrackTicks": 1440 + }, + { + "channel": 1, + "controlChanges": { + "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}] + }, + "pitchBends": [{"ticks": 0, "time": 0, "value": 0}], + "instrument": { + "family": "strings", + "number": 40, + "name": "violin" + }, + "name": "Melody 2", + "notes": [ + {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 1440, "time": 1.5, "velocity": 0.7874015748031497}, + {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 1920, "time": 2, "velocity": 0.7874015748031497}, + {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 2400, "time": 2.5, "velocity": 0.7874015748031497}, + {"duration": 1, "durationTicks": 960, "midi": 64, "name": "E4", "ticks": 2880, "time": 3, "velocity": 0.7874015748031497} + ], + "endOfTrackTicks": 3840 + }, + { + "channel": 2, + "controlChanges": { + "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}] + }, + "pitchBends": [{"ticks": 0, "time": 0, "value": 0}], + "instrument": { + "family": "guitar", + "number": 24, + "name": "acoustic guitar (nylon)" + }, + "name": "Melody 3", + "notes": [ + {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 3840, "time": 4, "velocity": 0.7874015748031497}, + {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 4320, "time": 4.5, "velocity": 0.7874015748031497}, + {"duration": 1, "durationTicks": 960, "midi": 62, "name": "D4", "ticks": 4800, "time": 5, "velocity": 0.7874015748031497} + ], + "endOfTrackTicks": 5760 + }, + { + "channel": 3, + "controlChanges": { + "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}] + }, + "pitchBends": [{"ticks": 0, "time": 0, "value": 0}], + "instrument": { + "family": "chromatic percussion", + "number": 9, + "name": "glockenspiel" + }, + "name": "Melody 4", + "notes": [ + {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 5760, "time": 6, "velocity": 0.7874015748031497}, + {"duration": 0.5, "durationTicks": 480, "midi": 67, "name": "G4", "ticks": 6240, "time": 6.5, "velocity": 0.7874015748031497}, + {"duration": 1, "durationTicks": 960, "midi": 67, "name": "G4", "ticks": 6720, "time": 7, "velocity": 0.7874015748031497} ], "endOfTrackTicks": 7680 } diff --git a/src/samples/ghhb_game.h b/src/samples/ghhb_game.h index d09e640..5b8340e 100644 --- a/src/samples/ghhb_game.h +++ b/src/samples/ghhb_game.h @@ -12,8 +12,8 @@ namespace { constexpr int LANE_COUNT = 12; -constexpr int MAX_INSTRUMENT_TYPES = 8; constexpr int MAX_GAMEPADS = 4; +constexpr int MAX_INSTRUMENT_TYPES = MAX_GAMEPADS; constexpr float RECEPTOR_HEIGHT = 150.0f; constexpr float HIT_ZONE_MARGIN = 20.0f; constexpr float SCROLL_PX_PER_SEC = 350.0f; @@ -53,68 +53,44 @@ const int KEY_KEYS[LANE_COUNT] = { KEY_V, }; -/* One color per instrument type (MIDI program % MAX_INSTRUMENT_TYPES). */ +/* One color per track (track index % MAX_INSTRUMENT_TYPES). */ const Color INSTRUMENT_COLORS[MAX_INSTRUMENT_TYPES] = { - {220, 100, 100, 255}, - {100, 160, 255, 255}, - {100, 220, 120, 255}, - {255, 200, 80, 255}, - {200, 100, 255, 255}, - {80, 255, 220, 255}, - {255, 140, 180, 255}, - {180, 255, 140, 255}, + {220, 100, 100, 255}, // red + {100, 160, 255, 255}, // blue + {100, 220, 120, 255}, // green + {255, 200, 80, 255}, // yellow }; /* Per-instrument WAV paths (lane = midi % 12). C4–B4 map to lanes 0–11. Reuse same set until more assets exist. */ const char* const INSTRUMENT_LANE_WAV[MAX_INSTRUMENT_TYPES][LANE_COUNT] = { - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, - {"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", - "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", - "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", - "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", - "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", - "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, + { // Instrument 0 + "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", + "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", + "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", + "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", + "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", + "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, + { // Instrument 1 + "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", + "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", + "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", + "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", + "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", + "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, + { // Instrument 2 + "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", + "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", + "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", + "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", + "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", + "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, + { // Instrument 3 + "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", + "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", + "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", + "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", + "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", + "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, }; struct Glyph @@ -136,11 +112,11 @@ std::vector chart_from_song(const Song& song) float bpm = song.header.bpm > 0.0f ? song.header.bpm : 120.0f; float ticks_per_sec = ppq * (bpm / 60.0f); + int track_index = 0; for (const Track& track : song.tracks) { - int instrument_slot = track.instrument.number % MAX_INSTRUMENT_TYPES; - if (instrument_slot < 0) - instrument_slot = 0; + int instrument_slot = track_index % MAX_INSTRUMENT_TYPES; + track_index++; for (const Note& note : track.notes) { if (note.midi < 0 || note.midi > 127) @@ -271,11 +247,7 @@ public: { auto font_manager = game->get_manager(); font = font_manager->get_font("Roboto"); - screen_width = static_cast(GetScreenWidth()); - screen_height = static_cast(GetScreenHeight()); - upper_bar_y = screen_height - RECEPTOR_HEIGHT; - hit_line_y = screen_height - RECEPTOR_HEIGHT / 2.0f; - lane_width = screen_width / LANE_COUNT; + update_layout(); for (int slot = 0; slot < MAX_INSTRUMENT_TYPES; slot++) { for (int lane = 0; lane < LANE_COUNT; lane++) @@ -363,8 +335,18 @@ public: score += 100 + std::min(combo * 10, 50); } + void update_layout() + { + screen_width = static_cast(GetScreenWidth()); + screen_height = static_cast(GetScreenHeight()); + upper_bar_y = screen_height - RECEPTOR_HEIGHT; + hit_line_y = screen_height - RECEPTOR_HEIGHT / 2.0f; + lane_width = screen_width / LANE_COUNT; + } + void update(float delta_time) override { + update_layout(); if (game_ended) { if (is_menu_pressed()) diff --git a/src/samples/title_screen.h b/src/samples/title_screen.h index f14771b..0a22066 100644 --- a/src/samples/title_screen.h +++ b/src/samples/title_screen.h @@ -28,7 +28,7 @@ public: auto height = GetScreenHeight(); auto title_text_size = MeasureTextEx(font, title.c_str(), 64, 0); - std::string subtitle = "Press Start or Enter to Play"; + std::string subtitle = "Press Start";// or Enter to Play"; auto subtitle_text_size = MeasureTextEx(font, subtitle.c_str(), 32, 0); ClearBackground(SKYBLUE);