From 667526e4141111340f7ee7870b8ae7f10cac2a05 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 19 Dec 2021 00:27:04 -0500 Subject: [PATCH] further improve the accuracy of 03xx --- src/engine/engine.h | 5 +++-- src/engine/playback.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index 1a2da9ef9..502b61e8e 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -29,7 +29,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, delayLocked; + bool doNote, legato, portaStop, keyOn, nowYouCanStop, stopOnOff, arpYield, delayLocked, inPorta; DivChannelState(): note(-1), @@ -62,7 +62,8 @@ struct DivChannelState { nowYouCanStop(true), stopOnOff(false), arpYield(false), - delayLocked(false) {} + delayLocked(false), + inPorta(false) {} }; class DivEngine { diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 8f4cfe9f3..139211738 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -403,6 +403,7 @@ void DivEngine::processRow(int i, bool afterDelay) { if (effectVal==0) { chan[i].portaNote=-1; chan[i].portaSpeed=-1; + chan[i].inPorta=false; } else { chan[i].portaNote=0x60; chan[i].portaSpeed=effectVal; @@ -415,6 +416,7 @@ void DivEngine::processRow(int i, bool afterDelay) { if (effectVal==0) { chan[i].portaNote=-1; chan[i].portaSpeed=-1; + chan[i].inPorta=false; } else { chan[i].portaNote=0x00; chan[i].portaSpeed=effectVal; @@ -427,17 +429,19 @@ void DivEngine::processRow(int i, bool afterDelay) { if (effectVal==0) { chan[i].portaNote=-1; chan[i].portaSpeed=-1; + chan[i].inPorta=false; dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,false)); } else { - if (chan[i].note==chan[i].oldNote) { + if (chan[i].note==chan[i].oldNote && !chan[i].inPorta) { chan[i].portaNote=chan[i].note; - chan[i].portaSpeed=0; + chan[i].portaSpeed=-1; } else { chan[i].portaNote=chan[i].note; chan[i].portaSpeed=effectVal; + chan[i].inPorta=true; } chan[i].portaStop=true; - chan[i].doNote=false; + if (chan[i].keyOn) chan[i].doNote=false; chan[i].stopOnOff=true; dispatchCmd(DivCommand(DIV_CMD_PRE_PORTA,i,true)); } @@ -735,6 +739,7 @@ bool DivEngine::nextTick() { chan[i].portaSpeed=0; chan[i].oldNote=chan[i].note; chan[i].note=chan[i].portaNote; + chan[i].inPorta=false; dispatchCmd(DivCommand(DIV_CMD_LEGATO,i,chan[i].note)); } }