From 00b329b8968098e3041f4330f6227982e0bd46d5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Feb 2023 17:36:33 -0500 Subject: [PATCH] OPN/2/A/B: implement new op enable --- src/engine/platform/arcade.cpp | 26 +++++++--- src/engine/platform/genesisext.cpp | 10 ++-- src/engine/platform/pcmdac.h | 2 + src/engine/platform/tx81z.cpp | 16 +++--- src/engine/platform/ym2203.cpp | 16 +++--- src/engine/platform/ym2203ext.cpp | 10 ++-- src/engine/platform/ym2608.cpp | 81 ++++++++++++++++++++++-------- src/engine/platform/ym2608ext.cpp | 12 ++--- src/engine/platform/ym2610.cpp | 81 ++++++++++++++++++++++-------- src/engine/platform/ym2610b.cpp | 81 ++++++++++++++++++++++-------- src/engine/platform/ym2610bext.cpp | 12 ++--- src/engine/platform/ym2610ext.cpp | 12 ++--- 12 files changed, 243 insertions(+), 116 deletions(-) diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index e417c313..e617fc0d 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -152,7 +152,9 @@ void DivPlatformArcade::tick(bool sysTick) { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (KVS(i,j)) { + if (!op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else if (KVS(i,j)) { rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); @@ -235,7 +237,7 @@ void DivPlatformArcade::tick(bool sysTick) { if (!parent->song.algMacroBehavior) for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -296,7 +298,9 @@ void DivPlatformArcade::tick(bool sysTick) { } if (m.tl.had) { op.tl=127-m.tl.val; - if (KVS(i,j)) { + if (!op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else if (KVS(i,j)) { rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); @@ -415,7 +419,9 @@ void DivPlatformArcade::commitState(int ch, DivInstrument* ins) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[ch]|opOffs[i]; DivInstrumentFM::Operator op=chan[ch].state.op[i]; - if (KVS(ch,i)) { + if (!op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else if (KVS(ch,i)) { if (!chan[ch].active || chan[ch].insChanged) { rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); } @@ -486,7 +492,9 @@ int DivPlatformArcade::dispatch(DivCommand c) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { + if (!op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else if (KVS(c.chan,i)) { rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); @@ -588,7 +596,9 @@ int DivPlatformArcade::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (KVS(c.chan,c.value)) { + if (!op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else if (KVS(c.chan,c.value)) { rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); @@ -795,7 +805,9 @@ void DivPlatformArcade::forceIns() { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator op=chan[i].state.op[j]; - if (KVS(i,j)) { + if (!op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else if (KVS(i,j)) { rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); } else { rWrite(baseAddr+ADDR_TL,op.tl); diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index cc763d09..3ab6cec4 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -42,7 +42,7 @@ void DivPlatformGenesisExt::commitStateExt(int ch, DivInstrument* ins) { unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[2].state.op[ordch]; // TODO: how does this work?! - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { @@ -127,7 +127,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { } unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[2].state.op[ordch]; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -243,7 +243,7 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[2]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[2].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(2,c.value)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -431,7 +431,7 @@ void DivPlatformGenesisExt::muteChannel(int ch, bool mute) { int ordch=orderedOps[ch-2]; unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator op=chan[2].state.op[ordch]; - if (isOpMuted[ch-2]) { + if (isOpMuted[ch-2] || !op.enable) { rWrite(baseAddr+0x40,127); immWrite(baseAddr+0x40,127); } else if (KVS(2,ordch)) { @@ -652,7 +652,7 @@ void DivPlatformGenesisExt::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (i==2 && extMode) { // extended channel - if (isOpMuted[orderedOps[j]]) { + if (isOpMuted[orderedOps[j]] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127)); diff --git a/src/engine/platform/pcmdac.h b/src/engine/platform/pcmdac.h index 9de928ff..e32b7b09 100644 --- a/src/engine/platform/pcmdac.h +++ b/src/engine/platform/pcmdac.h @@ -29,6 +29,7 @@ class DivPlatformPCMDAC: public DivDispatch { bool audDir; unsigned int audLoc; unsigned short audLen; + short audDat[8]; int audPos; int audSub; int sample, wave; @@ -41,6 +42,7 @@ class DivPlatformPCMDAC: public DivDispatch { audDir(false), audLoc(0), audLen(0), + audDat{0,0,0,0,0,0,0,0}, audPos(0), audSub(0), sample(-1), diff --git a/src/engine/platform/tx81z.cpp b/src/engine/platform/tx81z.cpp index 80e69f19..ce5221f3 100644 --- a/src/engine/platform/tx81z.cpp +++ b/src/engine/platform/tx81z.cpp @@ -111,7 +111,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -210,7 +210,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { if (!parent->song.algMacroBehavior) for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -263,7 +263,7 @@ void DivPlatformTX81Z::tick(bool sysTick) { } if (m.tl.had) { op.tl=127-m.tl.val; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -384,7 +384,7 @@ void DivPlatformTX81Z::muteChannel(int ch, bool mute) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[ch]|opOffs[i]; DivInstrumentFM::Operator op=chan[ch].state.op[i]; - if (isMuted[ch]) { + if (isMuted[ch] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(ch,i)) { @@ -404,7 +404,7 @@ void DivPlatformTX81Z::commitState(int ch, DivInstrument* ins) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[ch]|opOffs[i]; DivInstrumentFM::Operator op=chan[ch].state.op[i]; - if (isMuted[ch]) { + if (isMuted[ch] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(ch,i)) { @@ -483,7 +483,7 @@ int DivPlatformTX81Z::dispatch(DivCommand c) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (isMuted[c.chan]) { + if (isMuted[c.chan] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,i)) { @@ -600,7 +600,7 @@ int DivPlatformTX81Z::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (isMuted[c.chan]) { + if (isMuted[c.chan] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,c.value)) { @@ -908,7 +908,7 @@ void DivPlatformTX81Z::forceIns() { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index c02b074d..8f6cd3e3 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -293,7 +293,7 @@ void DivPlatformYM2203::tick(bool sysTick) { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -336,7 +336,7 @@ void DivPlatformYM2203::tick(bool sysTick) { if (!parent->song.algMacroBehavior) for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -385,7 +385,7 @@ void DivPlatformYM2203::tick(bool sysTick) { } if (m.tl.had) { op.tl=127-m.tl.val; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -508,7 +508,7 @@ void DivPlatformYM2203::commitState(int ch, DivInstrument* ins) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[ch]|opOffs[i]; DivInstrumentFM::Operator& op=chan[ch].state.op[i]; - if (isMuted[ch]) { + if (isMuted[ch] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(ch,i)) { @@ -586,7 +586,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (isMuted[c.chan]) { + if (isMuted[c.chan] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,i)) { @@ -676,7 +676,7 @@ int DivPlatformYM2203::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (isMuted[c.chan]) { + if (isMuted[c.chan] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(c.chan,c.value)) { @@ -874,7 +874,7 @@ void DivPlatformYM2203::muteChannel(int ch, bool mute) { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[ch]|opOffs[j]; DivInstrumentFM::Operator& op=chan[ch].state.op[j]; - if (isMuted[ch]) { + if (isMuted[ch] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(ch,j)) { @@ -891,7 +891,7 @@ void DivPlatformYM2203::forceIns() { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { diff --git a/src/engine/platform/ym2203ext.cpp b/src/engine/platform/ym2203ext.cpp index c14be9dc..ae6eacd3 100644 --- a/src/engine/platform/ym2203ext.cpp +++ b/src/engine/platform/ym2203ext.cpp @@ -38,7 +38,7 @@ void DivPlatformYM2203Ext::commitStateExt(int ch, DivInstrument* ins) { unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[2].state.op[ordch]; // TODO: how does this work?! - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { @@ -122,7 +122,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { } unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[2].state.op[ordch]; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -202,7 +202,7 @@ int DivPlatformYM2203Ext::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[2]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[2].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(2,c.value)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -540,7 +540,7 @@ void DivPlatformYM2203Ext::muteChannel(int ch, bool mute) { int ordch=orderedOps[ch-2]; unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator op=chan[2].state.op[ordch]; - if (isOpMuted[ch-2]) { + if (isOpMuted[ch-2] || !op.enable) { rWrite(baseAddr+0x40,127); immWrite(baseAddr+0x40,127); } else if (KVS(2,ordch)) { @@ -558,7 +558,7 @@ void DivPlatformYM2203Ext::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (i==2 && extMode) { // extended channel - if (isOpMuted[orderedOps[j]]) { + if (isOpMuted[orderedOps[j]] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127)); diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 1c501fe5..523ee701 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -480,10 +480,14 @@ void DivPlatformYM2608::tick(bool sysTick) { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } } @@ -524,7 +528,7 @@ void DivPlatformYM2608::tick(bool sysTick) { if (!parent->song.algMacroBehavior) for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -585,10 +589,14 @@ void DivPlatformYM2608::tick(bool sysTick) { } if (m.tl.had) { op.tl=127-m.tl.val; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } if (m.rs.had) { @@ -836,13 +844,19 @@ void DivPlatformYM2608::commitState(int ch, DivInstrument* ins) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[ch]|opOffs[i]; DivInstrumentFM::Operator& op=chan[ch].state.op[i]; - if (KVS(ch,i)) { - if (!chan[ch].active || chan[ch].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + if (isMuted[ch] || !op.enable) { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127); } } else { - if (chan[ch].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } if (chan[ch].insChanged) { @@ -1017,10 +1031,14 @@ int DivPlatformYM2608::dispatch(DivCommand c) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + if (isMuted[c.chan] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(c.chan,i)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } break; @@ -1144,10 +1162,14 @@ int DivPlatformYM2608::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + if (isMuted[c.chan] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(c.chan,c.value)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } break; } @@ -1345,6 +1367,19 @@ void DivPlatformYM2608::muteChannel(int ch, bool mute) { return; } // FM + for (int j=0; j<4; j++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[j]; + DivInstrumentFM::Operator& op=chan[ch].state.op[j]; + if (isMuted[ch] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else { + if (KVS(ch,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + } rWrite(chanOffs[ch]+ADDR_LRAF,(isMuted[ch]?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); } @@ -1353,10 +1388,14 @@ void DivPlatformYM2608::forceIns() { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); diff --git a/src/engine/platform/ym2608ext.cpp b/src/engine/platform/ym2608ext.cpp index 96409ce7..387ba110 100644 --- a/src/engine/platform/ym2608ext.cpp +++ b/src/engine/platform/ym2608ext.cpp @@ -40,7 +40,7 @@ void DivPlatformYM2608Ext::commitStateExt(int ch, DivInstrument* ins) { unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[2].state.op[ordch]; // TODO: how does this work?! - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { @@ -125,7 +125,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { } unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[2].state.op[ordch]; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -225,7 +225,7 @@ int DivPlatformYM2608Ext::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[2]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[2].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(2,c.value)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -562,7 +562,7 @@ void DivPlatformYM2608Ext::muteChannel(int ch, bool mute) { int ordch=orderedOps[ch-2]; unsigned short baseAddr=chanOffs[2]|opOffs[ordch]; DivInstrumentFM::Operator op=chan[2].state.op[ordch]; - if (isOpMuted[ch-2]) { + if (isOpMuted[ch-2] || !op.enable) { rWrite(baseAddr+0x40,127); immWrite(baseAddr+0x40,127); } else if (KVS(2,ordch)) { @@ -582,7 +582,7 @@ void DivPlatformYM2608Ext::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (i==2 && extMode) { // extended channel - if (isOpMuted[orderedOps[j]]) { + if (isOpMuted[orderedOps[j]] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127)); @@ -590,7 +590,7 @@ void DivPlatformYM2608Ext::forceIns() { rWrite(baseAddr+0x40,op.tl); } } else { - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 94da9444..044fe2c2 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -413,10 +413,14 @@ void DivPlatformYM2610::tick(bool sysTick) { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } } @@ -457,7 +461,7 @@ void DivPlatformYM2610::tick(bool sysTick) { if (!parent->song.algMacroBehavior) for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -518,10 +522,14 @@ void DivPlatformYM2610::tick(bool sysTick) { } if (m.tl.had) { op.tl=127-m.tl.val; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } if (m.rs.had) { @@ -769,13 +777,17 @@ void DivPlatformYM2610::commitState(int ch, DivInstrument* ins) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[ch]|opOffs[i]; DivInstrumentFM::Operator& op=chan[ch].state.op[i]; - if (KVS(ch,i)) { - if (!chan[ch].active || chan[ch].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); - } + if (isMuted[ch] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - if (chan[ch].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } if (chan[ch].insChanged) { @@ -991,10 +1003,14 @@ int DivPlatformYM2610::dispatch(DivCommand c) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + if (isMuted[c.chan] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(c.chan,i)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } break; @@ -1118,10 +1134,14 @@ int DivPlatformYM2610::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + if (isMuted[c.chan] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(c.chan,c.value)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } break; } @@ -1312,6 +1332,19 @@ void DivPlatformYM2610::muteChannel(int ch, bool mute) { return; } // FM + for (int j=0; j<4; j++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[j]; + DivInstrumentFM::Operator& op=chan[ch].state.op[j]; + if (isMuted[ch] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else { + if (KVS(ch,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + } rWrite(chanOffs[ch]+ADDR_LRAF,(isMuted[ch]?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); } @@ -1320,10 +1353,14 @@ void DivPlatformYM2610::forceIns() { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 79792df0..20d83dc1 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -480,10 +480,14 @@ void DivPlatformYM2610B::tick(bool sysTick) { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } } @@ -524,7 +528,7 @@ void DivPlatformYM2610B::tick(bool sysTick) { if (!parent->song.algMacroBehavior) for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { @@ -585,10 +589,14 @@ void DivPlatformYM2610B::tick(bool sysTick) { } if (m.tl.had) { op.tl=127-m.tl.val; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } if (m.rs.had) { @@ -836,13 +844,17 @@ void DivPlatformYM2610B::commitState(int ch, DivInstrument* ins) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[ch]|opOffs[i]; DivInstrumentFM::Operator& op=chan[ch].state.op[i]; - if (KVS(ch,i)) { - if (!chan[ch].active || chan[ch].insChanged) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); - } + if (isMuted[ch] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - if (chan[ch].insChanged) { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(ch,i)) { + if (!chan[ch].active || chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } + } else { + if (chan[ch].insChanged) { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } if (chan[ch].insChanged) { @@ -1058,10 +1070,14 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { for (int i=0; i<4; i++) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[i]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[i]; - if (KVS(c.chan,i)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + if (isMuted[c.chan] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(c.chan,i)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } } break; @@ -1185,10 +1201,14 @@ int DivPlatformYM2610B::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[c.chan]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[c.chan].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (KVS(c.chan,c.value)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + if (isMuted[c.chan] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(c.chan,c.value)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[c.chan].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } break; } @@ -1379,6 +1399,19 @@ void DivPlatformYM2610B::muteChannel(int ch, bool mute) { return; } // FM + for (int j=0; j<4; j++) { + unsigned short baseAddr=chanOffs[ch]|opOffs[j]; + DivInstrumentFM::Operator& op=chan[ch].state.op[j]; + if (isMuted[ch] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); + } else { + if (KVS(ch,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[ch].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } + } + } rWrite(chanOffs[ch]+ADDR_LRAF,(isMuted[ch]?0:(chan[ch].pan<<6))|(chan[ch].state.fms&7)|((chan[ch].state.ams&3)<<4)); } @@ -1387,10 +1420,14 @@ void DivPlatformYM2610B::forceIns() { for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; - if (KVS(i,j)) { - rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + if (isMuted[i] || !op.enable) { + rWrite(baseAddr+ADDR_TL,127); } else { - rWrite(baseAddr+ADDR_TL,op.tl); + if (KVS(i,j)) { + rWrite(baseAddr+ADDR_TL,127-VOL_SCALE_LOG_BROKEN(127-op.tl,chan[i].outVol&0x7f,127)); + } else { + rWrite(baseAddr+ADDR_TL,op.tl); + } } rWrite(baseAddr+ADDR_MULT_DT,(op.mult&15)|(dtTable[op.dt&7]<<4)); rWrite(baseAddr+ADDR_RS_AR,(op.ar&31)|(op.rs<<6)); diff --git a/src/engine/platform/ym2610bext.cpp b/src/engine/platform/ym2610bext.cpp index e025ec2f..97f5c0d6 100644 --- a/src/engine/platform/ym2610bext.cpp +++ b/src/engine/platform/ym2610bext.cpp @@ -36,7 +36,7 @@ void DivPlatformYM2610BExt::commitStateExt(int ch, DivInstrument* ins) { unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[extChanOffs].state.op[ordch]; // TODO: how does this work?! - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { @@ -121,7 +121,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { } unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[extChanOffs].state.op[ordch]; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -221,7 +221,7 @@ int DivPlatformYM2610BExt::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[extChanOffs].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(2,c.value)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -558,7 +558,7 @@ void DivPlatformYM2610BExt::muteChannel(int ch, bool mute) { int ordch=orderedOps[ch-extChanOffs]; unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; DivInstrumentFM::Operator op=chan[extChanOffs].state.op[ordch]; - if (isOpMuted[ch-extChanOffs]) { + if (isOpMuted[ch-extChanOffs] || !op.enable) { rWrite(baseAddr+0x40,127); immWrite(baseAddr+0x40,127); } else if (KVS(2,ordch)) { @@ -578,7 +578,7 @@ void DivPlatformYM2610BExt::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (i==extChanOffs && extMode) { // extended channel - if (isOpMuted[orderedOps[j]]) { + if (isOpMuted[orderedOps[j]] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127)); @@ -586,7 +586,7 @@ void DivPlatformYM2610BExt::forceIns() { rWrite(baseAddr+0x40,op.tl); } } else { - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) { diff --git a/src/engine/platform/ym2610ext.cpp b/src/engine/platform/ym2610ext.cpp index ccb87748..09347443 100644 --- a/src/engine/platform/ym2610ext.cpp +++ b/src/engine/platform/ym2610ext.cpp @@ -36,7 +36,7 @@ void DivPlatformYM2610Ext::commitStateExt(int ch, DivInstrument* ins) { unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[extChanOffs].state.op[ordch]; // TODO: how does this work?! - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { if (opChan[ch].insChanged) { @@ -121,7 +121,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { } unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; DivInstrumentFM::Operator& op=chan[extChanOffs].state.op[ordch]; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -221,7 +221,7 @@ int DivPlatformYM2610Ext::dispatch(DivCommand c) { unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[orderedOps[c.value]]; DivInstrumentFM::Operator& op=chan[extChanOffs].state.op[orderedOps[c.value]]; op.tl=c.value2; - if (isOpMuted[ch]) { + if (isOpMuted[ch] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(2,c.value)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[ch].outVol&0x7f,127)); @@ -558,7 +558,7 @@ void DivPlatformYM2610Ext::muteChannel(int ch, bool mute) { int ordch=orderedOps[ch-extChanOffs]; unsigned short baseAddr=chanOffs[extChanOffs]|opOffs[ordch]; DivInstrumentFM::Operator op=chan[extChanOffs].state.op[ordch]; - if (isOpMuted[ch-extChanOffs]) { + if (isOpMuted[ch-extChanOffs] || !op.enable) { rWrite(baseAddr+0x40,127); immWrite(baseAddr+0x40,127); } else if (KVS(2,ordch)) { @@ -578,7 +578,7 @@ void DivPlatformYM2610Ext::forceIns() { unsigned short baseAddr=chanOffs[i]|opOffs[j]; DivInstrumentFM::Operator& op=chan[i].state.op[j]; if (i==extChanOffs && extMode) { // extended channel - if (isOpMuted[orderedOps[j]]) { + if (isOpMuted[orderedOps[j]] || !op.enable) { rWrite(baseAddr+0x40,127); } else if (KVS(i,j)) { rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127)); @@ -586,7 +586,7 @@ void DivPlatformYM2610Ext::forceIns() { rWrite(baseAddr+0x40,op.tl); } } else { - if (isMuted[i]) { + if (isMuted[i] || !op.enable) { rWrite(baseAddr+ADDR_TL,127); } else { if (KVS(i,j)) {