diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2023-09-16 03:10:56 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2023-09-16 03:10:56 -0600 |
| commit | 98b6d598324fdcb499a2cc4d37a7a6fcd19e8ead (patch) | |
| tree | e03627371fc7423c684631ed7eee68d697709e0f | |
| parent | fc7bf4c6ec1a637bb9eb240220533af856dc5a66 (diff) | |
Added support to extract banks on each sequence
| -rw-r--r-- | assets.json | 71 | ||||
| -rw-r--r-- | sequences.json | 37 | ||||
| -rw-r--r-- | src/Companion.cpp | 2 | ||||
| -rw-r--r-- | src/audio/AudioManager.cpp | 4 | ||||
| -rw-r--r-- | src/factories/AudioFactory.cpp | 34 | ||||
| -rw-r--r-- | src/factories/ResourceType.h | 3 | ||||
| -rw-r--r-- | tools/gen_bankset.js | 23 |
7 files changed, 124 insertions, 50 deletions
diff --git a/assets.json b/assets.json index 43208d4..eb6a14e 100644 --- a/assets.json +++ b/assets.json @@ -1086,45 +1086,44 @@ "sound/sequences/sh/20_cutscene_ending.m64": [1887,{"sh":[7981824]}], "sound/sequences/sh/21_menu_file_select.m64": [786,{"sh":[7983712]}], "sound/sequences/sh/22_cutscene_lakitu.m64": [317,{"sh":[7984512]}], -"sound/sequences/us/00_sound_player.m64": [13452,{"us":[8063360]}], -"sound/sequences/us/01_cutscene_collect_star.m64": [619,{"us":[8076816]}], -"sound/sequences/us/02_menu_title_screen.m64": [8254,{"us":[8077440]}], -"sound/sequences/us/03_level_grass.m64": [5122,{"us":[8085696]}], -"sound/sequences/us/04_level_inside_castle.m64": [2494,{"us":[8090832]}], -"sound/sequences/us/05_level_water.m64": [4780,{"us":[8093328]}], -"sound/sequences/us/06_level_hot.m64": [2451,{"us":[8098112]}], -"sound/sequences/us/07_level_boss_koopa.m64": [3418,{"us":[8100576]}], -"sound/sequences/us/08_level_snow.m64": [8143,{"us":[8104000]}], -"sound/sequences/us/09_level_slide.m64": [7432,{"us":[8112144]}], -"sound/sequences/us/0A_level_spooky.m64": [5674,{"us":[8119584]}], -"sound/sequences/us/0B_event_piranha_plant.m64": [1395,{"us":[8125264]}], -"sound/sequences/us/0C_level_underground.m64": [4887,{"us":[8126672]}], -"sound/sequences/us/0D_menu_star_select.m64": [134,{"us":[8131568]}], -"sound/sequences/us/0E_event_powerup.m64": [3129,{"us":[8131712]}], -"sound/sequences/us/0F_event_metal_cap.m64": [2770,{"us":[8134848]}], -"sound/sequences/us/10_event_koopa_message.m64": [552,{"us":[8137632]}], -"sound/sequences/us/11_level_koopa_road.m64": [4741,{"us":[8138192]}], -"sound/sequences/us/12_event_high_score.m64": [271,{"us":[8142944]}], -"sound/sequences/us/13_event_merry_go_round.m64": [1657,{"us":[8143216]}], -"sound/sequences/us/14_event_race.m64": [197,{"us":[8144880]}], -"sound/sequences/us/15_cutscene_star_spawn.m64": [644,{"us":[8145088]}], -"sound/sequences/us/16_event_boss.m64": [3435,{"us":[8145744]}], -"sound/sequences/us/17_cutscene_collect_key.m64": [671,{"us":[8149184]}], -"sound/sequences/us/18_event_endless_stairs.m64": [1777,{"us":[8149856]}], -"sound/sequences/us/19_level_boss_koopa_final.m64": [3515,{"us":[8151648]}], -"sound/sequences/us/1A_cutscene_credits.m64": [14313,{"us":[8155168]}], -"sound/sequences/us/1B_event_solve_puzzle.m64": [216,{"us":[8169488]}], -"sound/sequences/us/1C_event_toad_message.m64": [208,{"us":[8169712]}], -"sound/sequences/us/1D_event_peach_message.m64": [432,{"us":[8169920]}], -"sound/sequences/us/1E_cutscene_intro.m64": [1764,{"us":[8170352]}], -"sound/sequences/us/1F_cutscene_victory.m64": [2058,{"us":[8172128]}], -"sound/sequences/us/20_cutscene_ending.m64": [1882,{"us":[8174192]}], -"sound/sequences/us/21_menu_file_select.m64": [781,{"us":[8176080]}], -"sound/sequences/us/22_cutscene_lakitu.m64": [313,{"us":[8176864]}], +"sound/sequences/us/00_sound_player.m64": [13452,{"us":[8063360], "banks": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}], +"sound/sequences/us/01_cutscene_collect_star.m64": [619,{"us":[8076816], "banks": [34]}], +"sound/sequences/us/02_menu_title_screen.m64": [8254,{"us":[8077440], "banks": [17]}], +"sound/sequences/us/03_level_grass.m64": [5122,{"us":[8085696], "banks": [34]}], +"sound/sequences/us/04_level_inside_castle.m64": [2494,{"us":[8090832], "banks": [14]}], +"sound/sequences/us/05_level_water.m64": [4780,{"us":[8093328], "banks": [19]}], +"sound/sequences/us/06_level_hot.m64": [2451,{"us":[8098112], "banks": [15]}], +"sound/sequences/us/07_level_boss_koopa.m64": [3418,{"us":[8100576], "banks": [18]}], +"sound/sequences/us/08_level_snow.m64": [8143,{"us":[8104000], "banks": [11]}], +"sound/sequences/us/09_level_slide.m64": [7432,{"us":[8112144], "banks": [13]}], +"sound/sequences/us/0A_level_spooky.m64": [5674,{"us":[8119584], "banks": [33, 16]}], +"sound/sequences/us/0B_event_piranha_plant.m64": [1395,{"us":[8125264], "banks": [20]}], +"sound/sequences/us/0C_level_underground.m64": [4887,{"us":[8126672], "banks": [21]}], +"sound/sequences/us/0D_menu_star_select.m64": [134,{"us":[8131568], "banks": [22]}], +"sound/sequences/us/0E_event_powerup.m64": [3129,{"us":[8131712], "banks": [23]}], +"sound/sequences/us/0F_event_metal_cap.m64": [2770,{"us":[8134848], "banks": [24]}], +"sound/sequences/us/10_event_koopa_message.m64": [552,{"us":[8137632], "banks": [18]}], +"sound/sequences/us/11_level_koopa_road.m64": [4741,{"us":[8138192], "banks": [25]}], +"sound/sequences/us/12_event_high_score.m64": [271,{"us":[8142944], "banks": [31]}], +"sound/sequences/us/13_event_merry_go_round.m64": [1657,{"us":[8143216], "banks": [33]}], +"sound/sequences/us/14_event_race.m64": [197,{"us":[8144880], "banks": [26]}], +"sound/sequences/us/15_cutscene_star_spawn.m64": [644,{"us":[8145088], "banks": [14]}], +"sound/sequences/us/16_event_boss.m64": [3435,{"us":[8145744], "banks": [27]}], +"sound/sequences/us/17_cutscene_collect_key.m64": [671,{"us":[8149184], "banks": [26]}], +"sound/sequences/us/18_event_endless_stairs.m64": [1777,{"us":[8149856], "banks": [28]}], +"sound/sequences/us/19_level_boss_koopa_final.m64": [3515,{"us":[8151648], "banks": [29]}], +"sound/sequences/us/1A_cutscene_credits.m64": [14313,{"us":[8155168], "banks": [37]}], +"sound/sequences/us/1B_event_solve_puzzle.m64": [216,{"us":[8169488], "banks": [20]}], +"sound/sequences/us/1C_event_toad_message.m64": [208,{"us":[8169712], "banks": [32]}], +"sound/sequences/us/1D_event_peach_message.m64": [432,{"us":[8169920], "banks": [30]}], +"sound/sequences/us/1E_cutscene_intro.m64": [1764,{"us":[8170352], "banks": [27]}], +"sound/sequences/us/1F_cutscene_victory.m64": [2058,{"us":[8172128], "banks": [26]}], +"sound/sequences/us/20_cutscene_ending.m64": [1882,{"us":[8174192], "banks": [35]}], +"sound/sequences/us/21_menu_file_select.m64": [781,{"us":[8176080], "banks": [36]}], +"sound/sequences/us/22_cutscene_lakitu.m64": [313,{"us":[8176864], "banks": [27]}], "sound/bank_sets.bset": [159, { "us": [8177185] }], "@sound_data": { "us": { - "bank_sets": [8177184, 160], "sound_ctl": [5748512, 97856], "sound_tbl": [5846368, 2216704] } diff --git a/sequences.json b/sequences.json new file mode 100644 index 0000000..13e7895 --- /dev/null +++ b/sequences.json @@ -0,0 +1,37 @@ +{ + "00_sound_player": ["00", "01_terrain", "02_water", "03", "04", "05", "06", "07", "08_mario", "09", "0A_mario_peach"], + "01_cutscene_collect_star": ["22"], + "02_menu_title_screen": ["11"], + "03_level_grass": ["22"], + "04_level_inside_castle": ["0E"], + "05_level_water": ["13"], + "06_level_hot": ["0F"], + "07_level_boss_koopa": ["12"], + "08_level_snow": ["0B"], + "09_level_slide": ["0D"], + "0A_level_spooky": ["10", "21"], + "0B_event_piranha_plant": ["14_piranha_music_box"], + "0C_level_underground": ["15"], + "0D_menu_star_select": ["16_course_start"], + "0E_event_powerup": ["17"], + "0F_event_metal_cap": ["18"], + "10_event_koopa_message": ["12"], + "11_level_koopa_road": ["19"], + "12_event_high_score": ["1F"], + "13_event_merry_go_round": ["21"], + "14_event_race": ["1A"], + "15_cutscene_star_spawn": ["0E"], + "16_event_boss": ["1B"], + "17_cutscene_collect_key": ["1A"], + "18_event_endless_stairs": ["1C_endless_stairs"], + "19_level_boss_koopa_final": ["1D_bowser_organ"], + "1A_cutscene_credits": ["25"], + "1B_event_solve_puzzle": ["14_piranha_music_box"], + "1C_event_toad_message": ["20"], + "1D_event_peach_message": ["1E"], + "1E_cutscene_intro": ["1B"], + "1F_cutscene_victory": ["1A"], + "20_cutscene_ending": ["23"], + "21_menu_file_select": ["24"], + "22_cutscene_lakitu": ["1B"] +} diff --git a/src/Companion.cpp b/src/Companion.cpp index 05a100c..df793be 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -23,8 +23,8 @@ static const std::unordered_map<std::string, RawFactory*> gFactories = { { ".aiff", new AudioFactory() }, { ".bnk", new AudioFactory() }, { ".bset", new AudioFactory() }, + { ".m64", new AudioFactory() }, { ".bin", new BlobFactory(LUS::ResourceType::Blob) }, - { ".m64", new BlobFactory(LUS::ResourceType::Blob) }, { ".sbox", new BlobFactory(LUS::ResourceType::Blob, true) }, }; diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index d72bda6..2316141 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -335,7 +335,6 @@ AdpcmLoop AudioManager::parse_loop(uint32_t addr, std::vector<uint8_t>& bankData int32_t count = reader.ReadInt32(); uint32_t pad = reader.ReadUInt32(); - std::cout << "Loop End: " << end << '\n'; if(count != 0){ state = std::vector<int16_t>(); for (size_t i = 0; i < 16; ++i) { @@ -433,6 +432,7 @@ TBLFile AudioManager::parse_tbl(std::vector<uint8_t>& data, std::vector<Entry>& void AudioManager::initialize(std::vector<uint8_t>& buffer) { auto assets = nlohmann::json::parse(std::ifstream( "assets.json" )); auto sound_data = assets["@sound_data"]["us"]; + auto sound_tbl = sound_data["sound_tbl"]; auto sound_ctl = sound_data["sound_ctl"]; @@ -661,4 +661,4 @@ uint32_t AudioManager::get_index(AudioBankSample* entry) { std::map<uint32_t, Bank> AudioManager::get_banks() { return this->banks; -} +}
\ No newline at end of file diff --git a/src/factories/AudioFactory.cpp b/src/factories/AudioFactory.cpp index a6c5364..bd91a20 100644 --- a/src/factories/AudioFactory.cpp +++ b/src/factories/AudioFactory.cpp @@ -33,10 +33,6 @@ bool AudioFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, std: WRITE_HEADER(LUS::ResourceType::Bank, 0); - if(path.find("sound/banks/us/20_bank") != std::string::npos){ - int bp = 0; - } - WRITE_U32(bank.insts.size()); for(auto &instrument : bank.insts){ WRITE_U8(instrument.valid); @@ -119,7 +115,29 @@ bool AudioFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, std: return true; } - if(metadata.size() < 2 || !metadata[1].contains("us")){ + if(path.find("sound/sequences") != std::string::npos){ + + if(!metadata[1].contains("us")){ + return false; + } + + WRITE_HEADER(LUS::ResourceType::Sequence, 0); + + size_t size = metadata[0]; + auto offsets = metadata[1]["us"]; + + std::vector<uint8_t> bank = metadata[1]["banks"]; + + WRITE_U32(bank.size()); + WRITE_ARRAY(bank.data(), bank.size()); + + WRITE_U32(size); + WRITE_ARRAY(buffer.data() + (size_t)offsets[0], size); + + return true; + } + + if(path.find("sound/samples") == std::string::npos || metadata.size() < 2 || !metadata[1].contains("us")){ return false; } @@ -132,14 +150,10 @@ bool AudioFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, std: write_aiff(aifcData, *writer); */ - WRITE_HEADER(LUS::ResourceType::Audio, 0); + WRITE_HEADER(LUS::ResourceType::Sample, 0); AudioBankSample entry = AudioManager::Instance->get_aifc(metadata[1]["us"][1]); - if(path.find("00_mario_waaaooow") != std::string::npos){ - int bp = 0; - } - // Write AdpcmLoop WRITE_U32(entry.loop.start); WRITE_U32(entry.loop.end); diff --git a/src/factories/ResourceType.h b/src/factories/ResourceType.h index ee8a9f6..7dfac06 100644 --- a/src/factories/ResourceType.h +++ b/src/factories/ResourceType.h @@ -20,6 +20,7 @@ enum class ResourceType { Skybox = 0x534B5942, // SKYB Anim = 0x414E494D, // ANIM Bank = 0x42414E4B, // BANK - Audio = 0x41554643, // AIFC + Sample = 0x41554643, // AIFC + Sequence = 0x53455143, // SEQC }; } // namespace LUS diff --git a/tools/gen_bankset.js b/tools/gen_bankset.js new file mode 100644 index 0000000..4b07141 --- /dev/null +++ b/tools/gen_bankset.js @@ -0,0 +1,23 @@ +const fs = require('fs'); +const data = require('../sequences.json'); + +const header = [ + '#pragma once', + '', +] +const bankset = [] + +async function main(){ + // header.push('static const uint8_t gBankIdxMap[][16] = {'); + let idx = 0; + for(const values of Object.values(data)){ + const indices = values.map(v => `${parseInt(v.split('_')[0], 16)}`); + // header.push(` // Bank: ${Object.keys(data)[idx++]}`); + header.push(`[${indices.join(', ')}],`); + } + // header.push('};\n'); + + fs.writeFileSync('./bankset_table.h', header.join('\n')); +} + +main();
\ No newline at end of file |
