diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index d4e1bde7..db2f4ecd 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -267,6 +267,20 @@ void DivPlatformOPLL::tick(bool sysTick) { if (i>=6 && properDrums && (i<9 || !noTopHatFreq)) { immWrite(0x10+drumSlot[i],freqt&0xff); immWrite(0x20+drumSlot[i],freqt>>8); + switch (i) { + case 7: + lastFreqSH=0; + break; + case 8: + lastFreqTT=0; + break; + case 9: + lastFreqTT=1; + break; + case 19: + lastFreqSH=1; + break; + } } else if (i<6 || !crapDrums) { if (i<9) { immWrite(0x10+i,freqt&0xff); @@ -892,11 +906,19 @@ void DivPlatformOPLL::forceIns() { rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4)); rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4)); + if (lastFreqSH==0) { + chan[7].freqChanged=true; + } else if (lastFreqSH==1) { + chan[10].freqChanged=true; + } + + if (lastFreqTT==0) { + chan[8].freqChanged=true; + } else if (lastFreqTT==1) { + chan[9].freqChanged=true; + } + chan[6].freqChanged=true; - chan[7].freqChanged=true; - chan[8].freqChanged=true; - chan[9].freqChanged=true; - chan[10].freqChanged=true; } drumState=0; } @@ -986,6 +1008,9 @@ void DivPlatformOPLL::reset() { crapDrums=false; properDrums=properDrumsSys; + lastFreqSH=-1; + lastFreqTT=-1; + if (properDrums) { immWrite(0x0e,0x20); } diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index ef691dd1..cabd2608 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -60,6 +60,11 @@ class DivPlatformOPLL: public DivDispatch { unsigned char drumState; unsigned char drumVol[5]; bool drumActivated[5]; + + // -1: undefined + // 0: snare/tom + // 1: hi-hat/top + signed char lastFreqSH, lastFreqTT; unsigned char regPool[256];