Code review suggestions
Haven't had a good peer review in ages.
This commit is contained in:
parent
59d56b169b
commit
170248e61a
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -35,4 +35,3 @@ res/docpdf/manual.pdf
|
||||||
res/docpdf/.venv
|
res/docpdf/.venv
|
||||||
res/docpdf/htmldoc/
|
res/docpdf/htmldoc/
|
||||||
res/furnace.appdata.xml
|
res/furnace.appdata.xml
|
||||||
compile_commands.json
|
|
||||||
|
|
2
extern/ESFMu/.clangd
vendored
2
extern/ESFMu/.clangd
vendored
|
@ -1,2 +0,0 @@
|
||||||
CompileFlags:
|
|
||||||
Add: ["-xc", "-Wall", "-Wextra"]
|
|
|
@ -26,14 +26,14 @@
|
||||||
|
|
||||||
#define CHIP_FREQBASE (32768*288)
|
#define CHIP_FREQBASE (32768*288)
|
||||||
|
|
||||||
#define OFFSET_AM_VIB_SUS_KSR_MULT 0x00
|
#define ADDR_AM_VIB_SUS_KSR_MULT 0x00
|
||||||
#define OFFSET_KSL_TL 0x01
|
#define ADDR_KSL_TL 0x01
|
||||||
#define OFFSET_AR_DR 0x02
|
#define ADDR_AR_DR 0x02
|
||||||
#define OFFSET_SL_RR 0x03
|
#define ADDR_SL_RR 0x03
|
||||||
#define OFFSET_FREQL 0x04
|
#define ADDR_FREQL 0x04
|
||||||
#define OFFSET_FREQH_BLOCK_DELAY 0x05
|
#define ADDR_FREQH_BLOCK_DELAY 0x05
|
||||||
#define OFFSET_DAM_DVB_LEFT_RIGHT_MODIN 0x06
|
#define ADDR_DAM_DVB_LEFT_RIGHT_MODIN 0x06
|
||||||
#define OFFSET_OUTLVL_NOISE_WS 0x07
|
#define ADDR_OUTLVL_NOISE_WS 0x07
|
||||||
|
|
||||||
#define KEY_ON_REGS_START (18*8*4)
|
#define KEY_ON_REGS_START (18*8*4)
|
||||||
|
|
||||||
|
@ -72,13 +72,13 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
unsigned char noise=chan[i].state.esfm.noise&3;
|
unsigned char noise=chan[i].state.esfm.noise&3;
|
||||||
|
|
||||||
if (isMuted[i]) {
|
if (isMuted[i]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
if (KVS(i, o)) {
|
if (KVS(i,o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
unsigned short baseAddr=i*32+o*8;
|
unsigned short baseAddr=i*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o];
|
||||||
DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[o];
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,17 +120,16 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chan[i].std.duty.had) {
|
if (chan[i].std.duty.had) {
|
||||||
int o=3;
|
unsigned short baseAddr=i*32+3*8;
|
||||||
unsigned short baseAddr=i*32+o*8;
|
|
||||||
DivInstrumentESFM& ins=chan[i].state.esfm;
|
DivInstrumentESFM& ins=chan[i].state.esfm;
|
||||||
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[i].state.fm.op[3];
|
||||||
DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[i].state.esfm.op[3];
|
||||||
ins.noise=chan[i].std.duty.val;
|
ins.noise=chan[i].std.duty.val;
|
||||||
|
|
||||||
if (isMuted[i]) {
|
if (isMuted[i]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?ins.noise&3:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((ins.noise&3)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?ins.noise&3:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((ins.noise&3)<<3)|((opE.outLvl&7)<<5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,40 +141,40 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
|
|
||||||
if (m.am.had) {
|
if (m.am.had) {
|
||||||
op.am=m.am.val;
|
op.am=m.am.val;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
if (m.vib.had) {
|
if (m.vib.had) {
|
||||||
op.vib=m.vib.val;
|
op.vib=m.vib.val;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
if (m.sus.had) {
|
if (m.sus.had) {
|
||||||
op.sus=m.sus.val;
|
op.sus=m.sus.val;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
if (m.ksr.had) {
|
if (m.ksr.had) {
|
||||||
op.ksr=m.ksr.val;
|
op.ksr=m.ksr.val;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
if (m.mult.had) {
|
if (m.mult.had) {
|
||||||
op.mult=m.mult.val;
|
op.mult=m.mult.val;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.ar.had) {
|
if (m.ar.had) {
|
||||||
op.ar=m.ar.val;
|
op.ar=m.ar.val;
|
||||||
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
||||||
}
|
}
|
||||||
if (m.dr.had) {
|
if (m.dr.had) {
|
||||||
op.dr=m.dr.val;
|
op.dr=m.dr.val;
|
||||||
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
||||||
}
|
}
|
||||||
if (m.sl.had) {
|
if (m.sl.had) {
|
||||||
op.sl=m.sl.val;
|
op.sl=m.sl.val;
|
||||||
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
}
|
}
|
||||||
if (m.rr.had) {
|
if (m.rr.had) {
|
||||||
op.rr=m.rr.val;
|
op.rr=m.rr.val;
|
||||||
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.tl.had || m.ksl.had) {
|
if (m.tl.had || m.ksl.had) {
|
||||||
|
@ -187,30 +186,30 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (KVS(i, o)) {
|
if (KVS(i, o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[i].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.dam.had) {
|
if (m.dam.had) {
|
||||||
op.dam=m.dam.val;
|
op.dam=m.dam.val;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
if (m.dvb.had) {
|
if (m.dvb.had) {
|
||||||
op.dvb=m.dvb.val;
|
op.dvb=m.dvb.val;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
if (m.rs.had) {
|
if (m.rs.had) {
|
||||||
// operator panning
|
// operator panning
|
||||||
opE.left=(m.rs.val&2)!=0;
|
opE.left=(m.rs.val&2)!=0;
|
||||||
opE.right=(m.rs.val&1)!=0;
|
opE.right=(m.rs.val&1)!=0;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
if (m.d2r.had) {
|
if (m.d2r.had) {
|
||||||
// modIn
|
// modIn
|
||||||
opE.modIn=m.d2r.val;
|
opE.modIn=m.d2r.val;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[i].globalPan)&1)<<4)|(((opE.right&(chan[i].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.egt.had | m.ws.had) {
|
if (m.egt.had | m.ws.had) {
|
||||||
|
@ -224,9 +223,9 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMuted[i]) {
|
if (isMuted[i]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,7 +252,7 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
if (m.dt2.had) {
|
if (m.dt2.had) {
|
||||||
opE.delay=m.dt2.val;
|
opE.delay=m.dt2.val;
|
||||||
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5));
|
rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -285,7 +284,7 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
// logI("chan[%d] hard reset, slrr := 0x0f", i);
|
// logI("chan[%d] hard reset, slrr := 0x0f", i);
|
||||||
for (int o=0; o<4; o++) {
|
for (int o=0; o<4; o++) {
|
||||||
unsigned short baseAddr=i*32+o*8;
|
unsigned short baseAddr=i*32+o*8;
|
||||||
immWrite(baseAddr+OFFSET_SL_RR,0x0f);
|
immWrite(baseAddr+ADDR_SL_RR,0x0f);
|
||||||
hardResetElapsed++;
|
hardResetElapsed++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -313,8 +312,8 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
chan[i].freqL[o]=freqt&0xff;
|
chan[i].freqL[o]=freqt&0xff;
|
||||||
chan[i].freqH[o]=freqt>>8;
|
chan[i].freqH[o]=freqt>>8;
|
||||||
}
|
}
|
||||||
immWrite(baseAddr+OFFSET_FREQL,chan[i].freqL[o]);
|
immWrite(baseAddr+ADDR_FREQL,chan[i].freqL[o]);
|
||||||
immWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5));
|
immWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[i].freqH[o]|(opE.delay<<5));
|
||||||
hardResetElapsed+=2;
|
hardResetElapsed+=2;
|
||||||
}
|
}
|
||||||
chan[i].freqChanged=false;
|
chan[i].freqChanged=false;
|
||||||
|
@ -342,7 +341,7 @@ void DivPlatformESFM::tick(bool sysTick) {
|
||||||
for (int o=0; o<4; o++) {
|
for (int o=0; o<4; o++) {
|
||||||
unsigned short baseAddr=i*32+o*8;
|
unsigned short baseAddr=i*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[i].state.fm.op[o];
|
||||||
immWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
immWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
}
|
}
|
||||||
if (i<16) {
|
if (i<16) {
|
||||||
immWrite(KEY_ON_REGS_START+i, 1);
|
immWrite(KEY_ON_REGS_START+i, 1);
|
||||||
|
@ -385,13 +384,13 @@ void DivPlatformESFM::muteChannel(int ch, bool mute) {
|
||||||
unsigned char noise=chan[ch].state.esfm.noise&3;
|
unsigned char noise=chan[ch].state.esfm.noise&3;
|
||||||
|
|
||||||
if (isMuted[ch]) {
|
if (isMuted[ch]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
if (KVS(ch, o)) {
|
if (KVS(ch,o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -408,21 +407,21 @@ void DivPlatformESFM::commitState(int ch, DivInstrument* ins) {
|
||||||
unsigned char noise=chan[ch].state.esfm.noise&3;
|
unsigned char noise=chan[ch].state.esfm.noise&3;
|
||||||
|
|
||||||
if (isMuted[ch]) {
|
if (isMuted[ch]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
if (KVS(ch, o)) {
|
if (KVS(ch,o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[ch].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
||||||
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[ch].freqH[o]|(opE.delay<<5));
|
rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[ch].freqH[o]|(opE.delay<<5));
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[ch].globalPan)&1)<<4)|(((opE.right&(chan[ch].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[ch].globalPan)&1)<<4)|(((opE.right&(chan[ch].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -471,10 +470,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
for (int o=0; o<4; o++) {
|
for (int o=0; o<4; o++) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
if (KVS(c.chan, o)) {
|
if (KVS(c.chan,o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -494,7 +493,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -551,7 +550,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.mult=c.value2&15;
|
op.mult=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_FM_TL: {
|
case DIV_CMD_FM_TL: {
|
||||||
|
@ -560,10 +559,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.tl=c.value2&63;
|
op.tl=c.value2&63;
|
||||||
if (KVS(c.chan, o)) {
|
if (KVS(c.chan,o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -573,7 +572,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.ar=c.value2&15;
|
op.ar=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -581,7 +580,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.ar=c.value2&15;
|
op.ar=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -591,7 +590,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.dr=c.value2&15;
|
op.dr=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -599,7 +598,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.dr=c.value2&15;
|
op.dr=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
rWrite(baseAddr+ADDR_AR_DR,(op.ar<<4)|(op.dr&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -609,7 +608,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.sl=c.value2&15;
|
op.sl=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -617,7 +616,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.sl=c.value2&15;
|
op.sl=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -627,7 +626,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.rr=c.value2&15;
|
op.rr=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -635,7 +634,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.rr=c.value2&15;
|
op.rr=c.value2&15;
|
||||||
rWrite(baseAddr+OFFSET_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
rWrite(baseAddr+ADDR_SL_RR,(op.sl<<4)|(op.rr&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -645,7 +644,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.am=c.value2&1;
|
op.am=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -653,7 +652,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.am=c.value2&1;
|
op.am=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -663,7 +662,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.vib=c.value2&1;
|
op.vib=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -671,7 +670,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.vib=c.value2&1;
|
op.vib=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -681,7 +680,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.sus=c.value2&1;
|
op.sus=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -689,7 +688,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.sus=c.value2&1;
|
op.sus=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -699,7 +698,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.ksr=c.value2&1;
|
op.ksr=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -707,7 +706,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.ksr=c.value2&1;
|
op.ksr=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
rWrite(baseAddr+ADDR_AM_VIB_SUS_KSR_MULT,((op.am&1)<<7)|((op.vib&1)<<6)|((op.sus&1)<<5)|((op.ksr&1)<<4)|(op.mult&0xf));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -720,9 +719,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
||||||
op.ws=c.value2&7;
|
op.ws=c.value2&7;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -734,9 +733,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
||||||
op.ws=c.value2&7;
|
op.ws=c.value2&7;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -748,10 +747,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.ksl=c.value2&3;
|
op.ksl=c.value2&3;
|
||||||
if (KVS(c.chan, o)) {
|
if (KVS(c.chan,o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -760,10 +759,10 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
op.ksl=c.value2&3;
|
op.ksl=c.value2&3;
|
||||||
if (KVS(c.chan, o)) {
|
if (KVS(c.chan,o)) {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(63-VOL_SCALE_LOG_BROKEN(63-op.tl,chan[c.chan].outVol&0x3f,63))|(op.ksl<<6));
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
rWrite(baseAddr+ADDR_KSL_TL,(op.tl&0x3f)|(op.ksl<<6));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -775,7 +774,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
op.dam=c.value2&1;
|
op.dam=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_FM_PM_DEPTH: {
|
case DIV_CMD_FM_PM_DEPTH: {
|
||||||
|
@ -785,7 +784,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
op.dvb=c.value2&1;
|
op.dvb=c.value2&1;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_FM_FIXFREQ: {
|
case DIV_CMD_FM_FIXFREQ: {
|
||||||
|
@ -809,9 +808,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
opE.left=c.value2&1;
|
opE.left=(c.value2&0xf0)!=0;
|
||||||
opE.right=(c.value2&2)>>1;
|
opE.right=(c.value2&0x0f)!=0;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_ESFM_OUTLVL: {
|
case DIV_CMD_ESFM_OUTLVL: {
|
||||||
|
@ -823,9 +822,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
||||||
opE.outLvl=c.value2&7;
|
opE.outLvl=c.value2&7;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -837,9 +836,9 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
unsigned char noise=chan[c.chan].state.esfm.noise&3;
|
||||||
opE.outLvl=c.value2&7;
|
opE.outLvl=c.value2&7;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|((o==3?noise:0)<<3)|((opE.outLvl&7)<<5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -851,7 +850,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
opE.modIn=c.value2&7;
|
opE.modIn=c.value2&7;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -860,7 +859,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
opE.modIn=c.value2&7;
|
opE.modIn=c.value2&7;
|
||||||
rWrite(baseAddr+OFFSET_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
rWrite(baseAddr+ADDR_DAM_DVB_LEFT_RIGHT_MODIN,((opE.modIn&7)<<1)|(((opE.left&chan[c.chan].globalPan)&1)<<4)|(((opE.right&(chan[c.chan].globalPan>>1))&1)<<5)|((op.dvb&1)<<6)|(op.dam<<7));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -870,7 +869,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
opE.delay=c.value2&7;
|
opE.delay=c.value2&7;
|
||||||
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5));
|
rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned int o=c.value;
|
unsigned int o=c.value;
|
||||||
|
@ -878,21 +877,20 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
unsigned short baseAddr=c.chan*32+o*8;
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
opE.delay=c.value2&7;
|
opE.delay=c.value2&7;
|
||||||
rWrite(baseAddr+OFFSET_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5));
|
rWrite(baseAddr+ADDR_FREQH_BLOCK_DELAY,chan[c.chan].freqH[o]|(opE.delay<<5));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DIV_CMD_STD_NOISE_MODE: {
|
case DIV_CMD_STD_NOISE_MODE: {
|
||||||
unsigned int o=3;
|
unsigned short baseAddr=c.chan*32+3*8;
|
||||||
unsigned short baseAddr=c.chan*32+o*8;
|
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[3];
|
||||||
DivInstrumentFM::Operator& op=chan[c.chan].state.fm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[3];
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
|
||||||
DivInstrumentESFM insE=chan[c.chan].state.esfm;
|
DivInstrumentESFM insE=chan[c.chan].state.esfm;
|
||||||
insE.noise=c.value&3;
|
insE.noise=c.value&3;
|
||||||
if (isMuted[c.chan]) {
|
if (isMuted[c.chan]) {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|0);
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|0);
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+OFFSET_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|((opE.outLvl&7)<<5));
|
rWrite(baseAddr+ADDR_OUTLVL_NOISE_WS,(op.ws&7)|(insE.noise<<3)|((opE.outLvl&7)<<5));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -901,7 +899,7 @@ int DivPlatformESFM::dispatch(DivCommand c) {
|
||||||
if (o >= 4) break;
|
if (o >= 4) break;
|
||||||
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
DivInstrumentESFM::Operator& opE=chan[c.chan].state.esfm.op[o];
|
||||||
if (opE.fixed) break;
|
if (opE.fixed) break;
|
||||||
opE.dt=c.value2;
|
opE.dt=c.value2-0x80;
|
||||||
chan[c.chan].freqChanged=true;
|
chan[c.chan].freqChanged=true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1032,8 +1030,8 @@ void DivPlatformESFM::poke(std::vector<DivRegWrite>& wlist) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformESFM::setFlags(const DivConfig& flags) {
|
void DivPlatformESFM::setFlags(const DivConfig& flags) {
|
||||||
rate=49716;
|
|
||||||
chipClock=COLOR_NTSC*4.0;
|
chipClock=COLOR_NTSC*4.0;
|
||||||
|
rate=chipClock/288.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DivPlatformESFM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {
|
int DivPlatformESFM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
|
|
||||||
// ESFM register address space technically spans 0x800 (2048) bytes,
|
// ESFM register address space technically spans 0x800 (2048) bytes,
|
||||||
// but we only need the first 0x254 (596) during normal use.
|
// but we only need the first 0x254 (596) during normal use.
|
||||||
// Rounding it up to 0x260 (608) bytes, the nearest multiple of 16.
|
// Rounding it up to 0x400 bytes, the nearest power of 2.
|
||||||
#define ESFM_REG_POOL_SIZE 0x260
|
#define ESFM_REG_POOL_SIZE 0x400
|
||||||
|
|
||||||
class DivPlatformESFM: public DivDispatch {
|
class DivPlatformESFM: public DivDispatch {
|
||||||
struct Channel: public SharedChannel<int> {
|
struct Channel: public SharedChannel<int> {
|
||||||
|
|
|
@ -132,7 +132,6 @@ enum DivSystem {
|
||||||
DIV_SYSTEM_TED,
|
DIV_SYSTEM_TED,
|
||||||
DIV_SYSTEM_C140,
|
DIV_SYSTEM_C140,
|
||||||
DIV_SYSTEM_C219,
|
DIV_SYSTEM_C219,
|
||||||
DIV_SYSTEM_C352,
|
|
||||||
DIV_SYSTEM_ESFM
|
DIV_SYSTEM_ESFM
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -392,14 +392,6 @@ int negEffectVal(unsigned char, unsigned char val) {
|
||||||
return -(int)val;
|
return -(int)val;
|
||||||
};
|
};
|
||||||
|
|
||||||
int effectValNibbleFlagPackReversed(unsigned char, unsigned char val) {
|
|
||||||
return (((val&0x0f)!=0)<<1)|((val&0xf0)!=0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int effectValExcessOf80Hex(unsigned char, unsigned char val) {
|
|
||||||
return val-0x80;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<const int mask> int effectValAnd(unsigned char, unsigned char val) {
|
template<const int mask> int effectValAnd(unsigned char, unsigned char val) {
|
||||||
return val&mask;
|
return val&mask;
|
||||||
};
|
};
|
||||||
|
@ -635,20 +627,20 @@ void DivEngine::registerSystems() {
|
||||||
{0x1b, {DIV_CMD_FM_AR, "1Bxx: Set attack of operator 2 (0 to F)", constVal<1>, effectValAnd<15>}},
|
{0x1b, {DIV_CMD_FM_AR, "1Bxx: Set attack of operator 2 (0 to F)", constVal<1>, effectValAnd<15>}},
|
||||||
{0x1c, {DIV_CMD_FM_AR, "1Cxx: Set attack of operator 3 (0 to F)", constVal<2>, effectValAnd<15>}},
|
{0x1c, {DIV_CMD_FM_AR, "1Cxx: Set attack of operator 3 (0 to F)", constVal<2>, effectValAnd<15>}},
|
||||||
{0x1d, {DIV_CMD_FM_AR, "1Dxx: Set attack of operator 4 (0 to F)", constVal<3>, effectValAnd<15>}},
|
{0x1d, {DIV_CMD_FM_AR, "1Dxx: Set attack of operator 4 (0 to F)", constVal<3>, effectValAnd<15>}},
|
||||||
{0x20, {DIV_CMD_ESFM_OP_PANNING, "20xy: Set panning of operator 1 (x: left; y: right)", constVal<0>, effectValNibbleFlagPackReversed}},
|
{0x20, {DIV_CMD_ESFM_OP_PANNING, "20xy: Set panning of operator 1 (x: left; y: right)", constVal<0>, effectVal}},
|
||||||
{0x21, {DIV_CMD_ESFM_OP_PANNING, "21xy: Set panning of operator 2 (x: left; y: right)", constVal<1>, effectValNibbleFlagPackReversed}},
|
{0x21, {DIV_CMD_ESFM_OP_PANNING, "21xy: Set panning of operator 2 (x: left; y: right)", constVal<1>, effectVal}},
|
||||||
{0x22, {DIV_CMD_ESFM_OP_PANNING, "22xy: Set panning of operator 3 (x: left; y: right)", constVal<2>, effectValNibbleFlagPackReversed}},
|
{0x22, {DIV_CMD_ESFM_OP_PANNING, "22xy: Set panning of operator 3 (x: left; y: right)", constVal<2>, effectVal}},
|
||||||
{0x23, {DIV_CMD_ESFM_OP_PANNING, "23xy: Set panning of operator 4 (x: left; y: right)", constVal<3>, effectValNibbleFlagPackReversed}},
|
{0x23, {DIV_CMD_ESFM_OP_PANNING, "23xy: Set panning of operator 4 (x: left; y: right)", constVal<3>, effectVal}},
|
||||||
{0x24, {DIV_CMD_ESFM_OUTLVL, "24xy: Set output level register (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
{0x24, {DIV_CMD_ESFM_OUTLVL, "24xy: Set output level register (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
||||||
{0x25, {DIV_CMD_ESFM_MODIN, "25xy: Set modulation input level (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
{0x25, {DIV_CMD_ESFM_MODIN, "25xy: Set modulation input level (x: operator from 1 to 4 (0 for all ops); y: level from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
||||||
{0x26, {DIV_CMD_ESFM_ENV_DELAY, "26xy: Set envelope delay (x: operator from 1 to 4 (0 for all ops); y: delay from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
{0x26, {DIV_CMD_ESFM_ENV_DELAY, "26xy: Set envelope delay (x: operator from 1 to 4 (0 for all ops); y: delay from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
||||||
{0x27, {DIV_CMD_STD_NOISE_MODE, "27xx: Set noise mode for operator 4 (x: mode from 0 to 3)", effectValAnd<3>}},
|
{0x27, {DIV_CMD_STD_NOISE_MODE, "27xx: Set noise mode for operator 4 (x: mode from 0 to 3)", effectValAnd<3>}},
|
||||||
{0x2a, {DIV_CMD_FM_WS, "2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
{0x2a, {DIV_CMD_FM_WS, "2Axy: Set waveform (x: operator from 1 to 4 (0 for all ops); y: waveform from 0 to 7)", effectOpVal<4>, effectValAnd<7>}},
|
||||||
{0x2f, {DIV_CMD_FM_FIXFREQ, "2Fxy: Set fixed frequency block (x: operator from 1 to 4; y: octave from 0 to 7)", effectOpValNoZero<4>, effectValAnd<7>}},
|
{0x2f, {DIV_CMD_FM_FIXFREQ, "2Fxy: Set fixed frequency block (x: operator from 1 to 4; y: octave from 0 to 7)", effectOpValNoZero<4>, effectValAnd<7>}},
|
||||||
{0x40, {DIV_CMD_FM_DT, "40xx: Set detune of operator 1 (80: center)", constVal<0>, effectValExcessOf80Hex}},
|
{0x40, {DIV_CMD_FM_DT, "40xx: Set detune of operator 1 (80: center)", constVal<0>, effectVal}},
|
||||||
{0x41, {DIV_CMD_FM_DT, "41xx: Set detune of operator 2 (80: center)", constVal<1>, effectValExcessOf80Hex}},
|
{0x41, {DIV_CMD_FM_DT, "41xx: Set detune of operator 2 (80: center)", constVal<1>, effectVal}},
|
||||||
{0x42, {DIV_CMD_FM_DT, "42xx: Set detune of operator 3 (80: center)", constVal<2>, effectValExcessOf80Hex}},
|
{0x42, {DIV_CMD_FM_DT, "42xx: Set detune of operator 3 (80: center)", constVal<2>, effectVal}},
|
||||||
{0x43, {DIV_CMD_FM_DT, "43xx: Set detune of operator 4 (80: center)", constVal<3>, effectValExcessOf80Hex}},
|
{0x43, {DIV_CMD_FM_DT, "43xx: Set detune of operator 4 (80: center)", constVal<3>, effectVal}},
|
||||||
{0x50, {DIV_CMD_FM_AM, "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)", effectOpVal<4>, effectValAnd<1>}},
|
{0x50, {DIV_CMD_FM_AM, "50xy: Set AM (x: operator from 1 to 4 (0 for all ops); y: AM)", effectOpVal<4>, effectValAnd<1>}},
|
||||||
{0x51, {DIV_CMD_FM_SL, "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)", effectOpVal<4>, effectValAnd<15>}},
|
{0x51, {DIV_CMD_FM_SL, "51xy: Set sustain level (x: operator from 1 to 4 (0 for all ops); y: sustain)", effectOpVal<4>, effectValAnd<15>}},
|
||||||
{0x52, {DIV_CMD_FM_RR, "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)", effectOpVal<4>, effectValAnd<15>}},
|
{0x52, {DIV_CMD_FM_RR, "52xy: Set release (x: operator from 1 to 4 (0 for all ops); y: release)", effectOpVal<4>, effectValAnd<15>}},
|
||||||
|
@ -1980,7 +1972,7 @@ void DivEngine::registerSystems() {
|
||||||
|
|
||||||
sysDefs[DIV_SYSTEM_ESFM]=new DivSysDef(
|
sysDefs[DIV_SYSTEM_ESFM]=new DivSysDef(
|
||||||
"ESS ES1xxx series (ESFM)", NULL, 0xd1, 0, 18, true, false, 0, false, 0,
|
"ESS ES1xxx series (ESFM)", NULL, 0xd1, 0, 18, true, false, 0, false, 0,
|
||||||
"A unique FM synth featured in PC sound cards.\nBased on the OPL3 design, but with lots of its features extended.",
|
"a unique FM synth featured in PC sound cards.\nbased on the OPL3 design, but with lots of its features extended.",
|
||||||
{"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "FM 7", "FM 8", "FM 9", "FM 10", "FM 11", "FM 12", "FM 13", "FM 14", "FM 15", "FM 16", "FM 17", "FM 18"},
|
{"FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "FM 7", "FM 8", "FM 9", "FM 10", "FM 11", "FM 12", "FM 13", "FM 14", "FM 15", "FM 16", "FM 17", "FM 18"},
|
||||||
{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"},
|
{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"},
|
||||||
{DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM},
|
{DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM, DIV_CH_FM},
|
||||||
|
|
|
@ -49,7 +49,7 @@ const char* esfmParamLongNames[9]={
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* esfmParamNames[9]={
|
const char* esfmParamNames[9]={
|
||||||
"OP4 Noise Mode", "Env. Delay", "Output Level", "ModInput", "Left", "Right", "Coarse Tn.", "Detune", "Fixed"
|
"OP4 Noise Mode", "Env. Delay", "Output Level", "ModInput", "Left", "Right", "Tune", "Detune", "Fixed"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* esfmParamShortNames[9]={
|
const char* esfmParamShortNames[9]={
|
||||||
|
|
Loading…
Reference in a new issue