From 8bbd7110d086be3493cf9c4f7f07350bda84065b Mon Sep 17 00:00:00 2001 From: lilacLunatic <8488221+lilacLunatic@users.noreply.github.com> Date: Fri, 18 Apr 2025 21:07:53 -0300 Subject: [PATCH 1/4] audio mod converter --- soh/CMakeLists.txt | 2 + soh/soh/OTRGlobals.cpp | 104 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 52dd996115d..b89228a62c3 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -353,6 +353,8 @@ target_include_directories(${PROJECT_NAME} PRIVATE assets ${CMAKE_CURRENT_SOURCE_DIR}/../libultraship/src/graphic/Fast3D/U64/PR ${CMAKE_CURRENT_SOURCE_DIR}/../libultraship/src/graphic ${CMAKE_CURRENT_SOURCE_DIR}/../ZAPDTR/ZAPD/resource/type + ${CMAKE_CURRENT_SOURCE_DIR}/../ZAPDTR/ZAPD/ + ${CMAKE_CURRENT_SOURCE_DIR}/../OTRExporter/OTRExporter/ ${SDL2-INCLUDE} ${SDL2-NET-INCLUDE} ${BOOST-INCLUDE} diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 94d375aec53..e85c94d9d9a 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -558,11 +558,115 @@ void OTRAudio_Thread() { } } +namespace ZAPD { +#include +#include +#include +#include +#include +} // C->C++ Bridge extern "C" void OTRAudio_Init() { // Precache all our samples, sequences, etc... ResourceMgr_LoadDirectory("audio"); + auto samples = Ship::Context::GetInstance()->GetResourceManager()->LoadResources("audio/samples/*"); + + auto archive = std::make_shared(Ship::Context::GetPathRelativeToAppBundle("mods/___sample_mod.o2r")); + if (archive->Open()) { + for (auto sR : *samples) { + if (sR == nullptr) { + continue; + } + if (!sR->GetInitData()->IsCustom) { + continue; + } + + std::shared_ptr s = static_pointer_cast(sR); + + ZAPD::SampleEntry zSampleEntry; + zSampleEntry.fileName = s->GetInitData()->Path; + zSampleEntry.codec = s->sample.codec; + zSampleEntry.medium = s->sample.medium; + zSampleEntry.unk_bit26 = s->sample.unk_bit26; + zSampleEntry.unk_bit25 = s->sample.unk_bit25; + + ZAPD::AdpcmLoop zAdpcmLoop; + zAdpcmLoop.start = s->loop.start; + zAdpcmLoop.end = s->loop.end; + zAdpcmLoop.count = s->loop.count; + for (s16 i = 0; i < 16; i++) { + zAdpcmLoop.states.push_back(s->loop.state[i]); + } + + ZAPD::AdpcmBook zAdpcmBook; + zAdpcmBook.order = 1; //s->book.order; + zAdpcmBook.npredictors = 1; //s->book.npredictors; + //zAdpcmBook.books.push_back(0); + /*for (s16 i = 0; i < 8 * s->book.order * s->book.npredictors; i++) { + zAdpcmBook.books.push_back(s->book.book[i]); + }*/ + + zSampleEntry.loop = zAdpcmLoop; + zSampleEntry.book = zAdpcmBook; + + for (u32 i = 0; i < s->sample.size; i++) { + zSampleEntry.data.push_back(*(s->sample.sampleAddr + i)); + } + + auto stream = std::make_shared(); + ZAPD::BinaryWriter* writer = &ZAPD::BinaryWriter(stream); + writer->Write((uint8_t)0); // 0x00 + writer->Write((uint8_t)0); // 0x01 + writer->Write((uint8_t)0); // 0x02 + writer->Write((uint8_t)0); // 0x03 + + writer->Write((uint32_t)static_cast(SOH::ResourceType::SOH_AudioSample)); // 0x04 + //writer->Write((uint32_t)MAJOR_VERSION); // 0x08 + writer->Write((uint32_t)2); // 0x08 + writer->Write((uint64_t)0xDEADBEEFDEADBEEF); // id, 0x0C + writer->Write((uint32_t)0); // 0x10 + writer->Write((uint64_t)0); // ROM CRC, 0x14 + writer->Write((uint32_t)0); // ROM Enum, 0x1C + + while (writer->GetBaseAddress() < 0x40) + writer->Write((uint32_t)0); // To be used at a later date! + + writer->Write(zSampleEntry.codec); + writer->Write(zSampleEntry.medium); + writer->Write(zSampleEntry.unk_bit26); + writer->Write(zSampleEntry.unk_bit25); + + writer->Write((uint32_t)zSampleEntry.data.size()); + writer->Write((char*)zSampleEntry.data.data(), zSampleEntry.data.size()); + + writer->Write((uint32_t)(zSampleEntry.loop.start)); + writer->Write((uint32_t)(zSampleEntry.loop.end)); + writer->Write((uint32_t)(zSampleEntry.loop.count)); + writer->Write((uint32_t)zSampleEntry.loop.states.size()); + + for (size_t i = 0; i < zSampleEntry.loop.states.size(); i++) { + writer->Write((zSampleEntry.loop.states[i])); + } + + writer->Write((uint32_t)(zSampleEntry.book.order)); + writer->Write((uint32_t)(zSampleEntry.book.npredictors)); + writer->Write((uint32_t)zSampleEntry.book.books.size()); + + for (size_t i = 0; i < zSampleEntry.book.books.size(); i++) { + writer->Write((zSampleEntry.book.books[i])); + } + + std::vector outputData; + writer->GetStream()->Seek(0, ZAPD::SeekOffsetType::Start); + for (size_t i = 0; i < writer->GetStream()->GetLength(); i++) { + outputData.push_back(writer->GetStream()->ReadByte()); + } + + archive->WriteFile(zSampleEntry.fileName, outputData); + } + archive->Close(); + } if (!audio.running) { audio.running = true; From 542936421f62f43d2e3098577709d8bba5313479 Mon Sep 17 00:00:00 2001 From: lilacLunatic <8488221+lilacLunatic@users.noreply.github.com> Date: Fri, 18 Apr 2025 21:20:14 -0300 Subject: [PATCH 2/4] please build winmac 1 --- soh/soh/OTRGlobals.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index e85c94d9d9a..a667ac743ed 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -615,7 +615,8 @@ extern "C" void OTRAudio_Init() } auto stream = std::make_shared(); - ZAPD::BinaryWriter* writer = &ZAPD::BinaryWriter(stream); + ZAPD::BinaryWriter writerObj = ZAPD::BinaryWriter(stream); + ZAPD::BinaryWriter writer = &writerObj; writer->Write((uint8_t)0); // 0x00 writer->Write((uint8_t)0); // 0x01 writer->Write((uint8_t)0); // 0x02 From 3042e15c95c56350aaeb50bd9d2d9008c3b8f9b7 Mon Sep 17 00:00:00 2001 From: lilacLunatic <8488221+lilacLunatic@users.noreply.github.com> Date: Fri, 18 Apr 2025 21:27:07 -0300 Subject: [PATCH 3/4] please build winmac 2 --- soh/soh/OTRGlobals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index a667ac743ed..643ed3e52da 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -616,7 +616,7 @@ extern "C" void OTRAudio_Init() auto stream = std::make_shared(); ZAPD::BinaryWriter writerObj = ZAPD::BinaryWriter(stream); - ZAPD::BinaryWriter writer = &writerObj; + ZAPD::BinaryWriter* writer = &writerObj; writer->Write((uint8_t)0); // 0x00 writer->Write((uint8_t)0); // 0x01 writer->Write((uint8_t)0); // 0x02 From c1119479f84a740bef323853d27ba6026a1cc991 Mon Sep 17 00:00:00 2001 From: lilacLunatic <8488221+lilacLunatic@users.noreply.github.com> Date: Mon, 21 Apr 2025 22:19:19 -0300 Subject: [PATCH 4/4] Fix relative path --- soh/soh/OTRGlobals.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 643ed3e52da..6ca18489657 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -572,7 +572,12 @@ extern "C" void OTRAudio_Init() ResourceMgr_LoadDirectory("audio"); auto samples = Ship::Context::GetInstance()->GetResourceManager()->LoadResources("audio/samples/*"); - auto archive = std::make_shared(Ship::Context::GetPathRelativeToAppBundle("mods/___sample_mod.o2r")); + std::string modsPath = Ship::Context::LocateFileAcrossAppDirs("mods", appShortName); + if (!std::filesystem::exists(modsPath)) { + modsPath = Ship::Context::GetPathRelativeToAppDirectory("mods", appShortName); + } + + auto archive = std::make_shared(modsPath + "/___sample_mod.o2r"); if (archive->Open()) { for (auto sR : *samples) { if (sR == nullptr) {