summaryrefslogtreecommitdiff
path: root/OTRExporter/AudioExporter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'OTRExporter/AudioExporter.cpp')
-rw-r--r--OTRExporter/AudioExporter.cpp174
1 files changed, 174 insertions, 0 deletions
diff --git a/OTRExporter/AudioExporter.cpp b/OTRExporter/AudioExporter.cpp
new file mode 100644
index 0000000..7fb0658
--- /dev/null
+++ b/OTRExporter/AudioExporter.cpp
@@ -0,0 +1,174 @@
+#include "AudioExporter.h"
+#include "Main.h"
+#include <Animation.h>
+#include <Utils/MemoryStream.h>
+#include <Globals.h>
+#include <Utils/File.h>
+#include "DisplayListExporter.h"
+
+void OTRExporter_Audio::WriteSampleEntryReference(SampleEntry* entry, std::map<uint32_t, SampleEntry*> samples, BinaryWriter* writer)
+{
+ writer->Write((uint8_t)(entry != nullptr ? 1 : 0));
+
+ uint32_t addr = 0;
+
+ for (auto pair : samples)
+ {
+ if (pair.second == entry)
+ {
+ addr = pair.first;
+ break;
+ }
+ }
+
+ writer->Write(addr);
+}
+
+void OTRExporter_Audio::WriteSampleEntry(SampleEntry* entry, BinaryWriter* writer)
+{
+ WriteHeader(nullptr, "", writer, Ship::ResourceType::AudioSample);
+
+ writer->Write(entry->codec);
+ writer->Write(entry->medium);
+ writer->Write(entry->unk_bit26);
+ writer->Write(entry->unk_bit25);
+
+ writer->Write((uint32_t)entry->data.size());
+ writer->Write((char*)entry->data.data(), entry->data.size());
+
+ writer->Write((uint32_t)(entry->loop.start));
+ writer->Write((uint32_t)(entry->loop.end));
+ writer->Write((uint32_t)(entry->loop.count));
+ writer->Write((uint32_t)entry->loop.states.size());
+
+ for (int i = 0; i < entry->loop.states.size(); i++)
+ writer->Write((entry->loop.states[i]));
+
+ writer->Write((uint32_t)(entry->book.order));
+ writer->Write((uint32_t)(entry->book.npredictors));
+ writer->Write((uint32_t)entry->book.books.size());
+
+ for (int i = 0; i < entry->book.books.size(); i++)
+ writer->Write((entry->book.books[i]));
+}
+
+void OTRExporter_Audio::WriteSoundFontEntry(SoundFontEntry* entry, std::map<uint32_t, SampleEntry*> samples, BinaryWriter* writer)
+{
+ writer->Write((uint8_t)(entry != nullptr ? 1 : 0));
+
+ if (entry != nullptr)
+ {
+ WriteSampleEntryReference(entry->sampleEntry, samples, writer);
+ writer->Write(entry->tuning);
+ }
+}
+
+void OTRExporter_Audio::WriteEnvData(std::vector<AdsrEnvelope*> envelopes, BinaryWriter* writer)
+{
+ writer->Write((uint32_t)envelopes.size());
+
+ for (auto env : envelopes)
+ {
+ writer->Write(env->delay);
+ writer->Write(env->arg);
+ }
+}
+
+void OTRExporter_Audio::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
+{
+ ZAudio* audio = (ZAudio*)res;
+
+ WriteHeader(res, outPath, writer, Ship::ResourceType::Audio);
+
+ // Write Samples as individual files
+ for (auto pair : audio->samples)
+ {
+ MemoryStream* sampleStream = new MemoryStream();
+ BinaryWriter sampleWriter = BinaryWriter(sampleStream);
+
+ WriteSampleEntry(pair.second, &sampleWriter);
+
+ std::string fName = OTRExporter_DisplayList::GetPathToRes(res, StringHelper::Sprintf("samples/sample_%08X", pair.first));
+ AddFile(fName, sampleStream->ToVector());
+ }
+
+ // Write the samplebank table
+ //writer->Write((uint32_t)audio->sampleBankTable.size());
+ //for (size_t i = 0; i < audio->sampleBankTable.size(); i++)
+ //{
+ //}
+
+ // Write the soundfont table
+ //writer->Write((uint32_t)audio->soundFontTable.size());
+
+ for (size_t i = 0; i < audio->soundFontTable.size(); i++)
+ {
+ MemoryStream* fntStream = new MemoryStream();
+ BinaryWriter fntWriter = BinaryWriter(fntStream);
+
+ WriteHeader(nullptr, "", &fntWriter, Ship::ResourceType::AudioSoundFont);
+
+ fntWriter.Write(audio->soundFontTable[i].medium);
+ fntWriter.Write(audio->soundFontTable[i].cachePolicy);
+ fntWriter.Write(audio->soundFontTable[i].data1);
+ fntWriter.Write(audio->soundFontTable[i].data2);
+ fntWriter.Write(audio->soundFontTable[i].data3);
+
+ fntWriter.Write((uint32_t)audio->soundFontTable[i].drums.size());
+ fntWriter.Write((uint32_t)audio->soundFontTable[i].instruments.size());
+ fntWriter.Write((uint32_t)audio->soundFontTable[i].soundEffects.size());
+
+ for (int k = 0; k < audio->soundFontTable[i].drums.size(); k++)
+ {
+ fntWriter.Write(audio->soundFontTable[i].drums[k].releaseRate);
+ fntWriter.Write(audio->soundFontTable[i].drums[k].pan);
+ fntWriter.Write(audio->soundFontTable[i].drums[k].loaded);
+
+ WriteEnvData(audio->soundFontTable[i].drums[k].env, &fntWriter);
+
+ WriteSampleEntryReference(audio->soundFontTable[i].drums[k].sample, audio->samples, &fntWriter);
+ fntWriter.Write(audio->soundFontTable[i].drums[k].tuning);
+ }
+
+ for (int k = 0; k < audio->soundFontTable[i].instruments.size(); k++)
+ {
+ fntWriter.Write((uint8_t)audio->soundFontTable[i].instruments[k].isValidInstrument);
+
+ fntWriter.Write(audio->soundFontTable[i].instruments[k].loaded);
+ fntWriter.Write(audio->soundFontTable[i].instruments[k].normalRangeLo);
+ fntWriter.Write(audio->soundFontTable[i].instruments[k].normalRangeHi);
+ fntWriter.Write(audio->soundFontTable[i].instruments[k].releaseRate);
+
+ WriteEnvData(audio->soundFontTable[i].instruments[k].env, &fntWriter);
+
+ WriteSoundFontEntry(audio->soundFontTable[i].instruments[k].lowNotesSound, audio->samples, &fntWriter);
+ WriteSoundFontEntry(audio->soundFontTable[i].instruments[k].normalNotesSound, audio->samples, &fntWriter);
+ WriteSoundFontEntry(audio->soundFontTable[i].instruments[k].highNotesSound, audio->samples, &fntWriter);
+ }
+
+ for (int k = 0; k < audio->soundFontTable[i].soundEffects.size(); k++)
+ {
+ WriteSoundFontEntry(audio->soundFontTable[i].soundEffects[k], audio->samples, &fntWriter);
+ }
+
+ std::string fName = OTRExporter_DisplayList::GetPathToRes(res, StringHelper::Sprintf("fonts/font_%02X", i));
+ AddFile(fName, fntStream->ToVector());
+ }
+
+ // Write Sequences
+ for (int i = 0; i < audio->sequences.size(); i++)
+ {
+ auto seq = audio->sequences[i];
+
+ MemoryStream* seqStream = new MemoryStream();
+ BinaryWriter seqWriter = BinaryWriter(seqStream);
+
+ seqWriter.Write((uint8_t)audio->sequenceTable[i].medium);
+ seqWriter.Write((uint8_t)audio->sequenceTable[i].cachePolicy);
+
+ seqWriter.Write(seq.data(), seq.size());
+
+ std::string fName = OTRExporter_DisplayList::GetPathToRes(res, StringHelper::Sprintf("sequences/seq_%02X", i));
+ AddFile(fName, seqStream->ToVector());
+ }
+}