summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2023-09-16 03:10:56 -0600
committerKiritoDv <kiritodev01@gmail.com>2023-09-16 03:10:56 -0600
commit98b6d598324fdcb499a2cc4d37a7a6fcd19e8ead (patch)
treee03627371fc7423c684631ed7eee68d697709e0f
parentfc7bf4c6ec1a637bb9eb240220533af856dc5a66 (diff)
Added support to extract banks on each sequence
-rw-r--r--assets.json71
-rw-r--r--sequences.json37
-rw-r--r--src/Companion.cpp2
-rw-r--r--src/audio/AudioManager.cpp4
-rw-r--r--src/factories/AudioFactory.cpp34
-rw-r--r--src/factories/ResourceType.h3
-rw-r--r--tools/gen_bankset.js23
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