summaryrefslogtreecommitdiff
path: root/ZAPD/ZAudio.h
diff options
context:
space:
mode:
authorbriaguya <70942617+briaguya-ai@users.noreply.github.com>2023-10-17 22:04:12 -0400
committerbriaguya <70942617+briaguya-ai@users.noreply.github.com>2023-10-17 22:04:12 -0400
commite9f4fc638ed904cc0dcdac24ea7708c9a220a702 (patch)
tree114c3d432697e04831741e623ae2340f6239bbe9 /ZAPD/ZAudio.h
parentdcf56d93ecbd4db3bfd8a4832d7f991467964b98 (diff)
update to latest version used by SoH
Diffstat (limited to 'ZAPD/ZAudio.h')
-rw-r--r--ZAPD/ZAudio.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/ZAPD/ZAudio.h b/ZAPD/ZAudio.h
new file mode 100644
index 0000000..286c75c
--- /dev/null
+++ b/ZAPD/ZAudio.h
@@ -0,0 +1,134 @@
+#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<int16_t> 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<int16_t> 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<uint8_t> 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<AdsrEnvelope*> env;
+ SampleEntry* sample = nullptr;
+};
+
+struct InstrumentEntry
+{
+ bool isValidInstrument;
+ uint8_t loaded;
+ uint8_t normalRangeLo;
+ uint8_t normalRangeHi;
+ uint8_t releaseRate;
+ std::vector<AdsrEnvelope*> 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<DrumEntry> drums;
+ std::vector<SoundFontEntry*> soundEffects;
+ std::vector<InstrumentEntry> instruments;
+};
+
+class ZAudio : public ZResource
+{
+public:
+ std::vector<AudioTableEntry> soundFontTable;
+ std::vector<AudioTableEntry> sequenceTable;
+ std::vector<AudioTableEntry> sampleBankTable;
+ std::vector<std::vector<char>> sequences;
+ std::map<uint32_t, SampleEntry*> samples;
+ std::vector<std::vector<uint32_t>> fontIndices;
+ std::vector<std::string> seqNames;
+ std::map<uint32_t, std::string> soundFontNames;
+
+ // First Key = Bank ID, Sec Key = LoopDataOffset, Third Key = Sample Data Offset
+ std::map<uint32_t, std::map<uint32_t, std::map<uint32_t, std::string>>> sampleOffsets;
+
+ // Key = Loop Offset, Value = Sample Offset
+ std::map<uint32_t, uint32_t> specialLoopSamples;
+
+ ZAudio(ZFile* nParent);
+
+ void ParseXML(tinyxml2::XMLElement* reader) override;
+
+ void DecodeADPCMSample(SampleEntry* sample);
+ std::vector<AdsrEnvelope*> ParseEnvelopeData(std::vector<uint8_t> audioBank, std::vector<uint8_t> audioTable,
+ int envelopeOffset, int baseOffset);
+
+ SoundFontEntry* ParseSoundFontEntry(std::vector<uint8_t> audioBank,
+ std::vector<uint8_t> audioTable,
+ AudioTableEntry audioSampleBankEntry, int bankIndex,
+ int soundFontOffset,
+ int baseOffset);
+
+ SampleEntry* ParseSampleEntry(std::vector<uint8_t> audioBank, std::vector<uint8_t> audioTable,
+ AudioTableEntry audioSampleBankEntry, int bankIndex,
+ int sampleOffset, int baseOffset);
+
+ std::vector<AudioTableEntry> ParseAudioTable(std::vector<uint8_t> codeData, int baseOffset);
+ void ParseSoundFont(std::vector<uint8_t> codeData, std::vector<uint8_t> audioTable,
+ std::vector<AudioTableEntry> audioSampleBank, AudioTableEntry& entry);
+
+ void ParseRawData() override;
+
+ std::string GetSourceTypeName() const override;
+ ZResourceType GetResourceType() const override;
+
+ size_t GetRawDataSize() const override;
+};