From 34d092556994b23829ff23e111a2fb6dfd541f78 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 16 May 2022 21:06:49 -0500 Subject: [PATCH] OPL: fix fixed frequency drums --- TODO.md | 1 - src/engine/platform/opl.cpp | 9 ++++++--- src/engine/platform/opl.h | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/TODO.md b/TODO.md index 94e7f8df6..62364e065 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,5 @@ # to-do for 0.6pre1 -- fix an OPLL/OPL fixed drum freq regression caused by full linear pitch - piano/input pad - note input via piano - input pad diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 949d104b8..e76d033f4 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -595,6 +595,7 @@ void DivPlatformOPL::tick(bool sysTick) { for (int i=0; icalcFreq(chan[i].baseFreq,chan[i].pitch,false,octave(chan[i].baseFreq),chan[i].pitch2,chipClock,CHIP_FREQBASE); + if (chan[i].fixedFreq>0) chan[i].freq=chan[i].fixedFreq; if (chan[i].freq>131071) chan[i].freq=131071; int freqt=toFreq(chan[i].freq)+chan[i].pitch2; chan[i].freqH=freqt>>8; @@ -844,16 +845,18 @@ int DivPlatformOPL::dispatch(DivCommand c) { if (c.value!=DIV_NOTE_NULL) { if (c.chan>=melodicChans && chan[c.chan].state.opllPreset==16 && chan[c.chan].state.fixedDrums) { // drums if (c.chan==melodicChans) { - chan[c.chan].baseFreq=(chan[c.chan].state.kickFreq&1023)<<(chan[c.chan].state.kickFreq>>10); + chan[c.chan].fixedFreq=(chan[c.chan].state.kickFreq&1023)<<(chan[c.chan].state.kickFreq>>10); } else if (c.chan==melodicChans+1 || c.chan==melodicChans+4) { - chan[c.chan].baseFreq=(chan[c.chan].state.snareHatFreq&1023)<<(chan[c.chan].state.snareHatFreq>>10); + chan[c.chan].fixedFreq=(chan[c.chan].state.snareHatFreq&1023)<<(chan[c.chan].state.snareHatFreq>>10); } else if (c.chan==melodicChans+2 || c.chan==melodicChans+3) { - chan[c.chan].baseFreq=(chan[c.chan].state.tomTopFreq&1023)<<(chan[c.chan].state.tomTopFreq>>10); + chan[c.chan].fixedFreq=(chan[c.chan].state.tomTopFreq&1023)<<(chan[c.chan].state.tomTopFreq>>10); } else { chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value); + chan[c.chan].fixedFreq=0; } } else { chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value); + chan[c.chan].fixedFreq=0; } chan[c.chan].note=c.value; chan[c.chan].freqChanged=true; diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index a67d50380..61ea46481 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -40,7 +40,7 @@ class DivPlatformOPL: public DivDispatch { DivInstrumentFM state; DivMacroInt std; unsigned char freqH, freqL; - int freq, baseFreq, pitch, pitch2, note, ins, sample; + int freq, baseFreq, pitch, pitch2, note, ins, sample, fixedFreq; bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, furnacePCM, inPorta, fourOp, hardReset; int vol, outVol; unsigned char pan; @@ -58,6 +58,7 @@ class DivPlatformOPL: public DivDispatch { note(0), ins(-1), sample(-1), + fixedFreq(0), active(false), insChanged(true), freqChanged(false),