OPLL: drums mode work

This commit is contained in:
tildearrow 2023-08-09 17:29:42 -05:00
parent 7d3b823996
commit 3de0ee4e25
2 changed files with 32 additions and 31 deletions

View file

@ -107,7 +107,7 @@ void DivPlatformOPLL::tick(bool sysTick) {
rWrite(0x36,drumVol[0]); rWrite(0x36,drumVol[0]);
rWrite(0x37,drumVol[1]|(drumVol[4]<<4)); rWrite(0x37,drumVol[1]|(drumVol[4]<<4));
rWrite(0x38,drumVol[3]|(drumVol[2]<<4)); rWrite(0x38,drumVol[3]|(drumVol[2]<<4));
} else if (i<6 || !drums) { } else if (i<6 || !crapDrums) {
if (i<9) { if (i<9) {
rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4));
} }
@ -231,7 +231,7 @@ void DivPlatformOPLL::tick(bool sysTick) {
drumState&=~(0x10>>(i-6)); drumState&=~(0x10>>(i-6));
immWrite(0x0e,0x20|drumState); immWrite(0x0e,0x20|drumState);
logV("properDrums %d",i); logV("properDrums %d",i);
} else if (i>=6 && drums) { } else if (i>=6 && crapDrums) {
drumState&=~(0x10>>(chan[i].note%12)); drumState&=~(0x10>>(chan[i].note%12));
immWrite(0x0e,0x20|drumState); immWrite(0x0e,0x20|drumState);
logV("drums %d",i); logV("drums %d",i);
@ -265,7 +265,7 @@ void DivPlatformOPLL::tick(bool sysTick) {
if (i>=6 && properDrums && (i<9 || !noTopHatFreq)) { if (i>=6 && properDrums && (i<9 || !noTopHatFreq)) {
immWrite(0x10+drumSlot[i],freqt&0xff); immWrite(0x10+drumSlot[i],freqt&0xff);
immWrite(0x20+drumSlot[i],freqt>>8); immWrite(0x20+drumSlot[i],freqt>>8);
} else if (i<6 || !drums) { } else if (i<6 || !crapDrums) {
if (i<9) { if (i<9) {
immWrite(0x10+i,freqt&0xff); immWrite(0x10+i,freqt&0xff);
} }
@ -278,7 +278,7 @@ void DivPlatformOPLL::tick(bool sysTick) {
immWrite(0x0e,0x20|drumState); immWrite(0x0e,0x20|drumState);
} }
chan[i].keyOn=false; chan[i].keyOn=false;
} else if (chan[i].keyOn && i>=6 && drums) { } else if (chan[i].keyOn && i>=6 && crapDrums) {
//printf("%d\n",chan[i].note%12); //printf("%d\n",chan[i].note%12);
drumState|=(0x10>>(chan[i].note%12)); drumState|=(0x10>>(chan[i].note%12));
immWrite(0x0e,0x20|drumState); immWrite(0x0e,0x20|drumState);
@ -365,22 +365,24 @@ void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) {
} }
if (chan[ch].state.opllPreset==16) { // compatible drums mode if (chan[ch].state.opllPreset==16) { // compatible drums mode
if (ch>=6) { if (ch>=6) {
drums=true; if (!properDrumsSys) {
immWrite(0x16,0x20); crapDrums=true;
immWrite(0x26,0x05); immWrite(0x16,0x20);
immWrite(0x16,0x20); immWrite(0x26,0x05);
immWrite(0x26,0x05); immWrite(0x16,0x20);
immWrite(0x17,0x50); immWrite(0x26,0x05);
immWrite(0x27,0x05); immWrite(0x17,0x50);
immWrite(0x17,0x50); immWrite(0x27,0x05);
immWrite(0x27,0x05); immWrite(0x17,0x50);
immWrite(0x18,0xC0); immWrite(0x27,0x05);
immWrite(0x28,0x01); immWrite(0x18,0xC0);
immWrite(0x28,0x01);
}
} }
} else { } else {
if (ch>=6) { if (ch>=6) {
if (drums) { if (crapDrums) {
drums=false; crapDrums=false;
immWrite(0x0e,0); immWrite(0x0e,0);
drumState=0; drumState=0;
} }
@ -395,10 +397,14 @@ void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) {
void DivPlatformOPLL::switchMode(bool mode) { void DivPlatformOPLL::switchMode(bool mode) {
if (mode==properDrums) return; if (mode==properDrums) return;
if (mode) { if (mode) {
logV("mode switch to DRUMS");
immWrite(0x0e,0x20);
} else { } else {
logV("mode switch to NORMAL");
immWrite(0x0e,0x00);
} }
properDrums=mode;
drumState=0;
} }
int DivPlatformOPLL::dispatch(DivCommand c) { int DivPlatformOPLL::dispatch(DivCommand c) {
@ -448,7 +454,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value); chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value);
chan[c.chan].note=c.value; chan[c.chan].note=c.value;
if (c.chan>=6 && drums) { if (c.chan>=6 && crapDrums) {
switch (chan[c.chan].note%12) { switch (chan[c.chan].note%12) {
case 0: // kick case 0: // kick
drumVol[0]=(15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15); drumVol[0]=(15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15);
@ -507,7 +513,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
rWrite(0x37,drumVol[1]|(drumVol[4]<<4)); rWrite(0x37,drumVol[1]|(drumVol[4]<<4));
rWrite(0x38,drumVol[3]|(drumVol[2]<<4)); rWrite(0x38,drumVol[3]|(drumVol[2]<<4));
break; break;
} else if (c.chan<6 || !drums) { } else if (c.chan<6 || !crapDrums) {
if (c.chan<9) { if (c.chan<9) {
rWrite(0x30+c.chan,((15-VOL_SCALE_LOG_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); rWrite(0x30+c.chan,((15-VOL_SCALE_LOG_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4));
} }
@ -565,7 +571,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
} }
case DIV_CMD_LEGATO: { case DIV_CMD_LEGATO: {
if (c.chan>=9 && !properDrums) return 0; if (c.chan>=9 && !properDrums) return 0;
if (c.chan<6 || (!drums && !properDrums)) { if (c.chan<6 || (!crapDrums && !properDrums)) {
if (chan[c.chan].insChanged) { if (chan[c.chan].insChanged) {
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPLL); DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPLL);
commitState(c.chan,ins); commitState(c.chan,ins);
@ -780,12 +786,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) {
case DIV_CMD_FM_EXTCH: case DIV_CMD_FM_EXTCH:
if (!properDrumsSys) break; if (!properDrumsSys) break;
if ((int)properDrums==c.value) break; if ((int)properDrums==c.value) break;
if (c.value) { switchMode(c.value);
properDrums=true;
} else {
properDrums=false;
}
switchMode(properDrums);
break; break;
case DIV_CMD_MACRO_OFF: case DIV_CMD_MACRO_OFF:
chan[c.chan].std.mask(c.value,true); chan[c.chan].std.mask(c.value,true);
@ -840,7 +841,7 @@ void DivPlatformOPLL::forceIns() {
} }
} }
} }
if (drums) { // WHAT?! FIX THIS! if (crapDrums) { // WHAT?! FIX THIS!
immWrite(0x16,0x20); immWrite(0x16,0x20);
immWrite(0x26,0x05); immWrite(0x26,0x05);
immWrite(0x16,0x20); immWrite(0x16,0x20);
@ -944,7 +945,7 @@ void DivPlatformOPLL::reset() {
drumVol[4]=0; drumVol[4]=0;
delay=0; delay=0;
drums=false; crapDrums=false;
properDrums=properDrumsSys; properDrums=properDrumsSys;
if (properDrums) { if (properDrums) {

View file

@ -63,7 +63,7 @@ class DivPlatformOPLL: public DivDispatch {
unsigned char regPool[256]; unsigned char regPool[256];
bool useYMFM; bool useYMFM;
bool drums; bool crapDrums;
bool properDrums, properDrumsSys, noTopHatFreq; bool properDrums, properDrumsSys, noTopHatFreq;
bool vrc7; bool vrc7;