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) {