OPN ext ch: fix mute being overridden when seeking
This commit is contained in:
parent
6567d29450
commit
5ff1c9d70d
|
@ -175,7 +175,9 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=chanOffs[2]|opOffs[orderedOps[c.value]];
|
unsigned short baseAddr=chanOffs[2]|opOffs[orderedOps[c.value]];
|
||||||
DivInstrumentFM::Operator& op=chan[2].state.op[orderedOps[c.value]];
|
DivInstrumentFM::Operator& op=chan[2].state.op[orderedOps[c.value]];
|
||||||
op.tl=c.value2;
|
op.tl=c.value2;
|
||||||
if (isOutput[chan[2].state.alg][c.value]) {
|
if (isOpMuted[ch]) {
|
||||||
|
rWrite(baseAddr+0x40,127);
|
||||||
|
} else if (isOutput[chan[2].state.alg][c.value]) {
|
||||||
rWrite(baseAddr+0x40,127-(((127-op.tl)*(opChan[ch].vol&0x7f))/127));
|
rWrite(baseAddr+0x40,127-(((127-op.tl)*(opChan[ch].vol&0x7f))/127));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+0x40,op.tl);
|
rWrite(baseAddr+0x40,op.tl);
|
||||||
|
@ -313,7 +315,47 @@ void DivPlatformGenesisExt::tick() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformGenesisExt::forceIns() {
|
void DivPlatformGenesisExt::forceIns() {
|
||||||
DivPlatformGenesis::forceIns();
|
for (int i=0; i<6; i++) {
|
||||||
|
for (int j=0; j<4; j++) {
|
||||||
|
unsigned short baseAddr=chanOffs[i]|opOffs[j];
|
||||||
|
DivInstrumentFM::Operator& op=chan[i].state.op[j];
|
||||||
|
if (i==2) { // extended channel
|
||||||
|
if (isOpMuted[j]) {
|
||||||
|
rWrite(baseAddr+0x40,127);
|
||||||
|
} else if (isOutput[chan[i].state.alg][j]) {
|
||||||
|
rWrite(baseAddr+0x40,127-(((127-op.tl)*(opChan[j].vol&0x7f))/127));
|
||||||
|
} else {
|
||||||
|
rWrite(baseAddr+0x40,op.tl);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isMuted[i]) {
|
||||||
|
rWrite(baseAddr+ADDR_TL,127);
|
||||||
|
} else {
|
||||||
|
if (isOutput[chan[i].state.alg][j]) {
|
||||||
|
rWrite(baseAddr+ADDR_TL,127-(((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));
|
||||||
|
rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7));
|
||||||
|
rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31);
|
||||||
|
rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4));
|
||||||
|
rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15);
|
||||||
|
}
|
||||||
|
rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3));
|
||||||
|
rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4));
|
||||||
|
if (chan[i].active) {
|
||||||
|
chan[i].keyOn=true;
|
||||||
|
chan[i].freqChanged=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dacMode) {
|
||||||
|
rWrite(0x2b,0x80);
|
||||||
|
}
|
||||||
|
immWrite(0x22,lfoValue);
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
opChan[i].insChanged=true;
|
opChan[i].insChanged=true;
|
||||||
if (opChan[i].active) {
|
if (opChan[i].active) {
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "ym2610shared.h"
|
#include "ym2610shared.h"
|
||||||
|
#include "fmshared_OPN.h"
|
||||||
|
|
||||||
int DivPlatformYM2610BExt::dispatch(DivCommand c) {
|
int DivPlatformYM2610BExt::dispatch(DivCommand c) {
|
||||||
if (c.chan<2) {
|
if (c.chan<2) {
|
||||||
|
@ -275,7 +276,49 @@ void DivPlatformYM2610BExt::muteChannel(int ch, bool mute) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformYM2610BExt::forceIns() {
|
void DivPlatformYM2610BExt::forceIns() {
|
||||||
DivPlatformYM2610B::forceIns();
|
for (int i=0; i<6; i++) {
|
||||||
|
for (int j=0; j<4; j++) {
|
||||||
|
unsigned short baseAddr=chanOffs[i]|opOffs[j];
|
||||||
|
DivInstrumentFM::Operator& op=chan[i].state.op[j];
|
||||||
|
if (i==2) { // extended channel
|
||||||
|
if (isOpMuted[j]) {
|
||||||
|
rWrite(baseAddr+0x40,127);
|
||||||
|
} else if (isOutput[chan[i].state.alg][j]) {
|
||||||
|
rWrite(baseAddr+0x40,127-(((127-op.tl)*(opChan[j].vol&0x7f))/127));
|
||||||
|
} else {
|
||||||
|
rWrite(baseAddr+0x40,op.tl);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isMuted[i]) {
|
||||||
|
rWrite(baseAddr+ADDR_TL,127);
|
||||||
|
} else {
|
||||||
|
if (isOutput[chan[i].state.alg][j]) {
|
||||||
|
rWrite(baseAddr+ADDR_TL,127-(((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));
|
||||||
|
rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7));
|
||||||
|
rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31);
|
||||||
|
rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4));
|
||||||
|
rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15);
|
||||||
|
}
|
||||||
|
rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3));
|
||||||
|
rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4));
|
||||||
|
if (chan[i].active) {
|
||||||
|
chan[i].keyOn=true;
|
||||||
|
chan[i].freqChanged=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i=6; i<16; i++) {
|
||||||
|
chan[i].insChanged=true;
|
||||||
|
}
|
||||||
|
immWrite(0x0b,ayEnvPeriod);
|
||||||
|
immWrite(0x0c,ayEnvPeriod>>8);
|
||||||
|
immWrite(0x0d,ayEnvMode);
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
opChan[i].insChanged=true;
|
opChan[i].insChanged=true;
|
||||||
if (opChan[i].active) {
|
if (opChan[i].active) {
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "ym2610shared.h"
|
#include "ym2610shared.h"
|
||||||
|
#include "fmshared_OPN.h"
|
||||||
|
|
||||||
int DivPlatformYM2610Ext::dispatch(DivCommand c) {
|
int DivPlatformYM2610Ext::dispatch(DivCommand c) {
|
||||||
if (c.chan<1) {
|
if (c.chan<1) {
|
||||||
|
@ -275,7 +276,49 @@ void DivPlatformYM2610Ext::muteChannel(int ch, bool mute) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformYM2610Ext::forceIns() {
|
void DivPlatformYM2610Ext::forceIns() {
|
||||||
DivPlatformYM2610::forceIns();
|
for (int i=0; i<4; i++) {
|
||||||
|
for (int j=0; j<4; j++) {
|
||||||
|
unsigned short baseAddr=chanOffs[i]|opOffs[j];
|
||||||
|
DivInstrumentFM::Operator& op=chan[i].state.op[j];
|
||||||
|
if (i==1) { // extended channel
|
||||||
|
if (isOpMuted[j]) {
|
||||||
|
rWrite(baseAddr+0x40,127);
|
||||||
|
} else if (isOutput[chan[i].state.alg][j]) {
|
||||||
|
rWrite(baseAddr+0x40,127-(((127-op.tl)*(opChan[j].vol&0x7f))/127));
|
||||||
|
} else {
|
||||||
|
rWrite(baseAddr+0x40,op.tl);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (isMuted[i]) {
|
||||||
|
rWrite(baseAddr+ADDR_TL,127);
|
||||||
|
} else {
|
||||||
|
if (isOutput[chan[i].state.alg][j]) {
|
||||||
|
rWrite(baseAddr+ADDR_TL,127-(((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));
|
||||||
|
rWrite(baseAddr+ADDR_AM_DR,(op.dr&31)|(op.am<<7));
|
||||||
|
rWrite(baseAddr+ADDR_DT2_D2R,op.d2r&31);
|
||||||
|
rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4));
|
||||||
|
rWrite(baseAddr+ADDR_SSG,op.ssgEnv&15);
|
||||||
|
}
|
||||||
|
rWrite(chanOffs[i]+ADDR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3));
|
||||||
|
rWrite(chanOffs[i]+ADDR_LRAF,(isMuted[i]?0:(chan[i].pan<<6))|(chan[i].state.fms&7)|((chan[i].state.ams&3)<<4));
|
||||||
|
if (chan[i].active) {
|
||||||
|
chan[i].keyOn=true;
|
||||||
|
chan[i].freqChanged=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i=4; i<14; i++) {
|
||||||
|
chan[i].insChanged=true;
|
||||||
|
}
|
||||||
|
immWrite(0x0b,ayEnvPeriod);
|
||||||
|
immWrite(0x0c,ayEnvPeriod>>8);
|
||||||
|
immWrite(0x0d,ayEnvMode);
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
opChan[i].insChanged=true;
|
opChan[i].insChanged=true;
|
||||||
if (opChan[i].active) {
|
if (opChan[i].active) {
|
||||||
|
|
Loading…
Reference in New Issue