diff --git a/src/engine/engine.h b/src/engine/engine.h index 1d853ea78..3b13cdf14 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -24,7 +24,7 @@ struct DivChannelState { int vibratoDepth, vibratoRate, vibratoPos, vibratoDir, vibratoFine; int tremoloDepth, tremoloRate, tremoloPos; unsigned char arp, arpStage, arpTicks; - bool doNote, legato, portaStop, keyOn, nowYouCanStop, stopOnOff, arpYield; + bool doNote, legato, portaStop, keyOn, nowYouCanStop, stopOnOff, arpYield, delayLocked; DivChannelState(): note(-1), @@ -48,7 +48,14 @@ struct DivChannelState { arp(0), arpStage(-1), arpTicks(1), - doNote(false), legato(false), portaStop(false), keyOn(false), nowYouCanStop(true), stopOnOff(false), arpYield(false) {} + doNote(false), + legato(false), + portaStop(false), + keyOn(false), + nowYouCanStop(true), + stopOnOff(false), + arpYield(false), + delayLocked(false) {} }; class DivEngine { @@ -59,7 +66,7 @@ class DivEngine { bool playing; bool speedAB; bool endOfSong; - int ticks, cycles, curRow, curOrder, remainingLoops; + int ticks, cycles, curRow, curOrder, remainingLoops, nextSpeed; int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond; DivStatusView view; DivChannelState chan[17]; @@ -118,6 +125,7 @@ class DivEngine { curRow(0), curOrder(0), remainingLoops(-1), + nextSpeed(3), changeOrd(-1), changePos(0), totalTicks(0), diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 39b77da6a..7638fe11b 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -265,13 +265,24 @@ void DivEngine::processRow(int i, bool afterDelay) { if (effectVal==-1) effectVal=0; if (effect==0xed && effectVal!=0) { - chan[i].rowDelay=effectVal+1; - chan[i].delayOrder=whatOrder; - chan[i].delayRow=whatRow; - return; + if (effectVal<=nextSpeed) { + chan[i].rowDelay=effectVal+1; + chan[i].delayOrder=whatOrder; + chan[i].delayRow=whatRow; + if (effectVal==nextSpeed) { + chan[i].delayLocked=true; + } else { + chan[i].delayLocked=false; + } + return; + } else { + chan[i].delayLocked=false; + } } } + if (chan[i].delayLocked) return; + // instrument if (pat->data[whatRow][2]!=-1) { dispatchCmd(DivCommand(DIV_CMD_INSTRUMENT,i,pat->data[whatRow][2])); @@ -536,8 +547,10 @@ void DivEngine::nextRow() { if (speedAB) { ticks=song.speed2*(song.timeBase+1); + nextSpeed=song.speed1; } else { ticks=song.speed1*(song.timeBase+1); + nextSpeed=song.speed2; } speedAB=!speedAB;