From 713c5236d87b449511a30a9c2c2facbc15d49af3 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Wed, 1 Jun 2022 13:06:32 -0400 Subject: Audio decompiled and WIP custom sample support --- ZAPD/ZAudio.cpp | 325 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 325 insertions(+) create mode 100644 ZAPD/ZAudio.cpp (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp new file mode 100644 index 0000000..1c24c82 --- /dev/null +++ b/ZAPD/ZAudio.cpp @@ -0,0 +1,325 @@ +#include "ZAudio.h" + +#include "Globals.h" +#include "Utils/BitConverter.h" +#include "Utils/File.h" +#include "Utils/Path.h" +#include "Utils/StringHelper.h" +#include "ZFile.h" + +REGISTER_ZFILENODE(Audio, ZAudio); + +ZAudio::ZAudio(ZFile* nParent) : ZResource(nParent) +{ + //RegisterRequiredAttribute("CodeOffset"); + //RegisterOptionalAttribute("LangOffset", "0"); +} + +void ZAudio::DecodeADPCMSample(SampleEntry* sample) +{ + int16_t buffer[1024 * 128]; + + int16_t* out = &buffer[0]; +} + +std::vector ZAudio::ParseEnvelopeData(std::vector audioBank, std::vector audioTable, int envelopeOffset, int baseOffset) +{ + std::vector result; + + //bool process = true; + + //for (int i = 0; i < 4; i++) + while (true) + { + AdsrEnvelope* env = new AdsrEnvelope(); + + env->delay = BitConverter::ToInt16BE(audioBank, envelopeOffset + 0); + env->arg = BitConverter::ToInt16BE(audioBank, envelopeOffset + 2); + + envelopeOffset += 4; + + result.push_back(env); + + if (env->delay < 0) + break; + } + + return result; +} + +SoundFontEntry* ZAudio::ParseSoundFontEntry(std::vector audioBank, + std::vector audioTable, + AudioTableEntry audioSampleBankEntry, + int soundFontOffset, + int baseOffset) +{ + SoundFontEntry* soundFont = new SoundFontEntry(); + soundFont->sampleEntry = ParseSampleEntry( + audioBank, audioTable, audioSampleBankEntry, + BitConverter::ToInt32BE(audioBank, soundFontOffset + 0) + baseOffset, baseOffset); + soundFont->tuning = BitConverter::ToFloatBE(audioBank, soundFontOffset + 4); + + return soundFont; +} + +SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, + std::vector audioTable, + AudioTableEntry audioSampleBankEntry, + int sampleOffset, + int baseOffset) +{ + int sampleDataOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 4) + audioSampleBankEntry.ptr; + + if (samples.find(sampleOffset) == samples.end()) + { + SampleEntry* sample = new SampleEntry(); + + int sampleSize = BitConverter::ToInt32BE(audioBank, sampleOffset + 0) & 0x00FFFFFF; + int loopOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 8) + baseOffset; + int bookOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 12) + baseOffset; + + char* sampleData = (char*)malloc(sampleSize); + memcpy(sampleData, audioTable.data() + sampleDataOffset, sampleSize); + sample->data = std::vector(sampleSize); + memcpy(sample->data.data(), sampleData, sampleSize); + + uint32_t origField = (BitConverter::ToUInt32BE(audioBank, sampleOffset + 0)); + sample->codec = (origField >> 28) & 0x0F; + sample->medium = (origField >> 24) & 0x03; + sample->unk_bit26 = (origField >> 22) & 0x01; + sample->unk_bit25 = (origField >> 21) & 0x01; + + sample->loop.start = BitConverter::ToInt32BE(audioBank, loopOffset + 0); + sample->loop.end = BitConverter::ToInt32BE(audioBank, loopOffset + 4); + sample->loop.count = BitConverter::ToInt32BE(audioBank, loopOffset + 8); + + if (sample->loop.count != 0xFFFFFFFF) + { + for (int i = 0; i < sample->loop.count; i++) + { + int16_t state = BitConverter::ToInt16BE(sample->data, loopOffset + 16 + (i * 2)); + sample->loop.states.push_back(state); + } + } + + sample->book.order = BitConverter::ToInt32BE(audioBank, bookOffset + 0); + sample->book.npredictors = BitConverter::ToInt32BE(audioBank, bookOffset + 4); + + for (int i = 0; i < sample->book.npredictors * sample->book.order * 8; i++) + { + sample->book.books.push_back( + BitConverter::ToInt16BE(audioBank, bookOffset + 8 + (i * 2))); + } + + samples[sampleOffset] = sample; + + return sample; + } + else + { + return samples[sampleOffset]; + } +} + +std::vector ZAudio::ParseAudioTable(std::vector codeData, int baseOffset) +{ + std::vector entries; + + int numEntries = BitConverter::ToInt16BE(codeData, baseOffset + 0); + int romAddr = BitConverter::ToInt16BE(codeData, baseOffset + 4); + + int currentOffset = baseOffset + 16; + + for (int i = 0; i < numEntries; i++) + { + AudioTableEntry entry; + + entry.ptr = BitConverter::ToInt32BE(codeData, currentOffset + 0); + entry.size = BitConverter::ToInt32BE(codeData, currentOffset + 4); + entry.medium = codeData[currentOffset + 8]; + entry.cachePolicy = codeData[currentOffset + 9]; + entry.data1 = BitConverter::ToInt16BE(codeData, currentOffset + 10); + entry.data2 = BitConverter::ToInt16BE(codeData, currentOffset + 12); + entry.data3 = BitConverter::ToInt16BE(codeData, currentOffset + 14); + + entries.push_back(entry); + + currentOffset += 16; + } + + return entries; +} + +void ZAudio::ParseSoundFont(std::vector codeData, std::vector audioTable, + std::vector audioSampleBank, + AudioTableEntry& entry) +{ + int ptr = entry.ptr; + int size = entry.size; + int sampleBankId1 = (entry.data1 >> 8) & 0xFF; + int sampleBankId2 = (entry.data1) & 0xFF; + int numInstruments = (entry.data2 >> 8) & 0xFF; + int numDrums = entry.data2 & 0xFF; + int numSfx = entry.data3; + + int currentOffset = BitConverter::ToInt32BE(codeData, ptr) + ptr; + for (int i = 0; i < numDrums; i++) + { + DrumEntry drum; + + int samplePtr = BitConverter::ToInt32BE(codeData, currentOffset); + + if (samplePtr != 0) + { + samplePtr += ptr; + + drum.sample = ParseSampleEntry(codeData, audioTable, audioSampleBank[sampleBankId1], + BitConverter::ToInt32BE(codeData, samplePtr + 4) + ptr, ptr); + + drum.releaseRate = codeData[samplePtr + 0]; + drum.pan = codeData[samplePtr + 1]; + drum.loaded = codeData[samplePtr + 2]; + drum.tuning = BitConverter::ToFloatBE(codeData, samplePtr + 8); + + //int sampleDefOffset = BitConverter::ToInt32BE(codeData, samplePtr + 4); + drum.env = ParseEnvelopeData(codeData, audioTable, BitConverter::ToInt32BE(codeData, samplePtr + 12) + ptr, ptr); + } + + entry.drums.push_back(drum); + + currentOffset += 4; + } + + currentOffset = BitConverter::ToInt32BE(codeData, ptr + 4) + ptr; + for (int i = 0; i < numSfx; i++) + { + SoundFontEntry* sfx; + sfx = ParseSoundFontEntry(codeData, audioTable, audioSampleBank[sampleBankId1], + currentOffset, ptr); + entry.soundEffects.push_back(sfx); + + currentOffset += 8; + } + + for (int i = 0; i < numInstruments; i++) + { + InstrumentEntry instrument; + + currentOffset = BitConverter::ToInt32BE(codeData, ptr + 8 + (i * 4)); + + instrument.isValidInstrument = currentOffset != 0; + + if (currentOffset != 0) + { + currentOffset += ptr; + + instrument.loaded = codeData[currentOffset + 0]; + instrument.normalRangeLo = codeData[currentOffset + 1]; + instrument.normalRangeHi = codeData[currentOffset + 2]; + instrument.releaseRate = codeData[currentOffset + 3]; + instrument.env = ParseEnvelopeData(codeData, audioTable, BitConverter::ToInt32BE(codeData, currentOffset + 4) + ptr, ptr); + + if (BitConverter::ToInt32BE(codeData, currentOffset + 8) != 0) + instrument.lowNotesSound = ParseSoundFontEntry( + codeData, audioTable, audioSampleBank[sampleBankId1], currentOffset + 8, ptr); + + if (BitConverter::ToInt32BE(codeData, currentOffset + 16) != 0) + instrument.normalNotesSound = ParseSoundFontEntry( + codeData, audioTable, audioSampleBank[sampleBankId1], currentOffset + 16, ptr); + + if (BitConverter::ToInt32BE(codeData, currentOffset + 24) != 0 && + instrument.normalRangeHi != 0x7F) + instrument.highNotesSound = ParseSoundFontEntry( + codeData, audioTable, audioSampleBank[sampleBankId1], currentOffset + 24, ptr); + } + + entry.instruments.push_back(instrument); + } +} + +void ZAudio::ParseRawData() +{ + ZResource::ParseRawData(); + + std::vector codeData; + std::vector audioTableData; + std::vector audioBankData; + std::vector audioSeqData; + + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + codeData = Globals::Instance->GetBaseromFile("code"); + else + codeData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "code"); + + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + audioTableData = Globals::Instance->GetBaseromFile("Audiotable"); + else + audioTableData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audiotable"); + + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + audioBankData = Globals::Instance->GetBaseromFile("Audiobank"); + else + audioBankData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audiobank"); + + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + audioSeqData = Globals::Instance->GetBaseromFile("Audioseq"); + else + audioSeqData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + + "Audioseq"); + + // TABLE PARSING + //int gSoundFontTableOffset = 0x138270; // OTRTODO: Make this an XML Param + //int gSequenceTableOffset = 0x1386A0; // OTRTODO: Make this an XML Param + //int gSampleBankTableOffset = 0x138D90; // OTRTODO: Make this an XML Param + int gSoundFontTableOffset = 0x138290; // OTRTODO: Make this an XML Param + int gSequenceTableOffset = 0x1386C0; // OTRTODO: Make this an XML Param + int gSampleBankTableOffset = 0x138DB0; // OTRTODO: Make this an XML Param + soundFontTable = ParseAudioTable(codeData, gSoundFontTableOffset); + sequenceTable = ParseAudioTable(codeData, gSequenceTableOffset); + sampleBankTable = ParseAudioTable(codeData, gSampleBankTableOffset); + // int gSequenceFontTableOffset = 0x1384E0; // OTRTODO: Make this an XML Param + + + // SAMPLE/FONT PARSING + for (int i = 0; i < soundFontTable.size(); i++) + { + ParseSoundFont(audioBankData, audioTableData, sampleBankTable, soundFontTable[i]); + } + + + // SOUNDBANK PARSING + /*for (int i = 0; i < sampleBankTable.size(); i++) + { + + }*/ + + // SEQUENCE PARSING + for (int i = 0; i < sequenceTable.size(); i++) + { + int seqDestIdx = i; + + if (sequenceTable[i].size == 0) + seqDestIdx = sequenceTable[i].ptr; + + std::vector seqVec = std::vector(sequenceTable[seqDestIdx].size); + memcpy(seqVec.data(), audioSeqData.data() + sequenceTable[seqDestIdx].ptr, + sequenceTable[seqDestIdx].size); + + sequences.push_back(seqVec); + } +} + +std::string ZAudio::GetSourceTypeName() const +{ + return "u8"; +} + +size_t ZAudio::GetRawDataSize() const +{ + return 1; +} + +ZResourceType ZAudio::GetResourceType() const +{ + return ZResourceType::Audio; +} -- cgit v1.2.3 From 9a3f129f05e838c6413497140db4e83e4270fb3a Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Fri, 10 Jun 2022 13:37:50 -0400 Subject: Audio support nearly complete. --- ZAPD/ZAudio.cpp | 125 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 101 insertions(+), 24 deletions(-) (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index 1c24c82..63443de 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -13,6 +13,54 @@ ZAudio::ZAudio(ZFile* nParent) : ZResource(nParent) { //RegisterRequiredAttribute("CodeOffset"); //RegisterOptionalAttribute("LangOffset", "0"); + +} + +void ZAudio::ParseXML(tinyxml2::XMLElement* reader) +{ + ZResource::ParseXML(reader); + + auto t = reader->Name(); + + auto child = reader->FirstChildElement(); + + while (child != nullptr) + { + int bp = 0; + if (std::string(child->Value()) == "Sequences") + { + auto seqChild = child->FirstChildElement(); + + while (seqChild != nullptr) + { + if (std::string(seqChild->Value()) == "Sequence") + { + seqNames.push_back(seqChild->Attribute("Name")); + } + + seqChild = seqChild->NextSiblingElement(); + } + } + + if (std::string(child->Value()) == "Samples") + { + int bankId = child->IntAttribute("Bank", 0); + auto sampChild = child->FirstChildElement(); + + while (sampChild != nullptr) + { + if (std::string(sampChild->Value()) == "Sample") + { + auto atStr = sampChild->FirstChildElement()->Attribute("At"); + sampleOffsets[bankId][StringHelper::StrToL(atStr, 16)] = sampChild->Attribute("Name"); + } + + sampChild = sampChild->NextSiblingElement(); + } + } + + child = child->NextSiblingElement(); + } } void ZAudio::DecodeADPCMSample(SampleEntry* sample) @@ -26,9 +74,6 @@ std::vector ZAudio::ParseEnvelopeData(std::vector audioB { std::vector result; - //bool process = true; - - //for (int i = 0; i < 4; i++) while (true) { AdsrEnvelope* env = new AdsrEnvelope(); @@ -49,13 +94,13 @@ std::vector ZAudio::ParseEnvelopeData(std::vector audioB SoundFontEntry* ZAudio::ParseSoundFontEntry(std::vector audioBank, std::vector audioTable, - AudioTableEntry audioSampleBankEntry, + AudioTableEntry audioSampleBankEntry, int bankIndex, int soundFontOffset, int baseOffset) { SoundFontEntry* soundFont = new SoundFontEntry(); soundFont->sampleEntry = ParseSampleEntry( - audioBank, audioTable, audioSampleBankEntry, + audioBank, audioTable, audioSampleBankEntry, bankIndex, BitConverter::ToInt32BE(audioBank, soundFontOffset + 0) + baseOffset, baseOffset); soundFont->tuning = BitConverter::ToFloatBE(audioBank, soundFontOffset + 4); @@ -64,7 +109,7 @@ SoundFontEntry* ZAudio::ParseSoundFontEntry(std::vector audioBank, SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, std::vector audioTable, - AudioTableEntry audioSampleBankEntry, + AudioTableEntry audioSampleBankEntry, int bankIndex, int sampleOffset, int baseOffset) { @@ -74,6 +119,8 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, { SampleEntry* sample = new SampleEntry(); + sample->bankId = bankIndex; + int sampleSize = BitConverter::ToInt32BE(audioBank, sampleOffset + 0) & 0x00FFFFFF; int loopOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 8) + baseOffset; int bookOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 12) + baseOffset; @@ -111,6 +158,9 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, BitConverter::ToInt16BE(audioBank, bookOffset + 8 + (i * 2))); } + sample->sampleDataOffset = sampleDataOffset; + sample->fileName = StringHelper::Sprintf("audio/samples/sample_%08X", sampleOffset); + samples[sampleOffset] = sample; return sample; @@ -173,15 +223,13 @@ void ZAudio::ParseSoundFont(std::vector codeData, std::vector { samplePtr += ptr; - drum.sample = ParseSampleEntry(codeData, audioTable, audioSampleBank[sampleBankId1], + drum.sample = ParseSampleEntry(codeData, audioTable, audioSampleBank[sampleBankId1], sampleBankId1, BitConverter::ToInt32BE(codeData, samplePtr + 4) + ptr, ptr); drum.releaseRate = codeData[samplePtr + 0]; drum.pan = codeData[samplePtr + 1]; drum.loaded = codeData[samplePtr + 2]; drum.tuning = BitConverter::ToFloatBE(codeData, samplePtr + 8); - - //int sampleDefOffset = BitConverter::ToInt32BE(codeData, samplePtr + 4); drum.env = ParseEnvelopeData(codeData, audioTable, BitConverter::ToInt32BE(codeData, samplePtr + 12) + ptr, ptr); } @@ -194,7 +242,7 @@ void ZAudio::ParseSoundFont(std::vector codeData, std::vector for (int i = 0; i < numSfx; i++) { SoundFontEntry* sfx; - sfx = ParseSoundFontEntry(codeData, audioTable, audioSampleBank[sampleBankId1], + sfx = ParseSoundFontEntry(codeData, audioTable, audioSampleBank[sampleBankId1], sampleBankId1, currentOffset, ptr); entry.soundEffects.push_back(sfx); @@ -221,16 +269,16 @@ void ZAudio::ParseSoundFont(std::vector codeData, std::vector if (BitConverter::ToInt32BE(codeData, currentOffset + 8) != 0) instrument.lowNotesSound = ParseSoundFontEntry( - codeData, audioTable, audioSampleBank[sampleBankId1], currentOffset + 8, ptr); + codeData, audioTable, audioSampleBank[sampleBankId1], sampleBankId1, currentOffset + 8, ptr); if (BitConverter::ToInt32BE(codeData, currentOffset + 16) != 0) instrument.normalNotesSound = ParseSoundFontEntry( - codeData, audioTable, audioSampleBank[sampleBankId1], currentOffset + 16, ptr); + codeData, audioTable, audioSampleBank[sampleBankId1], sampleBankId1, currentOffset + 16, ptr); if (BitConverter::ToInt32BE(codeData, currentOffset + 24) != 0 && instrument.normalRangeHi != 0x7F) instrument.highNotesSound = ParseSoundFontEntry( - codeData, audioTable, audioSampleBank[sampleBankId1], currentOffset + 24, ptr); + codeData, audioTable, audioSampleBank[sampleBankId1], sampleBankId1, currentOffset + 24, ptr); } entry.instruments.push_back(instrument); @@ -251,33 +299,69 @@ void ZAudio::ParseRawData() else codeData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "code"); + codeData = File::ReadAllBytes("baserom/code_ntsc"); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) audioTableData = Globals::Instance->GetBaseromFile("Audiotable"); else audioTableData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audiotable"); + audioTableData = File::ReadAllBytes("baserom/Audiotable_ntsc"); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) audioBankData = Globals::Instance->GetBaseromFile("Audiobank"); else audioBankData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audiobank"); + audioBankData = File::ReadAllBytes("baserom/Audiobank_ntsc"); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) audioSeqData = Globals::Instance->GetBaseromFile("Audioseq"); else audioSeqData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audioseq"); + audioSeqData = File::ReadAllBytes("baserom/Audioseq_ntsc"); + // TABLE PARSING + + // GC PAL //int gSoundFontTableOffset = 0x138270; // OTRTODO: Make this an XML Param //int gSequenceTableOffset = 0x1386A0; // OTRTODO: Make this an XML Param //int gSampleBankTableOffset = 0x138D90; // OTRTODO: Make this an XML Param - int gSoundFontTableOffset = 0x138290; // OTRTODO: Make this an XML Param - int gSequenceTableOffset = 0x1386C0; // OTRTODO: Make this an XML Param - int gSampleBankTableOffset = 0x138DB0; // OTRTODO: Make this an XML Param + // int gSequenceFontTableOffset = 0x1384E0; // OTRTODO: Make this an XML Param + + // NMQ DBG ROM + //int gSoundFontTableOffset = 0x138290; // OTRTODO: Make this an XML Param + //int gSequenceTableOffset = 0x1386C0; // OTRTODO: Make this an XML Param + //int gSampleBankTableOffset = 0x138DB0; // OTRTODO: Make this an XML Param + //int gSequenceFontTableOffset = 0x138500; // OTRTODO: Make this an XML Param + + // NTSC 1.0 + int gSoundFontTableOffset = 0x1026A0; // OTRTODO: Make this an XML Param + int gSequenceTableOffset = 0x102AD0; // OTRTODO: Make this an XML Param + int gSampleBankTableOffset = 0x1031C0; // OTRTODO: Make this an XML Param + int gSequenceFontTableOffset = 0x102910; // OTRTODO: Make this an XML Param + soundFontTable = ParseAudioTable(codeData, gSoundFontTableOffset); sequenceTable = ParseAudioTable(codeData, gSequenceTableOffset); sampleBankTable = ParseAudioTable(codeData, gSampleBankTableOffset); - // int gSequenceFontTableOffset = 0x1384E0; // OTRTODO: Make this an XML Param + + // SEQEUNCE FONT TABLE PARSING + for (int i = 0; i < sequenceTable.size(); i++) + { + uint16_t idx = BitConverter::ToUInt16BE(codeData, gSequenceFontTableOffset + (i * 2)); + uint8_t numFonts = codeData[gSequenceFontTableOffset + (idx++)]; + std::vector fontIds; + + for (int j = 0; j < numFonts; j++) + { + uint8_t fontId = codeData[gSequenceFontTableOffset + (idx++)]; + fontIds.push_back(fontId); + } + + fontIndices.push_back(fontIds); + } // SAMPLE/FONT PARSING @@ -286,13 +370,6 @@ void ZAudio::ParseRawData() ParseSoundFont(audioBankData, audioTableData, sampleBankTable, soundFontTable[i]); } - - // SOUNDBANK PARSING - /*for (int i = 0; i < sampleBankTable.size(); i++) - { - - }*/ - // SEQUENCE PARSING for (int i = 0; i < sequenceTable.size(); i++) { -- cgit v1.2.3 From 51045e30e240ffb41f089e609860a8e9b81f1d82 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Fri, 10 Jun 2022 13:50:16 -0400 Subject: Commented out NTSC test --- ZAPD/ZAudio.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index 63443de..d0df11f 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -299,21 +299,16 @@ void ZAudio::ParseRawData() else codeData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "code"); - codeData = File::ReadAllBytes("baserom/code_ntsc"); - if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) audioTableData = Globals::Instance->GetBaseromFile("Audiotable"); else audioTableData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audiotable"); - audioTableData = File::ReadAllBytes("baserom/Audiotable_ntsc"); - if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) audioBankData = Globals::Instance->GetBaseromFile("Audiobank"); else audioBankData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audiobank"); - audioBankData = File::ReadAllBytes("baserom/Audiobank_ntsc"); if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) audioSeqData = Globals::Instance->GetBaseromFile("Audioseq"); @@ -321,7 +316,10 @@ void ZAudio::ParseRawData() audioSeqData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audioseq"); - audioSeqData = File::ReadAllBytes("baserom/Audioseq_ntsc"); + //codeData = File::ReadAllBytes("baserom/code_ntsc"); + //audioTableData = File::ReadAllBytes("baserom/Audiotable_ntsc"); + //audioSeqData = File::ReadAllBytes("baserom/Audioseq_ntsc"); + //audioBankData = File::ReadAllBytes("baserom/Audiobank_ntsc"); // TABLE PARSING -- cgit v1.2.3 From 5904c4b6b5600c822e83c98e1eb83f5c7b944044 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Fri, 10 Jun 2022 13:53:03 -0400 Subject: Commented out additional test code --- ZAPD/ZAudio.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index d0df11f..8dd9857 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -327,19 +327,19 @@ void ZAudio::ParseRawData() //int gSoundFontTableOffset = 0x138270; // OTRTODO: Make this an XML Param //int gSequenceTableOffset = 0x1386A0; // OTRTODO: Make this an XML Param //int gSampleBankTableOffset = 0x138D90; // OTRTODO: Make this an XML Param - // int gSequenceFontTableOffset = 0x1384E0; // OTRTODO: Make this an XML Param + //int gSequenceFontTableOffset = 0x1384E0; // OTRTODO: Make this an XML Param // NMQ DBG ROM - //int gSoundFontTableOffset = 0x138290; // OTRTODO: Make this an XML Param - //int gSequenceTableOffset = 0x1386C0; // OTRTODO: Make this an XML Param - //int gSampleBankTableOffset = 0x138DB0; // OTRTODO: Make this an XML Param - //int gSequenceFontTableOffset = 0x138500; // OTRTODO: Make this an XML Param + int gSoundFontTableOffset = 0x138290; // OTRTODO: Make this an XML Param + int gSequenceTableOffset = 0x1386C0; // OTRTODO: Make this an XML Param + int gSampleBankTableOffset = 0x138DB0; // OTRTODO: Make this an XML Param + int gSequenceFontTableOffset = 0x138500; // OTRTODO: Make this an XML Param // NTSC 1.0 - int gSoundFontTableOffset = 0x1026A0; // OTRTODO: Make this an XML Param - int gSequenceTableOffset = 0x102AD0; // OTRTODO: Make this an XML Param - int gSampleBankTableOffset = 0x1031C0; // OTRTODO: Make this an XML Param - int gSequenceFontTableOffset = 0x102910; // OTRTODO: Make this an XML Param + //int gSoundFontTableOffset = 0x1026A0; // OTRTODO: Make this an XML Param + //int gSequenceTableOffset = 0x102AD0; // OTRTODO: Make this an XML Param + //int gSampleBankTableOffset = 0x1031C0; // OTRTODO: Make this an XML Param + //int gSequenceFontTableOffset = 0x102910; // OTRTODO: Make this an XML Param soundFontTable = ParseAudioTable(codeData, gSoundFontTableOffset); sequenceTable = ParseAudioTable(codeData, gSequenceTableOffset); -- cgit v1.2.3 From 07ccfce53da803a9e588ba695e07df267d383c36 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Mon, 13 Jun 2022 21:54:25 -0400 Subject: Fixed last remaining audio bugs --- ZAPD/ZAudio.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index 8dd9857..9761335 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -26,7 +26,6 @@ void ZAudio::ParseXML(tinyxml2::XMLElement* reader) while (child != nullptr) { - int bp = 0; if (std::string(child->Value()) == "Sequences") { auto seqChild = child->FirstChildElement(); @@ -52,7 +51,17 @@ void ZAudio::ParseXML(tinyxml2::XMLElement* reader) if (std::string(sampChild->Value()) == "Sample") { auto atStr = sampChild->FirstChildElement()->Attribute("At"); - sampleOffsets[bankId][StringHelper::StrToL(atStr, 16)] = sampChild->Attribute("Name"); + auto loopStr = sampChild->FirstChildElement()->Attribute("LoopOffset"); + uint32_t loopOffset = 0xFFFFFFFF; + uint32_t atOffset = StringHelper::StrToL(atStr, 16); + + if (loopStr != NULL) + { + loopOffset = StringHelper::StrToL(loopStr, 16); + specialLoopSamples[loopOffset] = atOffset; + } + + sampleOffsets[bankId][loopOffset][atOffset] = sampChild->Attribute("Name"); } sampChild = sampChild->NextSiblingElement(); @@ -140,11 +149,20 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, sample->loop.end = BitConverter::ToInt32BE(audioBank, loopOffset + 4); sample->loop.count = BitConverter::ToInt32BE(audioBank, loopOffset + 8); - if (sample->loop.count != 0xFFFFFFFF) + if (sample->loop.start == 0x3ADB) + { + int bp = 0; + } + + if (/* sample->loop.count != 0xFFFFFFFF && */ sample->loop.count != 0) { - for (int i = 0; i < sample->loop.count; i++) + //for (int i = 0; i < sample->loop.count; i++) + for (int i = 0; i < 16; i++) { - int16_t state = BitConverter::ToInt16BE(sample->data, loopOffset + 16 + (i * 2)); + //if ((loopOffset + 16 + (i * 2)) >= audioBank.size()) + //break; + + int16_t state = BitConverter::ToInt16BE(audioBank, loopOffset + 16 + (i * 2)); sample->loop.states.push_back(state); } } @@ -159,6 +177,10 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, } sample->sampleDataOffset = sampleDataOffset; + + if (specialLoopSamples.find(loopOffset) != specialLoopSamples.end()) + sample->sampleLoopOffset = loopOffset; + sample->fileName = StringHelper::Sprintf("audio/samples/sample_%08X", sampleOffset); samples[sampleOffset] = sample; -- cgit v1.2.3 From 30d68bc01e54ac3d2deb0c5f1a17be59ec22e932 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Tue, 14 Jun 2022 00:59:31 -0400 Subject: Added names for the soundfonts. --- ZAPD/ZAudio.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index 9761335..a502a05 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -68,6 +68,13 @@ void ZAudio::ParseXML(tinyxml2::XMLElement* reader) } } + if (std::string(child->Value()) == "Soundfont") + { + auto name = child->Attribute("Name"); + auto index = child->IntAttribute("Index", 0); + soundFontNames[index] = name; + } + child = child->NextSiblingElement(); } } @@ -154,14 +161,10 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, int bp = 0; } - if (/* sample->loop.count != 0xFFFFFFFF && */ sample->loop.count != 0) + if (sample->loop.count != 0) { - //for (int i = 0; i < sample->loop.count; i++) for (int i = 0; i < 16; i++) { - //if ((loopOffset + 16 + (i * 2)) >= audioBank.size()) - //break; - int16_t state = BitConverter::ToInt16BE(audioBank, loopOffset + 16 + (i * 2)); sample->loop.states.push_back(state); } -- cgit v1.2.3 From e65a9c7f27fd77663dd75f151bd322bf4d4e6932 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Tue, 14 Jun 2022 01:29:52 -0400 Subject: Added XML attributes and fixed odd crash --- ZAPD/ZAudio.cpp | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index a502a05..a8b0f1f 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -11,9 +11,10 @@ REGISTER_ZFILENODE(Audio, ZAudio); ZAudio::ZAudio(ZFile* nParent) : ZResource(nParent) { - //RegisterRequiredAttribute("CodeOffset"); - //RegisterOptionalAttribute("LangOffset", "0"); - + RegisterRequiredAttribute("SoundFontTableOffset"); + RegisterRequiredAttribute("SequenceTableOffset"); + RegisterRequiredAttribute("SampleBankTableOffset"); + RegisterRequiredAttribute("SequenceFontTableOffset"); } void ZAudio::ParseXML(tinyxml2::XMLElement* reader) @@ -156,11 +157,6 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, sample->loop.end = BitConverter::ToInt32BE(audioBank, loopOffset + 4); sample->loop.count = BitConverter::ToInt32BE(audioBank, loopOffset + 8); - if (sample->loop.start == 0x3ADB) - { - int bp = 0; - } - if (sample->loop.count != 0) { for (int i = 0; i < 16; i++) @@ -341,30 +337,30 @@ void ZAudio::ParseRawData() audioSeqData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "Audioseq"); - //codeData = File::ReadAllBytes("baserom/code_ntsc"); - //audioTableData = File::ReadAllBytes("baserom/Audiotable_ntsc"); - //audioSeqData = File::ReadAllBytes("baserom/Audioseq_ntsc"); - //audioBankData = File::ReadAllBytes("baserom/Audiobank_ntsc"); - // TABLE PARSING // GC PAL - //int gSoundFontTableOffset = 0x138270; // OTRTODO: Make this an XML Param - //int gSequenceTableOffset = 0x1386A0; // OTRTODO: Make this an XML Param - //int gSampleBankTableOffset = 0x138D90; // OTRTODO: Make this an XML Param - //int gSequenceFontTableOffset = 0x1384E0; // OTRTODO: Make this an XML Param + //int gSoundFontTableOffset = 0x138270; + //int gSequenceTableOffset = 0x1386A0; + //int gSampleBankTableOffset = 0x138D90; + //int gSequenceFontTableOffset = 0x1384E0; // NMQ DBG ROM - int gSoundFontTableOffset = 0x138290; // OTRTODO: Make this an XML Param - int gSequenceTableOffset = 0x1386C0; // OTRTODO: Make this an XML Param - int gSampleBankTableOffset = 0x138DB0; // OTRTODO: Make this an XML Param - int gSequenceFontTableOffset = 0x138500; // OTRTODO: Make this an XML Param + //int gSoundFontTableOffset = 0x138290; + //int gSequenceTableOffset = 0x1386C0; + //int gSampleBankTableOffset = 0x138DB0; + //int gSequenceFontTableOffset = 0x138500; // NTSC 1.0 - //int gSoundFontTableOffset = 0x1026A0; // OTRTODO: Make this an XML Param - //int gSequenceTableOffset = 0x102AD0; // OTRTODO: Make this an XML Param - //int gSampleBankTableOffset = 0x1031C0; // OTRTODO: Make this an XML Param - //int gSequenceFontTableOffset = 0x102910; // OTRTODO: Make this an XML Param + //int gSoundFontTableOffset = 0x1026A0; + //int gSequenceTableOffset = 0x102AD0; + //int gSampleBankTableOffset = 0x1031C0; + //int gSequenceFontTableOffset = 0x102910; + + int gSoundFontTableOffset = StringHelper::StrToL(registeredAttributes.at("SoundFontTableOffset").value, 16); + int gSequenceTableOffset = StringHelper::StrToL(registeredAttributes.at("SequenceTableOffset").value, 16); + int gSampleBankTableOffset = StringHelper::StrToL(registeredAttributes.at("SampleBankTableOffset").value, 16); + int gSequenceFontTableOffset = StringHelper::StrToL(registeredAttributes.at("SequenceFontTableOffset").value, 16); soundFontTable = ParseAudioTable(codeData, gSoundFontTableOffset); sequenceTable = ParseAudioTable(codeData, gSequenceTableOffset); -- cgit v1.2.3 From 7e5e9dc049372680c334497d64957aef555a2619 Mon Sep 17 00:00:00 2001 From: Nicholas Estelami Date: Tue, 14 Jun 2022 12:32:11 -0400 Subject: GC PAL Audio XML --- ZAPD/ZAudio.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'ZAPD/ZAudio.cpp') diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index a8b0f1f..2d92979 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -339,17 +339,11 @@ void ZAudio::ParseRawData() // TABLE PARSING - // GC PAL + // MQ DBG ROM //int gSoundFontTableOffset = 0x138270; //int gSequenceTableOffset = 0x1386A0; //int gSampleBankTableOffset = 0x138D90; //int gSequenceFontTableOffset = 0x1384E0; - - // NMQ DBG ROM - //int gSoundFontTableOffset = 0x138290; - //int gSequenceTableOffset = 0x1386C0; - //int gSampleBankTableOffset = 0x138DB0; - //int gSequenceFontTableOffset = 0x138500; // NTSC 1.0 //int gSoundFontTableOffset = 0x1026A0; -- cgit v1.2.3