diff --git a/lib/ContainerRegistry.cpp b/lib/ContainerRegistry.cpp index b2d1c83..580dd78 100644 --- a/lib/ContainerRegistry.cpp +++ b/lib/ContainerRegistry.cpp @@ -610,6 +610,120 @@ static void SwapN64Rom32(void* data, size_t size) words[i] = SBig(words[i]); } +struct RS1SongMapping +{ + const char* name; + int songId; +} RS1Mappings[] = +{ +{"logo1_SNG", 0}, +{"roguetitle_SNG", 1}, +{"roguetheme_SNG", 1}, +{"title_SNG", 2}, +{"hangar1_SNG", 3}, +{"hangar2_SNG", 3}, +{"hangar3_SNG", 3}, +{"jingle01_SNG", 4}, +{"jingle02_SNG", 4}, +{"jingle03_SNG", 4}, +{"jingle04_SNG", 4}, +{"jingle05_SNG", 4}, +{"jingle06_SNG", 4}, +{"jingle07_SNG", 4}, +{"jingle08_SNG", 4}, +{"c1l1_theme_SNG", 4}, +{"c1l1_prob1_SNG", 4}, +{"c1l1_prob2_SNG", 4}, +{"c1l1_spc01_SNG", 4}, +{"c1l1_spc02_SNG", 4}, +{"c1l2_theme_SNG", 5}, +{"c1l2_spc01_SNG", 5}, +{"c1l3_spc01_SNG", 6}, +{"c1l3_theme_SNG", 6}, +{"c1l4_spc01_SNG", 7}, +{"c1l4_theme_SNG", 7}, +{"action1_SNG", 7}, +{"action1b_SNG", 7}, +{"action2_SNG", 7}, +{"action4_SNG", 7}, +{"action5_SNG", 7}, +{"action6_SNG", 7}, +{"action7_SNG", 7}, +{"c1l5_act01_SNG", 8}, +{"c1l5_act02_SNG", 8}, +{"c1l5_theme_SNG", 8}, +{"c1l5_spc01_SNG", 8}, +{"c2l1_theme_SNG", 9}, +{"c2l1_spc01_SNG", 9}, +{"imperial_SNG", 10}, +{"c2l2_theme_SNG", 10}, +{"c2l2_spc01_SNG", 10}, +{"c3l5_theme_SNG", 10}, +{"c2l3_theme_SNG", 11}, +{"c2l3_spc01_SNG", 11}, +{"c2l5_theme_SNG", 12}, +{"c2l5_spc01_SNG", 12}, +{"c5l1_start_SNG", 12}, +{"c4l1_theme_SNG", 12}, +{"c5l1_1_SNG", 12}, +{"c5l1_2_SNG", 12}, +{"c5l1_3_SNG", 12}, +{"c3l1_theme_SNG", 13}, +{"c5l2_theme_SNG", 13}, +{"c5l2_spc01_SNG", 13}, +{"c5l3_theme_SNG", 13}, +{"c3l2_theme_SNG", 14}, +{"silent01_SNG", 14}, +{"silent02_SNG", 14}, +{"c3l5_spc01_SNG", 14}, +{"c3l4_theme_SNG", 14}, +{"c3l4_spc01_SNG", 14}, +{"credits_SNG", 20}, +{"c1l1_cut1_SNG", 30}, +{"c1l2_cut1_SNG", 30}, +{"c1l3_cut1_SNG", 30}, +{"c1l4_cut1_SNG", 30}, +{"c1l5_cut1_SNG", 30}, +{"c2l1_cut1_SNG", 30}, +{"c2l2_cut1_SNG", 30}, +{"c2l3_cut1_SNG", 30}, +{"c2l5_cut1_SNG", 30}, +{"c2l6_cut1_SNG", 30}, +{"c3l1_cut1_SNG", 30}, +{"c3l2_cut1_SNG", 30}, +{"c3l3_cut1_SNG", 30}, +{"c3l4_cut1_SNG", 30}, +{"c3l5_cut1_SNG", 30}, +{"c4l1_cut1_SNG", 30}, +{"c5l1_cut1_SNG", 30}, +{"c5l2_cut1_SNG", 30}, +{"c5l3_cut1_SNG", 30}, +{"extr_cut1_SNG", 30}, +{"cut_jing1_SNG", 30}, +{"cut_jing2_SNG", 30}, +{"cut_seq1_SNG", 30}, +{"cut_seq2_SNG", 30}, +{"cut_seq3_SNG", 30}, +{"cut_seq4_SNG", 30}, +{"cut_seq5_SNG", 30}, +{"cut_seq6_SNG", 30}, +{"cut_seq7_SNG", 30}, +{"cut_seq8_SNG", 30}, +{} +}; + +static int LookupRS1SongId(const char* name) +{ + RS1SongMapping* map = RS1Mappings; + while (map->name) + { + if (!strcmp(name, map->name)) + return map->songId; + ++map; + } + return -1; +} + static bool ValidateRS1PC(FILE* fp) { size_t endPos = FileLength(fp); @@ -742,7 +856,8 @@ static std::vector> LoadRS1 fread(song.get(), 1, entry.decompSz, fp); SystemString name = StrToSys(entry.name); - ret.emplace_back(name, ContainerRegistry::SongData(std::move(song), entry.decompSz, -1, -1)); + ret.emplace_back(name, ContainerRegistry::SongData(std::move(song), entry.decompSz, -1, + LookupRS1SongId(entry.name))); } } } @@ -963,7 +1078,8 @@ static std::vector> LoadRS1 } SystemString name = StrToSys(ent.name); - ret.emplace_back(name, ContainerRegistry::SongData(std::move(song), ent.decompSz, -1, -1)); + ret.emplace_back(name, ContainerRegistry::SongData(std::move(song), ent.decompSz, -1, + LookupRS1SongId(ent.name))); } } } diff --git a/lib/SoundMacroState.cpp b/lib/SoundMacroState.cpp index 0e5512f..7055bef 100644 --- a/lib/SoundMacroState.cpp +++ b/lib/SoundMacroState.cpp @@ -557,6 +557,15 @@ bool SoundMacroState::advance(Voice& vox, double dt) m_midiDecay = cmd.m_data[1]; m_midiSustain = cmd.m_data[2]; m_midiRelease = cmd.m_data[3]; + + /* Bootstrap ADSR defaults here */ + if (!vox.getCtrlValue(m_midiSustain)) + { + vox.setCtrlValue(m_midiAttack, 10); + vox.setCtrlValue(m_midiSustain, 127); + vox.setCtrlValue(m_midiRelease, 10); + } + break; } case Op::RndNote: diff --git a/lib/Voice.cpp b/lib/Voice.cpp index 33d31ec..0e425ba 100644 --- a/lib/Voice.cpp +++ b/lib/Voice.cpp @@ -1244,6 +1244,7 @@ size_t Voice::getTotalVoices() const void Voice::kill() { m_voxState = VoiceState::Dead; + m_backendVoice->stop(); for (const std::shared_ptr& vox : m_childVoices) vox->kill(); }