From bcc94fd4594d683ecfaa087b37fa26dab4139d29 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 1 Oct 2022 23:59:23 -0500 Subject: [PATCH] truly fix .dmp arp macro saving (hopefully) --- src/engine/fileOps.cpp | 18 ++++++++++++++---- src/engine/instrument.cpp | 25 ++++++++++++++++++------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 3ffb586e7..5033e3ec2 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -4977,8 +4977,6 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { } } - // TODO: take care of new arp macro format - w->writeC(i->std.arpMacro.len); bool arpMacroMode=false; int arpMacroHowManyFixed=0; int realArpMacroLen=i->std.arpMacro.len; @@ -4996,13 +4994,25 @@ SafeWriter* DivEngine::saveDMF(unsigned char version) { } } + if (realArpMacroLen>127) realArpMacroLen=127; + + w->writeC(realArpMacroLen); + if (arpMacroMode) { for (int j=0; jwriteI(i->std.arpMacro.val[j]); + if ((i->std.arpMacro.val[j]&0xc0000000)==0x40000000 || (i->std.arpMacro.val[j]&0xc0000000)==0x80000000) { + w->writeI(i->std.arpMacro.val[j]^0x40000000); + } else { + w->writeI(i->std.arpMacro.val[j]); + } } } else { for (int j=0; jwriteI(i->std.arpMacro.val[j]+12); + if ((i->std.arpMacro.val[j]&0xc0000000)==0x40000000 || (i->std.arpMacro.val[j]&0xc0000000)==0x80000000) { + w->writeI((i->std.arpMacro.val[j]^0x40000000)+12); + } else { + w->writeI(i->std.arpMacro.val[j]+12); + } } } if (realArpMacroLen>0) { diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index abb57edb5..fe420bd58 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -1501,12 +1501,11 @@ bool DivInstrument::saveDMP(const char* path) { if (std.volMacro.len>0) w->writeC(std.volMacro.loop); } - w->writeC(std.arpMacro.len); bool arpMacroMode=false; int arpMacroHowManyFixed=0; int realArpMacroLen=std.arpMacro.len; - for (int i=0; i127) realArpMacroLen=127; + + w->writeC(realArpMacroLen); + if (arpMacroMode) { - for (int i=0; iwriteI(std.arpMacro.val[i]); + for (int j=0; jwriteI(std.arpMacro.val[j]^0x40000000); + } else { + w->writeI(std.arpMacro.val[j]); + } } } else { - for (int i=0; iwriteI(std.arpMacro.val[i]+12); + for (int j=0; jwriteI((std.arpMacro.val[j]^0x40000000)+12); + } else { + w->writeI(std.arpMacro.val[j]+12); + } } } if (realArpMacroLen>0) {