From 215d3c2713f0e2e050cc14695204a18e616f8040 Mon Sep 17 00:00:00 2001 From: louist103 <35883445+louist103@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:14:25 -0400 Subject: Fix sample exporting (#20) * fix how samples are exported * cleanups * forgot to re-add these --- ZAPD/ZAudio.cpp | 81 ++++++++++++++++++++++++++++----------------------------- ZAPD/ZAudio.h | 21 +++++++-------- 2 files changed, 49 insertions(+), 53 deletions(-) diff --git a/ZAPD/ZAudio.cpp b/ZAPD/ZAudio.cpp index a0d27d1..03c1efa 100644 --- a/ZAPD/ZAudio.cpp +++ b/ZAPD/ZAudio.cpp @@ -27,13 +27,13 @@ void ZAudio::ParseXML(tinyxml2::XMLElement* reader) while (child != nullptr) { - if (std::string(child->Value()) == "Sequences") + if (strcmp(child->Value(), "Sequences") == 0) { auto seqChild = child->FirstChildElement(); while (seqChild != nullptr) { - if (std::string(seqChild->Value()) == "Sequence") + if (strcmp(seqChild->Value(), "Sequence") == 0) { seqNames.push_back(seqChild->Attribute("Name")); } @@ -42,34 +42,25 @@ void ZAudio::ParseXML(tinyxml2::XMLElement* reader) } } - if (std::string(child->Value()) == "Samples") + if (strcmp(child->Value(), "Samples") == 0) { int bankId = child->IntAttribute("Bank", 0); auto sampChild = child->FirstChildElement(); while (sampChild != nullptr) { - if (std::string(sampChild->Value()) == "Sample") + if (strcmp(sampChild->Value(), "Sample") == 0) { - auto atStr = sampChild->FirstChildElement()->Attribute("At"); - 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"); + uint32_t atOffset = sampChild->UnsignedAttribute("Offset"); + + sampleOffsets[bankId][atOffset] = sampChild->Attribute("Name"); } sampChild = sampChild->NextSiblingElement(); } } - if (std::string(child->Value()) == "Soundfont") + if (strcmp(child->Value(), "Soundfont") == 0) { auto name = child->Attribute("Name"); auto index = child->IntAttribute("Index", 0); @@ -80,7 +71,7 @@ void ZAudio::ParseXML(tinyxml2::XMLElement* reader) } } -std::vector ZAudio::ParseEnvelopeData(std::vector audioBank, std::vector audioTable, int envelopeOffset, int baseOffset) +std::vector ZAudio::ParseEnvelopeData(const std::vector& audioBank, const std::vector& audioTable, int envelopeOffset, int baseOffset) { std::vector result; @@ -102,8 +93,8 @@ std::vector ZAudio::ParseEnvelopeData(std::vector audioB return result; } -SoundFontEntry* ZAudio::ParseSoundFontEntry(std::vector audioBank, - std::vector audioTable, +SoundFontEntry* ZAudio::ParseSoundFontEntry(const std::vector& audioBank, + const std::vector& audioTable, AudioTableEntry audioSampleBankEntry, int bankIndex, int soundFontOffset, int baseOffset) @@ -123,28 +114,26 @@ SoundFontEntry* ZAudio::ParseSoundFontEntry(std::vector audioBank, return soundFont; } -SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, - std::vector audioTable, +SampleEntry* ZAudio::ParseSampleEntry(const std::vector& audioBank, + const std::vector& audioTable, AudioTableEntry audioSampleBankEntry, int bankIndex, int sampleOffset, int baseOffset) { int sampleDataOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 4) + audioSampleBankEntry.ptr; + int sampleSize = BitConverter::ToInt32BE(audioBank, sampleOffset + 0) & 0x00FFFFFF; + int loopOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 8) + baseOffset; + int bookOffset = BitConverter::ToInt32BE(audioBank, sampleOffset + 12) + baseOffset; - if (samples.find(sampleOffset) == samples.end()) + if (samples.find(sampleDataOffset) == samples.end()) { 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; - char* sampleData = (char*)malloc(sampleSize); - memcpy(sampleData, audioTable.data() + sampleDataOffset, sampleSize); sample->data = std::vector(sampleSize); - memcpy(sample->data.data(), sampleData, sampleSize); + memcpy(sample->data.data(), audioTable.data() + sampleDataOffset, sampleSize); uint32_t origField = (BitConverter::ToUInt32BE(audioBank, sampleOffset + 0)); sample->codec = (origField >> 28) & 0x0F; @@ -160,6 +149,7 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, { for (int i = 0; i < 16; i++) { + // TODO can loop.states be an array of size 16? int16_t state = BitConverter::ToInt16BE(audioBank, loopOffset + 16 + (i * 2)); sample->loop.states.push_back(state); } @@ -168,7 +158,9 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, 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++) + int32_t numBooks = sample->book.npredictors * sample->book.order * 8; + sample->book.books.reserve(numBooks); + for (int i = 0; i < numBooks; i++) { sample->book.books.push_back( BitConverter::ToInt16BE(audioBank, bookOffset + 8 + (i * 2))); @@ -176,22 +168,22 @@ SampleEntry* ZAudio::ParseSampleEntry(std::vector audioBank, sample->sampleDataOffset = sampleDataOffset; - if (specialLoopSamples.find(loopOffset) != specialLoopSamples.end()) - sample->sampleLoopOffset = loopOffset; + sample->sampleLoopOffset = 0; + - sample->fileName = StringHelper::Sprintf("audio/samples/sample_%08X", sampleOffset); + sample->fileName = sampleOffsets[bankIndex][sampleDataOffset]; - samples[sampleOffset] = sample; + samples[sampleDataOffset] = sample; return sample; } else { - return samples[sampleOffset]; + return samples[sampleDataOffset]; } } -std::vector ZAudio::ParseAudioTable(std::vector codeData, int baseOffset) +std::vector ZAudio::ParseAudioTable(const std::vector& codeData, int baseOffset) { std::vector entries; @@ -199,7 +191,7 @@ std::vector ZAudio::ParseAudioTable(std::vector codeDa int romAddr = BitConverter::ToInt16BE(codeData, baseOffset + 4); int currentOffset = baseOffset + 16; - + entries.reserve(numEntries); for (int i = 0; i < numEntries; i++) { AudioTableEntry entry; @@ -220,8 +212,8 @@ std::vector ZAudio::ParseAudioTable(std::vector codeDa return entries; } -void ZAudio::ParseSoundFont(std::vector codeData, std::vector audioTable, - std::vector audioSampleBank, +void ZAudio::ParseSoundFont(const std::vector& codeData, const std::vector& audioTable, + const std::vector& audioSampleBank, AudioTableEntry& entry) { int ptr = entry.ptr; @@ -232,6 +224,10 @@ void ZAudio::ParseSoundFont(std::vector codeData, std::vector int numDrums = entry.data2 & 0xFF; int numSfx = entry.data3; + entry.drums.reserve(numDrums); + entry.soundEffects.reserve(numSfx); + entry.instruments.reserve(numInstruments); + int currentOffset = BitConverter::ToInt32BE(codeData, ptr) + ptr; for (int i = 0; i < numDrums; i++) { @@ -362,6 +358,9 @@ void ZAudio::ParseRawData() sequenceTable = ParseAudioTable(codeData, gSequenceTableOffset); sampleBankTable = ParseAudioTable(codeData, gSampleBankTableOffset); + fontIndices.reserve(sequenceTable.size()); + sequences.reserve(sequenceTable.size()); + // SEQEUNCE FONT TABLE PARSING for (int i = 0; i < sequenceTable.size(); i++) { @@ -380,9 +379,9 @@ void ZAudio::ParseRawData() // SAMPLE/FONT PARSING - for (int i = 0; i < soundFontTable.size(); i++) + for (auto& sft : soundFontTable) { - ParseSoundFont(audioBankData, audioTableData, sampleBankTable, soundFontTable[i]); + ParseSoundFont(audioBankData, audioTableData, sampleBankTable, sft); } // SEQUENCE PARSING diff --git a/ZAPD/ZAudio.h b/ZAPD/ZAudio.h index ddd4078..0c6c087 100644 --- a/ZAPD/ZAudio.h +++ b/ZAPD/ZAudio.h @@ -97,32 +97,29 @@ public: std::vector seqNames; std::map soundFontNames; - // First Key = Bank ID, Sec Key = LoopDataOffset, Third Key = Sample Data Offset - std::map>> sampleOffsets; - - // Key = Loop Offset, Value = Sample Offset - std::map specialLoopSamples; + // First Key = Bank ID, Sec Key = Sample Data Offset. + std::map> sampleOffsets; ZAudio(ZFile* nParent); void ParseXML(tinyxml2::XMLElement* reader) override; - std::vector ParseEnvelopeData(std::vector audioBank, std::vector audioTable, + std::vector ParseEnvelopeData(const std::vector& audioBank, const std::vector& audioTable, int envelopeOffset, int baseOffset); - SoundFontEntry* ParseSoundFontEntry(std::vector audioBank, - std::vector audioTable, + SoundFontEntry* ParseSoundFontEntry(const std::vector& audioBank, + const std::vector& audioTable, AudioTableEntry audioSampleBankEntry, int bankIndex, int soundFontOffset, int baseOffset); - SampleEntry* ParseSampleEntry(std::vector audioBank, std::vector audioTable, + SampleEntry* ParseSampleEntry(const std::vector& audioBank, const std::vector& audioTable, AudioTableEntry audioSampleBankEntry, int bankIndex, int sampleOffset, int baseOffset); - std::vector ParseAudioTable(std::vector codeData, int baseOffset); - void ParseSoundFont(std::vector codeData, std::vector audioTable, - std::vector audioSampleBank, AudioTableEntry& entry); + std::vector ParseAudioTable(const std::vector& codeData, int baseOffset); + void ParseSoundFont(const std::vector& codeData, const std::vector& audioTable, + const std::vector& audioSampleBank, AudioTableEntry& entry); void ParseRawData() override; -- cgit v1.2.3