From 503e822a33f145ecf87732e96dcf139b9168b986 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 Jan 2023 03:38:29 -0500 Subject: [PATCH] PCE: better noise frequency handling --- src/engine/platform/pce.cpp | 24 +++++++++++++----------- src/engine/platform/pce.h | 5 +++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 3efbd7c8c..4b29c336c 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -163,21 +163,15 @@ void DivPlatformPCE::tick(bool sysTick) { if (chan[i].std.duty.had && i>=4) { chan[i].noise=chan[i].std.duty.val; chan[i].freqChanged=true; - int noiseSeek=chan[i].note; - if (noiseSeek<0) noiseSeek=0; - chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0); } if (NEW_ARP_STRAT) { chan[i].handleArp(); - int noiseSeek=chan[i].fixedArp?chan[i].baseNoteOverride:(chan[i].note+chan[i].arpOff); - if (noiseSeek<0) noiseSeek=0; - chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0); } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { int noiseSeek=parent->calcArp(chan[i].note,chan[i].std.arp.val); chan[i].baseFreq=NOTE_PERIODIC(noiseSeek); if (noiseSeek<0) noiseSeek=0; - chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0); + chan[i].noiseSeek=noiseSeek; } chan[i].freqChanged=true; } @@ -246,6 +240,15 @@ void DivPlatformPCE::tick(bool sysTick) { if (chan[i].freq>4095) chan[i].freq=4095; chWrite(i,0x02,chan[i].freq&0xff); chWrite(i,0x03,chan[i].freq>>8); + + if (i>=4) { + int noiseSeek=(chan[i].fixedArp?chan[i].baseNoteOverride:(chan[i].note+chan[i].arpOff))+chan[i].pitch2; + if (!parent->song.properNoiseLayout && noiseSeek<0) noiseSeek=0; + if (!NEW_ARP_STRAT) { + noiseSeek=chan[i].noiseSeek; + } + chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0); + } if (chan[i].keyOn) { //rWrite(16+i*5,0x80); //chWrite(i,0x04,0x80|chan[i].vol); @@ -331,9 +334,8 @@ int DivPlatformPCE::dispatch(DivCommand c) { chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); chan[c.chan].freqChanged=true; chan[c.chan].note=c.value; - int noiseSeek=chan[c.chan].note; - if (noiseSeek<0) noiseSeek=0; - chWrite(c.chan,0x07,chan[c.chan].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0); + chan[c.chan].noiseSeek=c.value; + if (chan[c.chan].noiseSeek<0) chan[c.chan].noiseSeek=0; } chan[c.chan].active=true; chan[c.chan].keyOn=true; @@ -431,7 +433,7 @@ int DivPlatformPCE::dispatch(DivCommand c) { } case DIV_CMD_STD_NOISE_MODE: chan[c.chan].noise=c.value; - chWrite(c.chan,0x07,chan[c.chan].noise?(0x80|chan[c.chan].note):0); + chan[c.chan].freqChanged=true; break; case DIV_CMD_SAMPLE_MODE: chan[c.chan].pcm=c.value; diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index 6493840c1..a687de1bf 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -34,7 +34,7 @@ class DivPlatformPCE: public DivDispatch { unsigned char pan; bool noise, pcm, furnaceDac, deferredWaveUpdate; signed short wave; - int macroVolMul; + int macroVolMul, noiseSeek; DivWaveSynth ws; Channel(): SharedChannel(31), @@ -51,7 +51,8 @@ class DivPlatformPCE: public DivDispatch { furnaceDac(false), deferredWaveUpdate(false), wave(-1), - macroVolMul(31) {} + macroVolMul(31), + noiseSeek(0) {} }; Channel chan[6]; DivDispatchOscBuffer* oscBuf[6];