redo opnx csm
This commit is contained in:
parent
901bb110cc
commit
5f47166012
17 changed files with 572 additions and 147 deletions
|
|
@ -403,7 +403,7 @@ void DivPlatformYM2610B::acquire_combo(short** buf, size_t len) {
|
|||
buf[1][h]=os[1];
|
||||
|
||||
|
||||
for (int i=0; i<psgChanOffs; i++) {
|
||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||
oscBuf[i]->data[oscBuf[i]->needle++]=CLAMP(fm_nuked.ch_out[i]<<1,-32768,32767);
|
||||
}
|
||||
|
||||
|
|
@ -474,7 +474,7 @@ void DivPlatformYM2610B::acquire_ymfm(short** buf, size_t len) {
|
|||
buf[1][h]=os[1];
|
||||
|
||||
|
||||
for (int i=0; i<psgChanOffs; i++) {
|
||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||
int out=(fmChan[i]->debug_output(0)+fmChan[i]->debug_output(1))<<1;
|
||||
oscBuf[i]->data[oscBuf[i]->needle++]=CLAMP(out,-32768,32767);
|
||||
}
|
||||
|
|
@ -684,7 +684,7 @@ void DivPlatformYM2610B::acquire_lle(short** buf, size_t len) {
|
|||
|
||||
void DivPlatformYM2610B::tick(bool sysTick) {
|
||||
// FM
|
||||
for (int i=0; i<psgChanOffs; i++) {
|
||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||
if (i==2 && extMode) continue;
|
||||
chan[i].std.next();
|
||||
|
||||
|
|
@ -841,7 +841,7 @@ void DivPlatformYM2610B::tick(bool sysTick) {
|
|||
int hardResetElapsed=0;
|
||||
bool mustHardReset=false;
|
||||
|
||||
for (int i=0; i<psgChanOffs; i++) {
|
||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||
if (i==2 && extMode) continue;
|
||||
if (chan[i].keyOn || chan[i].keyOff) {
|
||||
immWrite(0x28,0x00|konOffs[i]);
|
||||
|
|
@ -857,7 +857,7 @@ void DivPlatformYM2610B::tick(bool sysTick) {
|
|||
}
|
||||
}
|
||||
|
||||
for (int i=0; i<psgChanOffs; i++) {
|
||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||
if (i==2 && extMode) continue;
|
||||
if (chan[i].freqChanged) {
|
||||
if (parent->song.linearPitch==2) {
|
||||
|
|
@ -1028,7 +1028,7 @@ void DivPlatformYM2610B::tick(bool sysTick) {
|
|||
for (unsigned int i=hardResetElapsed; i<hardResetCycles; i++) {
|
||||
immWrite(0xf0,i&0xff);
|
||||
}
|
||||
for (int i=0; i<psgChanOffs; i++) {
|
||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||
if (i==2 && extMode) continue;
|
||||
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
|
||||
// restore SL/RR
|
||||
|
|
@ -1239,6 +1239,20 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
|
|||
break;
|
||||
}
|
||||
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM);
|
||||
if (c.chan==csmChan && extMode) { // CSM
|
||||
chan[c.chan].macroInit(ins);
|
||||
chan[c.chan].insChanged=false;
|
||||
|
||||
if (c.value!=DIV_NOTE_NULL) {
|
||||
chan[c.chan].baseFreq=NOTE_PERIODIC(c.value);
|
||||
chan[c.chan].portaPause=false;
|
||||
chan[c.chan].note=c.value;
|
||||
chan[c.chan].freqChanged=true;
|
||||
}
|
||||
chan[c.chan].keyOn=true;
|
||||
chan[c.chan].active=true;
|
||||
break;
|
||||
}
|
||||
chan[c.chan].macroInit(ins);
|
||||
if (c.chan<6) {
|
||||
if (!chan[c.chan].std.vol.will) {
|
||||
|
|
@ -1343,6 +1357,29 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
|
|||
break;
|
||||
}
|
||||
case DIV_CMD_NOTE_PORTA: {
|
||||
if (c.chan==csmChan) {
|
||||
int destFreq=NOTE_PERIODIC(c.value2);
|
||||
bool return2=false;
|
||||
if (destFreq>chan[c.chan].baseFreq) {
|
||||
chan[c.chan].baseFreq+=c.value;
|
||||
if (chan[c.chan].baseFreq>=destFreq) {
|
||||
chan[c.chan].baseFreq=destFreq;
|
||||
return2=true;
|
||||
}
|
||||
} else {
|
||||
chan[c.chan].baseFreq-=c.value;
|
||||
if (chan[c.chan].baseFreq<=destFreq) {
|
||||
chan[c.chan].baseFreq=destFreq;
|
||||
return2=true;
|
||||
}
|
||||
}
|
||||
chan[c.chan].freqChanged=true;
|
||||
if (return2) {
|
||||
chan[c.chan].inPorta=false;
|
||||
return 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (c.chan>=psgChanOffs || parent->song.linearPitch==2) { // PSG, ADPCM-B
|
||||
int destFreq=NOTE_OPNB(c.chan,c.value2+chan[c.chan].sampleNoteDelta);
|
||||
bool return2=false;
|
||||
|
|
@ -1378,7 +1415,10 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
|
|||
break;
|
||||
case DIV_CMD_LEGATO: {
|
||||
if (c.chan==adpcmBChanOffs && !chan[c.chan].furnacePCM) break;
|
||||
if (c.chan<=psgChanOffs) {
|
||||
if (c.chan==csmChan) {
|
||||
chan[c.chan].baseFreq=NOTE_PERIODIC(c.value);
|
||||
}
|
||||
if (c.chan<=(psgChanOffs-isCSM)) {
|
||||
if (chan[c.chan].insChanged) {
|
||||
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM);
|
||||
commitState(c.chan,ins);
|
||||
|
|
@ -1794,7 +1834,7 @@ bool DivPlatformYM2610B::keyOffAffectsArp(int ch) {
|
|||
}
|
||||
|
||||
void DivPlatformYM2610B::notifyInsChange(int ins) {
|
||||
for (int i=0; i<16; i++) {
|
||||
for (int i=0; i<17; i++) {
|
||||
if (chan[i].ins==ins) {
|
||||
chan[i].insChanged=true;
|
||||
}
|
||||
|
|
@ -1804,7 +1844,7 @@ void DivPlatformYM2610B::notifyInsChange(int ins) {
|
|||
|
||||
void DivPlatformYM2610B::notifyInsDeletion(void* ins) {
|
||||
ay->notifyInsDeletion(ins);
|
||||
for (int i=0; i<psgChanOffs; i++) {
|
||||
for (int i=0; i<(psgChanOffs-isCSM); i++) {
|
||||
chan[i].std.notifyInsDeletion((DivInstrument*)ins);
|
||||
}
|
||||
for (int i=adpcmAChanOffs; i<chanNum; i++) {
|
||||
|
|
@ -1820,7 +1860,20 @@ void DivPlatformYM2610B::setSkipRegisterWrites(bool value) {
|
|||
int DivPlatformYM2610B::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {
|
||||
DivPlatformYM2610Base::init(p, channels, sugRate, flags);
|
||||
reset();
|
||||
return 16;
|
||||
return 17;
|
||||
}
|
||||
|
||||
void DivPlatformYM2610B::setCSM(bool isCSM) {
|
||||
this->isCSM=isCSM;
|
||||
psgChanOffs=6+isCSM; // doing this hurts me...
|
||||
adpcmAChanOffs=9+isCSM;
|
||||
adpcmBChanOffs=15+isCSM;
|
||||
chanNum=16+isCSM;
|
||||
if (isCSM) {
|
||||
csmChan=6;
|
||||
} else {
|
||||
csmChan=16;
|
||||
}
|
||||
}
|
||||
|
||||
void DivPlatformYM2610B::quit() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue