#pragma once #include "ZResource.h" #include "tinyxml2.h" struct AdsrEnvelope { int16_t delay; int16_t arg; }; struct AdpcmBook { /* 0x00 */ int32_t order; /* 0x04 */ int32_t npredictors; /* 0x08 */ std::vector books; // size 8 * order * npredictors. 8-byte aligned }; struct AdpcmLoop { /* 0x00 */ uint32_t start; /* 0x04 */ uint32_t end; /* 0x08 */ uint32_t count; /* 0x10 */ std::vector states; }; struct SampleEntry { std::string fileName; uint8_t bankId; uint32_t sampleDataOffset; uint32_t sampleLoopOffset = 0xFFFFFFFF; uint8_t codec; uint8_t medium; uint8_t unk_bit26; uint8_t unk_bit25; std::vector data; AdpcmLoop loop; AdpcmBook book; }; struct SoundFontEntry { SampleEntry* sampleEntry = nullptr; float tuning; }; struct DrumEntry { uint8_t releaseRate; uint8_t pan; uint8_t loaded; uint32_t offset; float tuning; std::vector env; SampleEntry* sample = nullptr; }; struct InstrumentEntry { bool isValidInstrument; uint8_t loaded; uint8_t normalRangeLo; uint8_t normalRangeHi; uint8_t releaseRate; std::vector env; SoundFontEntry* lowNotesSound = nullptr; SoundFontEntry* normalNotesSound = nullptr; SoundFontEntry* highNotesSound = nullptr; }; struct AudioTableEntry { uint32_t ptr; uint32_t size; uint8_t medium; uint8_t cachePolicy; uint16_t data1; uint16_t data2; uint16_t data3; std::vector drums; std::vector soundEffects; std::vector instruments; }; class ZAudio : public ZResource { public: std::vector soundFontTable; std::vector sequenceTable; std::vector sampleBankTable; std::vector> sequences; std::map samples; std::vector> fontIndices; 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; ZAudio(ZFile* nParent); void ParseXML(tinyxml2::XMLElement* reader) override; void DecodeADPCMSample(SampleEntry* sample); std::vector ParseEnvelopeData(std::vector audioBank, std::vector audioTable, int envelopeOffset, int baseOffset); SoundFontEntry* ParseSoundFontEntry(std::vector audioBank, std::vector audioTable, AudioTableEntry audioSampleBankEntry, int bankIndex, int soundFontOffset, int baseOffset); SampleEntry* ParseSampleEntry(std::vector audioBank, 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); void ParseRawData() override; std::string GetSourceTypeName() const override; ZResourceType GetResourceType() const override; size_t GetRawDataSize() const override; };