summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouist103 <35883445+louist103@users.noreply.github.com>2024-10-04 21:14:25 -0400
committerGitHub <noreply@github.com>2024-10-04 21:14:25 -0400
commit215d3c2713f0e2e050cc14695204a18e616f8040 (patch)
tree2c2ba7fb552df0dcdac1983340f64e360f27294c
parentb002f28757a7ff9f928a4d9dd1834137edb144bb (diff)
Fix sample exporting (#20)
* fix how samples are exported * cleanups * forgot to re-add these
-rw-r--r--ZAPD/ZAudio.cpp81
-rw-r--r--ZAPD/ZAudio.h21
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<AdsrEnvelope*> ZAudio::ParseEnvelopeData(std::vector<uint8_t> audioBank, std::vector<uint8_t> audioTable, int envelopeOffset, int baseOffset)
+std::vector<AdsrEnvelope*> ZAudio::ParseEnvelopeData(const std::vector<uint8_t>& audioBank, const std::vector<uint8_t>& audioTable, int envelopeOffset, int baseOffset)
{
std::vector<AdsrEnvelope*> result;
@@ -102,8 +93,8 @@ std::vector<AdsrEnvelope*> ZAudio::ParseEnvelopeData(std::vector<uint8_t> audioB
return result;
}
-SoundFontEntry* ZAudio::ParseSoundFontEntry(std::vector<uint8_t> audioBank,
- std::vector<uint8_t> audioTable,
+SoundFontEntry* ZAudio::ParseSoundFontEntry(const std::vector<uint8_t>& audioBank,
+ const std::vector<uint8_t>& audioTable,
AudioTableEntry audioSampleBankEntry, int bankIndex,
int soundFontOffset,
int baseOffset)
@@ -123,28 +114,26 @@ SoundFontEntry* ZAudio::ParseSoundFontEntry(std::vector<uint8_t> audioBank,
return soundFont;
}
-SampleEntry* ZAudio::ParseSampleEntry(std::vector<uint8_t> audioBank,
- std::vector<uint8_t> audioTable,
+SampleEntry* ZAudio::ParseSampleEntry(const std::vector<uint8_t>& audioBank,
+ const std::vector<uint8_t>& 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<uint8_t>(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<uint8_t> 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<uint8_t> 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<uint8_t> 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<AudioTableEntry> ZAudio::ParseAudioTable(std::vector<uint8_t> codeData, int baseOffset)
+std::vector<AudioTableEntry> ZAudio::ParseAudioTable(const std::vector<uint8_t>& codeData, int baseOffset)
{
std::vector<AudioTableEntry> entries;
@@ -199,7 +191,7 @@ std::vector<AudioTableEntry> ZAudio::ParseAudioTable(std::vector<uint8_t> 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<AudioTableEntry> ZAudio::ParseAudioTable(std::vector<uint8_t> codeDa
return entries;
}
-void ZAudio::ParseSoundFont(std::vector<uint8_t> codeData, std::vector<uint8_t> audioTable,
- std::vector<AudioTableEntry> audioSampleBank,
+void ZAudio::ParseSoundFont(const std::vector<uint8_t>& codeData, const std::vector<uint8_t>& audioTable,
+ const std::vector<AudioTableEntry>& audioSampleBank,
AudioTableEntry& entry)
{
int ptr = entry.ptr;
@@ -232,6 +224,10 @@ void ZAudio::ParseSoundFont(std::vector<uint8_t> codeData, std::vector<uint8_t>
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<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;
+ // First Key = Bank ID, Sec Key = Sample Data Offset.
+ std::map<uint32_t, std::map<uint32_t, std::string>> sampleOffsets;
ZAudio(ZFile* nParent);
void ParseXML(tinyxml2::XMLElement* reader) override;
- std::vector<AdsrEnvelope*> ParseEnvelopeData(std::vector<uint8_t> audioBank, std::vector<uint8_t> audioTable,
+ std::vector<AdsrEnvelope*> ParseEnvelopeData(const std::vector<uint8_t>& audioBank, const std::vector<uint8_t>& audioTable,
int envelopeOffset, int baseOffset);
- SoundFontEntry* ParseSoundFontEntry(std::vector<uint8_t> audioBank,
- std::vector<uint8_t> audioTable,
+ SoundFontEntry* ParseSoundFontEntry(const std::vector<uint8_t>& audioBank,
+ const 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,
+ SampleEntry* ParseSampleEntry(const std::vector<uint8_t>& audioBank, const 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);
+ std::vector<AudioTableEntry> ParseAudioTable(const std::vector<uint8_t>& codeData, int baseOffset);
+ void ParseSoundFont(const std::vector<uint8_t>& codeData, const std::vector<uint8_t>& audioTable,
+ const std::vector<AudioTableEntry>& audioSampleBank, AudioTableEntry& entry);
void ParseRawData() override;