Added instruments to mary.json. Fixed Window resize.

This commit is contained in:
Gordon Weeks 2026-01-31 09:54:44 -08:00
parent f16e4e0c6f
commit a71bb2830a
3 changed files with 116 additions and 303 deletions

View File

@ -25,246 +25,77 @@
{ {
"channel": 0, "channel": 0,
"controlChanges": { "controlChanges": {
"1": [ "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}]
{
"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
}
]
}, },
"pitchBends": [ "pitchBends": [{"ticks": 0, "time": 0, "value": 0}],
{
"ticks": 0,
"time": 0,
"value": 0
}
],
"instrument": { "instrument": {
"family": "piano", "family": "pipe",
"number": 0, "number": 73,
"name": "acoustic grand piano" "name": "flute"
}, },
"name": "", "name": "Melody 1",
"notes": [ "notes": [
{ {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 0, "time": 0, "velocity": 0.7874015748031497},
"duration": 0.5, {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 480, "time": 0.5, "velocity": 0.7874015748031497},
"durationTicks": 480, {"duration": 0.5, "durationTicks": 480, "midi": 60, "name": "C4", "ticks": 960, "time": 1, "velocity": 0.7874015748031497}
"midi": 64, ],
"name": "E4", "endOfTrackTicks": 1440
"ticks": 0, },
"time": 0, {
"velocity": 0.7874015748031497 "channel": 1,
}, "controlChanges": {
{ "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}]
"duration": 0.5, },
"durationTicks": 480, "pitchBends": [{"ticks": 0, "time": 0, "value": 0}],
"midi": 62, "instrument": {
"name": "D4", "family": "strings",
"ticks": 480, "number": 40,
"time": 0.5, "name": "violin"
"velocity": 0.7874015748031497 },
}, "name": "Melody 2",
{ "notes": [
"duration": 0.5, {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 1440, "time": 1.5, "velocity": 0.7874015748031497},
"durationTicks": 480, {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 1920, "time": 2, "velocity": 0.7874015748031497},
"midi": 60, {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 2400, "time": 2.5, "velocity": 0.7874015748031497},
"name": "C4", {"duration": 1, "durationTicks": 960, "midi": 64, "name": "E4", "ticks": 2880, "time": 3, "velocity": 0.7874015748031497}
"ticks": 960, ],
"time": 1, "endOfTrackTicks": 3840
"velocity": 0.7874015748031497 },
}, {
{ "channel": 2,
"duration": 0.5, "controlChanges": {
"durationTicks": 480, "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}]
"midi": 62, },
"name": "D4", "pitchBends": [{"ticks": 0, "time": 0, "value": 0}],
"ticks": 1440, "instrument": {
"time": 1.5, "family": "guitar",
"velocity": 0.7874015748031497 "number": 24,
}, "name": "acoustic guitar (nylon)"
{ },
"duration": 0.5, "name": "Melody 3",
"durationTicks": 480, "notes": [
"midi": 64, {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 3840, "time": 4, "velocity": 0.7874015748031497},
"name": "E4", {"duration": 0.5, "durationTicks": 480, "midi": 62, "name": "D4", "ticks": 4320, "time": 4.5, "velocity": 0.7874015748031497},
"ticks": 1920, {"duration": 1, "durationTicks": 960, "midi": 62, "name": "D4", "ticks": 4800, "time": 5, "velocity": 0.7874015748031497}
"time": 2, ],
"velocity": 0.7874015748031497 "endOfTrackTicks": 5760
}, },
{ {
"duration": 0.5, "channel": 3,
"durationTicks": 480, "controlChanges": {
"midi": 64, "7": [{"number": 7, "ticks": 0, "time": 0, "value": 0.7874015748031497}]
"name": "E4", },
"ticks": 2400, "pitchBends": [{"ticks": 0, "time": 0, "value": 0}],
"time": 2.5, "instrument": {
"velocity": 0.7874015748031497 "family": "chromatic percussion",
}, "number": 9,
{ "name": "glockenspiel"
"duration": 1, },
"durationTicks": 960, "name": "Melody 4",
"midi": 64, "notes": [
"name": "E4", {"duration": 0.5, "durationTicks": 480, "midi": 64, "name": "E4", "ticks": 5760, "time": 6, "velocity": 0.7874015748031497},
"ticks": 2880, {"duration": 0.5, "durationTicks": 480, "midi": 67, "name": "G4", "ticks": 6240, "time": 6.5, "velocity": 0.7874015748031497},
"time": 3, {"duration": 1, "durationTicks": 960, "midi": 67, "name": "G4", "ticks": 6720, "time": 7, "velocity": 0.7874015748031497}
"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
}
], ],
"endOfTrackTicks": 7680 "endOfTrackTicks": 7680
} }

View File

@ -12,8 +12,8 @@
namespace namespace
{ {
constexpr int LANE_COUNT = 12; constexpr int LANE_COUNT = 12;
constexpr int MAX_INSTRUMENT_TYPES = 8;
constexpr int MAX_GAMEPADS = 4; constexpr int MAX_GAMEPADS = 4;
constexpr int MAX_INSTRUMENT_TYPES = MAX_GAMEPADS;
constexpr float RECEPTOR_HEIGHT = 150.0f; constexpr float RECEPTOR_HEIGHT = 150.0f;
constexpr float HIT_ZONE_MARGIN = 20.0f; constexpr float HIT_ZONE_MARGIN = 20.0f;
constexpr float SCROLL_PX_PER_SEC = 350.0f; constexpr float SCROLL_PX_PER_SEC = 350.0f;
@ -53,68 +53,44 @@ const int KEY_KEYS[LANE_COUNT] = {
KEY_V, 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] = { const Color INSTRUMENT_COLORS[MAX_INSTRUMENT_TYPES] = {
{220, 100, 100, 255}, {220, 100, 100, 255}, // red
{100, 160, 255, 255}, {100, 160, 255, 255}, // blue
{100, 220, 120, 255}, {100, 220, 120, 255}, // green
{255, 200, 80, 255}, {255, 200, 80, 255}, // yellow
{200, 100, 255, 255},
{80, 255, 220, 255},
{255, 140, 180, 255},
{180, 255, 140, 255},
}; };
/* Per-instrument WAV paths (lane = midi % 12). C4B4 map to lanes 011. Reuse same set until more assets exist. */ /* Per-instrument WAV paths (lane = midi % 12). C4B4 map to lanes 011. Reuse same set until more assets exist. */
const char* const INSTRUMENT_LANE_WAV[MAX_INSTRUMENT_TYPES][LANE_COUNT] = { 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", { // Instrument 0
"assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav",
"assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav",
"assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav",
"assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav",
"assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav",
{"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"},
"assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", { // Instrument 1
"assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav",
"assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav",
"assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav",
"assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav",
{"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav",
"assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"},
"assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", { // Instrument 2
"assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav",
"assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav",
"assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav",
{"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav",
"assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav",
"assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"},
"assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", { // Instrument 3
"assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav", "assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav",
"assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.wav"}, "assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav",
{"assets/sounds/nes_harp/nes_harp_C4.wav", "assets/sounds/nes_harp/nes_harp_Cs4.wav", "assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav",
"assets/sounds/nes_harp/nes_harp_D4.wav", "assets/sounds/nes_harp/nes_harp_Ds4.wav", "assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav",
"assets/sounds/nes_harp/nes_harp_E4.wav", "assets/sounds/nes_harp/nes_harp_F4.wav", "assets/sounds/nes_harp/nes_harp_Gs4.wav", "assets/sounds/nes_harp/nes_harp_A4.wav",
"assets/sounds/nes_harp/nes_harp_Fs4.wav", "assets/sounds/nes_harp/nes_harp_G4.wav", "assets/sounds/nes_harp/nes_harp_As4.wav", "assets/sounds/nes_harp/nes_harp_B4.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"},
}; };
struct Glyph struct Glyph
@ -136,11 +112,11 @@ std::vector<Glyph> chart_from_song(const Song& song)
float bpm = song.header.bpm > 0.0f ? song.header.bpm : 120.0f; float bpm = song.header.bpm > 0.0f ? song.header.bpm : 120.0f;
float ticks_per_sec = ppq * (bpm / 60.0f); float ticks_per_sec = ppq * (bpm / 60.0f);
int track_index = 0;
for (const Track& track : song.tracks) for (const Track& track : song.tracks)
{ {
int instrument_slot = track.instrument.number % MAX_INSTRUMENT_TYPES; int instrument_slot = track_index % MAX_INSTRUMENT_TYPES;
if (instrument_slot < 0) track_index++;
instrument_slot = 0;
for (const Note& note : track.notes) for (const Note& note : track.notes)
{ {
if (note.midi < 0 || note.midi > 127) if (note.midi < 0 || note.midi > 127)
@ -271,11 +247,7 @@ public:
{ {
auto font_manager = game->get_manager<FontManager>(); auto font_manager = game->get_manager<FontManager>();
font = font_manager->get_font("Roboto"); font = font_manager->get_font("Roboto");
screen_width = static_cast<float>(GetScreenWidth()); update_layout();
screen_height = static_cast<float>(GetScreenHeight());
upper_bar_y = screen_height - RECEPTOR_HEIGHT;
hit_line_y = screen_height - RECEPTOR_HEIGHT / 2.0f;
lane_width = screen_width / LANE_COUNT;
for (int slot = 0; slot < MAX_INSTRUMENT_TYPES; slot++) for (int slot = 0; slot < MAX_INSTRUMENT_TYPES; slot++)
{ {
for (int lane = 0; lane < LANE_COUNT; lane++) for (int lane = 0; lane < LANE_COUNT; lane++)
@ -363,8 +335,18 @@ public:
score += 100 + std::min(combo * 10, 50); score += 100 + std::min(combo * 10, 50);
} }
void update_layout()
{
screen_width = static_cast<float>(GetScreenWidth());
screen_height = static_cast<float>(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 void update(float delta_time) override
{ {
update_layout();
if (game_ended) if (game_ended)
{ {
if (is_menu_pressed()) if (is_menu_pressed())

View File

@ -28,7 +28,7 @@ public:
auto height = GetScreenHeight(); auto height = GetScreenHeight();
auto title_text_size = MeasureTextEx(font, title.c_str(), 64, 0); 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); auto subtitle_text_size = MeasureTextEx(font, subtitle.c_str(), 32, 0);
ClearBackground(SKYBLUE); ClearBackground(SKYBLUE);