diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 62dc94a8b..3a71d8c71 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -102,11 +102,20 @@ void DivPlatformOPLL::acquire_emu(short** buf, size_t len) { OPLL_writeReg(fm_emu,w.addr,w.val); writes.pop(); } - os=OPLL_calc(fm_emu)<<1; + os=OPLL_calc(fm_emu); + os=os+(os<<1); if (os<-32768) os=-32768; if (os>32767) os=32767; buf[0][h]=os; + + for (int i=0; i<11; i++) { + if (i>=6 && properDrums) { + oscBuf[i]->data[oscBuf[i]->needle++]=fm_emu->ch_out[i+3]<<3; + } else { + oscBuf[i]->data[oscBuf[i]->needle++]=fm_emu->ch_out[i]<<3; + } + } } } @@ -1001,6 +1010,10 @@ int DivPlatformOPLL::getRegisterPoolSize() { return 64; } +static const unsigned char nukedToEmuPatch[4]={ + 0, 2, 0 /* TODO */, 1 +}; + void DivPlatformOPLL::reset() { while (!writes.empty()) writes.pop(); memset(regPool,0,256); @@ -1026,6 +1039,11 @@ void DivPlatformOPLL::reset() { if (dumpWrites) { addWrite(0xffffffff,0); } + if (selCore==1) { + OPLL_reset(fm_emu); + OPLL_setChipType(fm_emu,vrc7?1:0); + OPLL_resetPatch(fm_emu,nukedToEmuPatch[patchSet&3]); + } for (int i=0; i<11; i++) { chan[i]=DivPlatformOPLL::Channel(); chan[i].std.setEngine(parent);