diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 50eab344f..027acb798 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -301,6 +301,7 @@ void DivPlatformOPLL::tick(bool sysTick) { for (int i=0; i<11; i++) { if (chan[i].freqChanged) { chan[i].freq=parent->calcFreq(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>262143) chan[i].freq=262143; int freqt=toFreq(chan[i].freq)+chan[i].pitch2; chan[i].freqL=freqt&0xff; @@ -420,15 +421,16 @@ int DivPlatformOPLL::dispatch(DivCommand c) { if (chan[c.chan].state.opllPreset==16 && chan[c.chan].state.fixedDrums) { switch (c.chan) { case 6: - chan[c.chan].baseFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9); + chan[c.chan].fixedFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9); break; case 7: case 10: - chan[c.chan].baseFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9); + chan[c.chan].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9); break; case 8: case 9: - chan[c.chan].baseFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9); + chan[c.chan].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9); break; default: + chan[c.chan].fixedFreq=0; chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value); break; } diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index 7a06bbb77..d2d208269 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -33,7 +33,7 @@ class DivPlatformOPLL: public DivDispatch { DivInstrumentFM state; DivMacroInt std; unsigned char freqH, freqL; - int freq, baseFreq, pitch, pitch2, note, ins; + int freq, baseFreq, pitch, pitch2, note, ins, fixedFreq; bool active, insChanged, freqChanged, keyOn, keyOff, portaPause, furnaceDac, inPorta; int vol, outVol; unsigned char pan; @@ -50,6 +50,7 @@ class DivPlatformOPLL: public DivDispatch { pitch2(0), note(0), ins(-1), + fixedFreq(0), active(false), insChanged(true), freqChanged(false),