From 53975349e5c3a2128e68b8412cd5a3764e0ad895 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 17 May 2021 01:51:14 -0500 Subject: [PATCH] more. SMS. fixes. --- src/engine/dispatch.h | 1 + src/engine/platform/sms.cpp | 16 ++++++++++++++-- src/engine/playback.cpp | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 8fa679a8..b76ef5ae 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -12,6 +12,7 @@ enum DivDispatchCmds { DIV_CMD_PITCH, DIV_CMD_PANNING, DIV_CMD_LEGATO, + DIV_CMD_PRE_PORTA, DIV_CMD_SAMPLE_MODE, diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 8d305763..f6621044 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -21,6 +21,13 @@ void DivPlatformSMS::tick() { } chan[i].freqChanged=true; } + if (chan[i].std.hadDuty) { + snNoiseMode=(snNoiseMode&2)|(chan[i].std.duty&1); + if (chan[i].std.duty<2) { + chan[3].freqChanged=false; + } + updateSNMode=true; + } } for (int i=0; i<3; i++) { if (chan[i].freqChanged) { @@ -74,8 +81,10 @@ int DivPlatformSMS::dispatch(DivCommand c) { //chan[c.chan].std.init(parent->getIns(chan[c.chan].ins)); break; case DIV_CMD_VOLUME: - chan[c.chan].vol=c.value; - sn->write(0x90|c.chan<<5|(15-chan[c.chan].vol)); + if (chan[c.chan].vol!=c.value) { + chan[c.chan].vol=c.value; + sn->write(0x90|c.chan<<5|(15-chan[c.chan].vol)); + } break; case DIV_CMD_PITCH: chan[c.chan].pitch=c.value; @@ -110,6 +119,9 @@ int DivPlatformSMS::dispatch(DivCommand c) { chan[c.chan].freqChanged=true; chan[c.chan].note=c.value; break; + case DIV_CMD_PRE_PORTA: + chan[c.chan].std.init(parent->getIns(chan[c.chan].ins)); + break; default: break; } diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 8a6a4a03..7c51c5bc 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -190,6 +190,7 @@ void DivEngine::processRow(int i, bool afterDelay) { chan[i].portaNote=chan[i].note; chan[i].portaSpeed=effectVal; chan[i].doNote=false; + dispatch->dispatch(DivCommand(DIV_CMD_PRE_PORTA,i)); } break; case 0x04: // vibrato