From 3eb3d8a6f188b5e0382a7f94fce025fa072866e6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 17 Dec 2022 01:21:08 -0500 Subject: [PATCH] prepare for new arp strategy --- src/engine/chipUtils.h | 32 ++++++++++++++++++++++++++----- src/engine/dispatch.h | 2 +- src/engine/engine.h | 4 ++-- src/engine/fileOps.cpp | 11 +++++++---- src/engine/platform/amiga.cpp | 4 +++- src/engine/platform/arcade.cpp | 4 +++- src/engine/platform/ay.cpp | 4 +++- src/engine/platform/ay8930.cpp | 4 +++- src/engine/platform/bubsyswsg.cpp | 4 +++- src/engine/platform/c64.cpp | 4 +++- src/engine/platform/fds.cpp | 4 +++- src/engine/platform/ga20.cpp | 4 +++- src/engine/platform/gb.cpp | 4 +++- src/engine/platform/genesis.cpp | 8 ++++++-- src/engine/platform/k007232.cpp | 4 +++- src/engine/platform/lynx.cpp | 4 +++- src/engine/platform/mmc5.cpp | 4 +++- src/engine/platform/msm5232.cpp | 4 +++- src/engine/platform/n163.cpp | 4 +++- src/engine/platform/namcowsg.cpp | 4 +++- src/engine/platform/nes.cpp | 4 +++- src/engine/platform/opl.cpp | 8 ++++++-- src/engine/platform/opll.cpp | 4 +++- src/engine/platform/pce.cpp | 4 +++- src/engine/platform/pcmdac.cpp | 4 +++- src/engine/platform/pcspkr.cpp | 4 +++- src/engine/platform/pet.cpp | 4 +++- src/engine/platform/pokemini.cpp | 4 +++- src/engine/platform/pong.cpp | 4 +++- src/engine/platform/qsound.cpp | 4 +++- src/engine/platform/rf5c68.cpp | 4 +++- src/engine/platform/saa.cpp | 4 +++- src/engine/platform/scc.cpp | 4 +++- src/engine/platform/segapcm.cpp | 4 +++- src/engine/platform/sms.cpp | 8 ++++++-- src/engine/platform/snes.cpp | 4 +++- src/engine/platform/su.cpp | 4 +++- src/engine/platform/swan.cpp | 4 +++- src/engine/platform/t6w28.cpp | 4 +++- src/engine/platform/tia.cpp | 4 +++- src/engine/platform/tx81z.cpp | 4 +++- src/engine/platform/vb.cpp | 4 +++- src/engine/platform/vera.cpp | 8 ++++++-- src/engine/platform/vic20.cpp | 4 +++- src/engine/platform/vrc6.cpp | 4 +++- src/engine/platform/x1_010.cpp | 4 +++- src/engine/platform/ym2203.cpp | 4 +++- src/engine/platform/ym2608.cpp | 8 ++++++-- src/engine/platform/ym2610.cpp | 8 ++++++-- src/engine/platform/ym2610b.cpp | 8 ++++++-- src/engine/platform/ymz280b.cpp | 4 +++- src/engine/platform/zxbeeper.cpp | 4 +++- src/engine/song.h | 4 +++- src/gui/compatFlags.cpp | 4 ++++ 54 files changed, 209 insertions(+), 68 deletions(-) diff --git a/src/engine/chipUtils.h b/src/engine/chipUtils.h index e48086d7..8cdb8764 100644 --- a/src/engine/chipUtils.h +++ b/src/engine/chipUtils.h @@ -28,23 +28,44 @@ // common shared channel struct template struct SharedChannel { - int freq, baseFreq, baseFreqOverride, pitch, pitch2, arpOff; + int freq, baseFreq, baseNoteOverride, pitch, pitch2, arpOff; int ins, note; - bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, inPorta; + bool active, insChanged, freqChanged, fixedArp, keyOn, keyOff, portaPause, inPorta; T vol, outVol; DivMacroInt std; - void handleArp() { + void handleArp(int offset=0) { + if (std.arp.had) { + if (std.arp.val<0) { + if (!(std.arp.val&0x40000000)) { + baseNoteOverride=(std.arp.val|0x40000000)+offset; + fixedArp=true; + } else { + arpOff=std.arp.val; + fixedArp=false; + } + } else { + if (std.arp.val&0x40000000) { + baseNoteOverride=(std.arp.val&(~0x40000000))+offset; + fixedArp=true; + } else { + arpOff=std.arp.val; + fixedArp=false; + } + } + freqChanged=true; + } } void macroInit(DivInstrument* which) { std.init(which); pitch2=0; arpOff=0; - baseFreqOverride=-1; + baseNoteOverride=0; + fixedArp=false; } SharedChannel(T initVol): freq(0), baseFreq(0), - baseFreqOverride(-1), + baseNoteOverride(0), pitch(0), pitch2(0), arpOff(0), @@ -53,6 +74,7 @@ template struct SharedChannel { active(false), insChanged(true), freqChanged(false), + fixedArp(false), keyOn(false), keyOff(false), portaPause(false), diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index c20f6073..063247d2 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -635,6 +635,6 @@ class DivDispatch { if (xxMax) x=xMax; -#define NEW_ARP_STRAT (parent->song.linearPitch==2 && !parent->song.newArpStrategy) +#define NEW_ARP_STRAT (parent->song.linearPitch==2 && !parent->song.oldArpStrategy) #endif diff --git a/src/engine/engine.h b/src/engine/engine.h index 3b00ea3b..961f3a35 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -47,8 +47,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev129" -#define DIV_ENGINE_VERSION 129 +#define DIV_VERSION "dev130" +#define DIV_ENGINE_VERSION 130 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index b39aa344..b21d3a0d 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -1713,6 +1713,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { if (ds.version<121) { ds.brokenOutVol2=false; } + if (ds.version<130) { + ds.oldArpStrategy=true; + } ds.isDMF=false; reader.readS(); // reserved @@ -2155,7 +2158,9 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } else { reader.readC(); } - for (int i=0; i<1; i++) { + if (ds.version>=130) { + ds.oldArpStrategy=reader.readC(); + } else { reader.readC(); } } @@ -4406,9 +4411,7 @@ SafeWriter* DivEngine::saveFur(bool notPrimary) { w->writeC(song.autoSystem); w->writeC(song.disableSampleMacro); w->writeC(song.brokenOutVol2); - for (int i=0; i<1; i++) { - w->writeC(0); - } + w->writeC(song.oldArpStrategy); // first subsong virtual tempo w->writeS(subSong->virtualTempoN); diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 1f102adc..f3b04c77 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -162,7 +162,9 @@ void DivPlatformAmiga::tick(bool sysTick) { off=8363.0/(double)s->centerRate; } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { // TODO: why the off mult? this may be a bug! chan[i].baseFreq=round(off*NOTE_PERIODIC_NOROUND(parent->calcArp(chan[i].note,chan[i].std.arp.val))); chan[i].freqChanged=true; diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index b5ddebff..8d39c5a6 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -159,7 +159,9 @@ void DivPlatformArcade::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_LINEAR(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/ay.cpp b/src/engine/platform/ay.cpp index b7a8dddc..1c46543c 100644 --- a/src/engine/platform/ay.cpp +++ b/src/engine/platform/ay.cpp @@ -253,7 +253,9 @@ void DivPlatformAY8910::tick(bool sysTick) { } } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/ay8930.cpp b/src/engine/platform/ay8930.cpp index a166c8f2..3a11b4de 100644 --- a/src/engine/platform/ay8930.cpp +++ b/src/engine/platform/ay8930.cpp @@ -243,7 +243,9 @@ void DivPlatformAY8930::tick(bool sysTick) { } } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/bubsyswsg.cpp b/src/engine/platform/bubsyswsg.cpp index c122986c..ce8f2bf4 100644 --- a/src/engine/platform/bubsyswsg.cpp +++ b/src/engine/platform/bubsyswsg.cpp @@ -90,7 +90,9 @@ void DivPlatformBubSysWSG::tick(bool sysTick) { chan[i].outVol=((chan[i].vol&15)*MIN(15,chan[i].std.vol.val))/15; rWrite(2+i,(chan[i].wave<<5)|chan[i].outVol); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 0397b60f..e2eed789 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -123,7 +123,9 @@ void DivPlatformC64::tick(bool sysTick) { updateFilter(); } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index dc7ab740..1c2b11f4 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -119,7 +119,9 @@ void DivPlatformFDS::tick(bool sysTick) { if (chan[i].outVol<0) chan[i].outVol=0; rWrite(0x4080,0x80|chan[i].outVol); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/ga20.cpp b/src/engine/platform/ga20.cpp index 0251292c..abe32a77 100644 --- a/src/engine/platform/ga20.cpp +++ b/src/engine/platform/ga20.cpp @@ -97,7 +97,9 @@ void DivPlatformGA20::tick(bool sysTick) { chan[i].volumeChanged=true; } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index bf045aae..c48ed257 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -163,7 +163,9 @@ void DivPlatformGB::tick(bool sysTick) { } } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (i==3) { // noise chan[i].baseFreq=parent->calcArp(chan[i].note,chan[i].std.arp.val,24); if (chan[i].baseFreq>255) chan[i].baseFreq=255; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index e85db0b1..03b670b4 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -296,14 +296,18 @@ void DivPlatformGenesis::tick(bool sysTick) { } if (i>=5 && chan[i].furnaceDac) { - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=parent->calcBaseFreq(1,1,parent->calcArp(chan[i].note,chan[i].std.arp.val),false); } chan[i].freqChanged=true; } } else { - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FNUM_BLOCK(parent->calcArp(chan[i].note,chan[i].std.arp.val),11); } diff --git a/src/engine/platform/k007232.cpp b/src/engine/platform/k007232.cpp index 4cc4db16..07990479 100644 --- a/src/engine/platform/k007232.cpp +++ b/src/engine/platform/k007232.cpp @@ -109,7 +109,9 @@ void DivPlatformK007232::tick(bool sysTick) { chan[i].volumeChanged=true; } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index f5743d67..92dae211 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -171,7 +171,9 @@ void DivPlatformLynx::tick(bool sysTick) { } WRITE_VOLUME(i,(isMuted[i]?0:(chan[i].outVol&127))); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].actualNote=parent->calcArp(chan[i].note,chan[i].std.arp.val); chan[i].baseFreq=NOTE_PERIODIC(chan[i].actualNote); diff --git a/src/engine/platform/mmc5.cpp b/src/engine/platform/mmc5.cpp index ca541393..21ce2409 100644 --- a/src/engine/platform/mmc5.cpp +++ b/src/engine/platform/mmc5.cpp @@ -102,7 +102,9 @@ void DivPlatformMMC5::tick(bool sysTick) { rWrite(0x5000+i*4,0x30|chan[i].outVol|((chan[i].duty&3)<<6)); } // TODO: arp macros on NES PCM? - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/msm5232.cpp b/src/engine/platform/msm5232.cpp index 4a1c0239..20111d80 100644 --- a/src/engine/platform/msm5232.cpp +++ b/src/engine/platform/msm5232.cpp @@ -96,7 +96,9 @@ void DivPlatformMSM5232::tick(bool sysTick) { if (chan[i].std.vol.had) { chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol&127,MIN(127,chan[i].std.vol.val),127); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_LINEAR(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/n163.cpp b/src/engine/platform/n163.cpp index 1610e7fb..60ae8084 100644 --- a/src/engine/platform/n163.cpp +++ b/src/engine/platform/n163.cpp @@ -187,7 +187,9 @@ void DivPlatformN163::tick(bool sysTick) { } } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/namcowsg.cpp b/src/engine/platform/namcowsg.cpp index ee63f2cd..2802d467 100644 --- a/src/engine/platform/namcowsg.cpp +++ b/src/engine/platform/namcowsg.cpp @@ -204,7 +204,9 @@ void DivPlatformNamcoWSG::tick(bool sysTick) { chan[i].noise=chan[i].std.duty.val; chan[i].freqChanged=true; } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index c5789fcf..fe540087 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -217,7 +217,9 @@ void DivPlatformNES::tick(bool sysTick) { rWrite(0x4000+i*4,(chan[i].envMode<<4)|chan[i].outVol|((chan[i].duty&3)<<6)); } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (i==3) { // noise chan[i].baseFreq=parent->calcArp(chan[i].note,chan[i].std.arp.val); if (chan[i].baseFreq>255) chan[i].baseFreq=255; diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 4acfdb96..5052bfaf 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -304,7 +304,9 @@ void DivPlatformOPL::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } @@ -489,7 +491,9 @@ void DivPlatformOPL::tick(bool sysTick) { immWrite(18,chan[adpcmChan].outVol); } - if (chan[adpcmChan].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[adpcmChan].handleArp(); + } else if (chan[adpcmChan].std.arp.had) { if (!chan[adpcmChan].inPorta) { chan[adpcmChan].baseFreq=NOTE_ADPCMB(parent->calcArp(chan[adpcmChan].note,chan[adpcmChan].std.arp.val)); } diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 508e1f45..feb71b8f 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -105,7 +105,9 @@ void DivPlatformOPLL::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index d63c5d4e..2a8457ba 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -167,7 +167,9 @@ void DivPlatformPCE::tick(bool sysTick) { if (noiseSeek<0) noiseSeek=0; chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } 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); diff --git a/src/engine/platform/pcmdac.cpp b/src/engine/platform/pcmdac.cpp index 7c1ad0c8..4fbf1309 100644 --- a/src/engine/platform/pcmdac.cpp +++ b/src/engine/platform/pcmdac.cpp @@ -128,7 +128,9 @@ void DivPlatformPCMDAC::tick(bool sysTick) { if (chan[0].std.vol.had) { chan[0].envVol=chan[0].std.vol.val; } - if (chan[0].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[0].handleArp(); + } else if (chan[0].std.arp.had) { if (!chan[0].inPorta) { chan[0].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[0].note,chan[0].std.arp.val)); } diff --git a/src/engine/platform/pcspkr.cpp b/src/engine/platform/pcspkr.cpp index 5ec95616..e54941e1 100644 --- a/src/engine/platform/pcspkr.cpp +++ b/src/engine/platform/pcspkr.cpp @@ -345,7 +345,9 @@ void DivPlatformPCSpeaker::tick(bool sysTick) { chan[i].outVol=(chan[i].vol && chan[i].std.vol.val); on=chan[i].outVol; } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/pet.cpp b/src/engine/platform/pet.cpp index b99e2f64..7f5e5659 100644 --- a/src/engine/platform/pet.cpp +++ b/src/engine/platform/pet.cpp @@ -102,7 +102,9 @@ void DivPlatformPET::tick(bool sysTick) { chan[0].outVol=chan[0].std.vol.val&chan[0].vol; writeOutVol(); } - if (chan[0].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[0].handleArp(); + } else if (chan[0].std.arp.had) { if (!chan[0].inPorta) { chan[0].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[0].note,chan[0].std.arp.val)); } diff --git a/src/engine/platform/pokemini.cpp b/src/engine/platform/pokemini.cpp index 34900654..98ca4f96 100644 --- a/src/engine/platform/pokemini.cpp +++ b/src/engine/platform/pokemini.cpp @@ -74,7 +74,9 @@ void DivPlatformPokeMini::tick(bool sysTick) { chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol,chan[i].std.vol.val,3); vol=(chan[i].outVol==2)?3:chan[i].outVol; } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/pong.cpp b/src/engine/platform/pong.cpp index c5f81654..2b8a63d2 100644 --- a/src/engine/platform/pong.cpp +++ b/src/engine/platform/pong.cpp @@ -49,7 +49,9 @@ void DivPlatformPong::tick(bool sysTick) { chan[i].outVol=(chan[i].vol && chan[i].std.vol.val); on=chan[i].outVol; } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 4d06a781..a368e691 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -335,7 +335,9 @@ void DivPlatformQSound::tick(bool sysTick) { qsound_loop = length - loopStart; } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=QS_NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index f237cd50..6d53f227 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -82,7 +82,9 @@ void DivPlatformRF5C68::tick(bool sysTick) { chan[i].outVol=((chan[i].vol&0xff)*MIN(chan[i].macroVolMul,chan[i].std.vol.val))/chan[i].macroVolMul; chWrite(i,0,chan[i].outVol); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/saa.cpp b/src/engine/platform/saa.cpp index 27f88fc6..67a22d92 100644 --- a/src/engine/platform/saa.cpp +++ b/src/engine/platform/saa.cpp @@ -104,7 +104,9 @@ void DivPlatformSAA1099::tick(bool sysTick) { rWrite(i,applyPan(chan[i].outVol&15,chan[i].pan)); } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/scc.cpp b/src/engine/platform/scc.cpp index f10ef874..d782b662 100644 --- a/src/engine/platform/scc.cpp +++ b/src/engine/platform/scc.cpp @@ -113,7 +113,9 @@ void DivPlatformSCC::tick(bool sysTick) { chan[i].outVol=((chan[i].vol&15)*MIN(15,chan[i].std.vol.val))/15; rWrite(regBase+10+i,chan[i].outVol); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index ef518d5d..81aba9a1 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -86,7 +86,9 @@ void DivPlatformSegaPCM::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=(parent->calcArp(chan[i].note,chan[i].std.arp.val)<<6); } diff --git a/src/engine/platform/sms.cpp b/src/engine/platform/sms.cpp index 833a5042..fb79174a 100644 --- a/src/engine/platform/sms.cpp +++ b/src/engine/platform/sms.cpp @@ -156,7 +156,9 @@ void DivPlatformSMS::tick(bool sysTick) { // ((chan[i].vol&15)*MIN(15,chan[i].std.vol.val))>>4; chan[i].writeVol=true; } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { // TODO: add compatibility flag. this is horrible. int areYouSerious=parent->calcArp(chan[i].note,chan[i].std.arp.val); @@ -244,7 +246,9 @@ void DivPlatformSMS::tick(bool sysTick) { } } else { // 3 fixed values unsigned char value; - if (chan[3].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[3].handleArp(); + } else if (chan[3].std.arp.had) { value=parent->calcArp(chan[3].note,chan[3].std.arp.val)%12; } else { // pardon? value=chan[3].note%12; diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index 0248769e..e18994e7 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -106,7 +106,9 @@ void DivPlatformSNES::tick(bool sysTick) { if (chan[i].std.vol.had) { chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol&127,MIN(127,chan[i].std.vol.val),127); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 7d6762c8..b81e2e81 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -76,7 +76,9 @@ void DivPlatformSoundUnit::tick(bool sysTick) { } chWrite(i,0x02,chan[i].outVol); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_SU(i,parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 90604942..ae1ff4bb 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -133,7 +133,9 @@ void DivPlatformSwan::tick(bool sysTick) { } calcAndWriteOutVol(i,env); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/t6w28.cpp b/src/engine/platform/t6w28.cpp index 50647524..8f67bf73 100644 --- a/src/engine/platform/t6w28.cpp +++ b/src/engine/platform/t6w28.cpp @@ -108,7 +108,9 @@ void DivPlatformT6W28::tick(bool sysTick) { if (chan[i].std.vol.had) { chan[i].outVol=VOL_SCALE_LOG_BROKEN(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } 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_SN(i,noiseSeek); diff --git a/src/engine/platform/tia.cpp b/src/engine/platform/tia.cpp index 5902f6c9..ac966b68 100644 --- a/src/engine/platform/tia.cpp +++ b/src/engine/platform/tia.cpp @@ -103,7 +103,9 @@ void DivPlatformTIA::tick(bool sysTick) { } } // TODO: the way arps work on TIA is really weird - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { 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); diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 577f3891..2b2d9c6d 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -121,7 +121,9 @@ void DivPlatformTX81Z::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_LINEAR(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index 54a24ad9..230ed1aa 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -144,7 +144,9 @@ void DivPlatformVB::tick(bool sysTick) { chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15); writeEnv(i); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/vera.cpp b/src/engine/platform/vera.cpp index 14a31c54..0d9335bf 100644 --- a/src/engine/platform/vera.cpp +++ b/src/engine/platform/vera.cpp @@ -159,7 +159,9 @@ void DivPlatformVERA::tick(bool sysTick) { chan[i].outVol=MAX(chan[i].vol+chan[i].std.vol.val-63,0); rWriteLo(i,2,chan[i].outVol); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=calcNoteFreq(0,parent->calcArp(chan[i].note,chan[i].std.arp.val)); } @@ -201,7 +203,9 @@ void DivPlatformVERA::tick(bool sysTick) { chan[16].outVol=MAX(chan[16].vol+MIN(chan[16].std.vol.val/4,15)-15,0); rWritePCMVol(chan[16].outVol&15); } - if (chan[16].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[16].handleArp(); + } else if (chan[16].std.arp.had) { if (!chan[16].inPorta) { chan[16].baseFreq=calcNoteFreq(16,parent->calcArp(chan[16].note,chan[16].std.arp.val)); } diff --git a/src/engine/platform/vic20.cpp b/src/engine/platform/vic20.cpp index d8849fc4..bdfcb5bf 100644 --- a/src/engine/platform/vic20.cpp +++ b/src/engine/platform/vic20.cpp @@ -92,7 +92,9 @@ void DivPlatformVIC20::tick(bool sysTick) { int env=chan[i].std.vol.val; calcAndWriteOutVol(i,env); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index 7341e337..6110f790 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -152,7 +152,9 @@ void DivPlatformVRC6::tick(bool sysTick) { } } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_PERIODIC(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index a0a00a44..9eda112d 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -331,7 +331,9 @@ void DivPlatformX1_010::tick(bool sysTick) { } } if ((!chan[i].pcm) || chan[i].furnacePCM) { - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NoteX1_010(i,parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index ee204bff..dbdb5599 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -230,7 +230,9 @@ void DivPlatformYM2203::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FNUM_BLOCK(parent->calcArp(chan[i].note,chan[i].std.arp.val),11); } diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 1a2457b5..1aabab5c 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -376,7 +376,9 @@ void DivPlatformYM2608::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FNUM_BLOCK(parent->calcArp(chan[i].note,chan[i].std.arp.val),11); } @@ -595,7 +597,9 @@ void DivPlatformYM2608::tick(bool sysTick) { immWrite(0x10b,chan[15].outVol); } - if (chan[15].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[15].handleArp(); + } else if (chan[15].std.arp.had) { if (!chan[15].inPorta) { chan[15].baseFreq=NOTE_ADPCMB(parent->calcArp(chan[15].note,chan[15].std.arp.val)); } diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 56d53968..ce723998 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -313,7 +313,9 @@ void DivPlatformYM2610::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FNUM_BLOCK(parent->calcArp(chan[i].note,chan[i].std.arp.val),11); } @@ -534,7 +536,9 @@ void DivPlatformYM2610::tick(bool sysTick) { immWrite(0x1b,chan[adpcmBChanOffs].outVol); } - if (chan[adpcmBChanOffs].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[adpcmBChanOffs].handleArp(); + } else if (chan[adpcmBChanOffs].std.arp.had) { if (!chan[adpcmBChanOffs].inPorta) { chan[adpcmBChanOffs].baseFreq=NOTE_ADPCMB(parent->calcArp(chan[adpcmBChanOffs].note,chan[adpcmBChanOffs].std.arp.val)); } diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 3b72a93b..0515aa6e 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -376,7 +376,9 @@ void DivPlatformYM2610B::tick(bool sysTick) { } } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FNUM_BLOCK(parent->calcArp(chan[i].note,chan[i].std.arp.val),11); } @@ -597,7 +599,9 @@ void DivPlatformYM2610B::tick(bool sysTick) { immWrite(0x1b,chan[adpcmBChanOffs].outVol); } - if (chan[adpcmBChanOffs].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[adpcmBChanOffs].handleArp(); + } else if (chan[adpcmBChanOffs].std.arp.had) { if (!chan[adpcmBChanOffs].inPorta) { chan[adpcmBChanOffs].baseFreq=NOTE_ADPCMB(parent->calcArp(chan[adpcmBChanOffs].note,chan[adpcmBChanOffs].std.arp.val)); } diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index c8ced88d..1af57ae2 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -93,7 +93,9 @@ void DivPlatformYMZ280B::tick(bool sysTick) { chan[i].outVol=((chan[i].vol&0xff)*MIN(chan[i].macroVolMul,chan[i].std.vol.val))/chan[i].macroVolMul; writeOutVol(i); } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/platform/zxbeeper.cpp b/src/engine/platform/zxbeeper.cpp index 5608bd03..297389ad 100644 --- a/src/engine/platform/zxbeeper.cpp +++ b/src/engine/platform/zxbeeper.cpp @@ -79,7 +79,9 @@ void DivPlatformZXBeeper::tick(bool sysTick) { chan[i].duty=chan[i].std.duty.val; chan[i].freqChanged=true; } - if (chan[i].std.arp.had) { + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { if (!chan[i].inPorta) { chan[i].baseFreq=NOTE_FREQUENCY(parent->calcArp(chan[i].note,chan[i].std.arp.val)); } diff --git a/src/engine/song.h b/src/engine/song.h index e1a1607d..cd2d59d0 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -322,6 +322,7 @@ struct DivSong { bool snNoLowPeriods; bool disableSampleMacro; bool autoSystem; + bool oldArpStrategy; std::vector ins; std::vector wave; @@ -428,7 +429,8 @@ struct DivSong { brokenPortaArp(false), snNoLowPeriods(false), disableSampleMacro(false), - autoSystem(true) { + autoSystem(true), + oldArpStrategy(false) { for (int i=0; isong.oldArpStrategy); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("behavior changed in 0.6pre2"); + } } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_COMPAT_FLAGS; ImGui::End();