diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 506dfc6f9..fe220aae8 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -145,7 +145,9 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { ds.loopModality=0; ds.properNoiseLayout=false; ds.waveDutyIsVol=false; - ds.resetMacroOnPorta=true; + // TODO: WHAT?! geodude.dmf fails when this is true + // but isn't that how Defle behaves??? + ds.resetMacroOnPorta=false; ds.legacyVolumeSlides=true; ds.compatibleArpeggio=true; ds.noteOffResetsSlides=true; @@ -512,7 +514,7 @@ bool DivEngine::loadDMF(unsigned char* file, size_t len) { for (int j=0; jstd.arpMacro.len; j++) { ins->std.arpMacro.val[j]^=0x40000000; } - if (ins->std.arpMacro.loop>=ins->std.arpMacro.len && ins->std.arpMacro.len<255) { + if (ins->std.arpMacro.loop==255 && ins->std.arpMacro.len<255) { ins->std.arpMacro.val[ins->std.arpMacro.len++]=0; } } diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 430e361ae..19cb1ba55 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -1349,7 +1349,7 @@ DivDataErrors DivInstrument::readInsData(SafeReader& reader, short version) { for (int i=0; i=std.arpMacro.len || std.arpMacro.rel>std.arpMacro.loop) && std.arpMacro.len<255) { + if ((std.arpMacro.loop>=std.arpMacro.len || (std.arpMacro.rel>std.arpMacro.loop && std.arpMacro.relcalcArp(chan[3].note,chan[3].std.arp.val)%12; + } else { // pardon? value=chan[3].note%12; } if (value<3) { diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index d55200f9f..82d032703 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -92,7 +92,7 @@ void DivPlatformTIA::tick(bool sysTick) { if (!chan[i].inPorta) { if (chan[i].std.arp.val<0 && (!(chan[i].std.arp.val&0x40000000))) { chan[i].baseFreq=0x80000000|(chan[i].std.arp.val|0x40000000); - } else if (chan[i].std.arp.val&0x40000000) { + } else if (chan[i].std.arp.val>=0 && chan[i].std.arp.val&0x40000000) { chan[i].baseFreq=0x80000000|(chan[i].std.arp.val&(~0x40000000)); } else { chan[i].baseFreq=(chan[i].note+chan[i].std.arp.val)<<8;