From 1b4081a044af71fa1319ed556db03b32b65c5ae9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 24 Jan 2022 02:52:45 -0500 Subject: [PATCH] VGM export: implement ADPCM storage possibly first open-source Neo Geo tracker that exports to .vgm --- src/engine/engine.cpp | 29 +++++++++++++++++++++++++++-- src/engine/engine.h | 4 +++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index b6d5fc19..15797c77 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2074,12 +2074,17 @@ SafeWriter* DivEngine::saveVGM() { bool willExport[32]; int streamIDs[32]; + bool writeDACSamples=false; + bool writeADPCM=false; + bool writeSegaPCM=false; + for (int i=0; iwriteC(0x67); w->writeC(0x66); - w->writeC(0); // for now! + w->writeC(0); w->writeI(sample->rendLength); if (sample->depth==8) { for (unsigned int j=0; jrendLength; j++) { @@ -2256,6 +2266,20 @@ SafeWriter* DivEngine::saveVGM() { } } + if (writeSegaPCM) { + // TODO + } + + if (writeADPCM && adpcmMemLen>0) { + w->writeC(0x67); + w->writeC(0x66); + w->writeC(0x82); + w->writeI(adpcmMemLen); + w->writeI(adpcmMemLen); + w->writeI(0); + w->write(adpcmMem,adpcmMemLen); + } + // initialize streams int streamID=0; for (int i=0; irendOff=memPos; memPos+=s->adpcmRendLength; } + adpcmMemLen=memPos; } void DivEngine::createNew() { diff --git a/src/engine/engine.h b/src/engine/engine.h index e8c25f32..ccd72f77 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -485,6 +485,7 @@ class DivEngine { bool quit(); unsigned char* adpcmMem; + size_t adpcmMemLen; DivEngine(): output(NULL), @@ -532,6 +533,7 @@ class DivEngine { metroAmp(0.0f), totalProcessed(0), jediTable(NULL), - adpcmMem(NULL) {} + adpcmMem(NULL), + adpcmMemLen(0) {} }; #endif