µPD1771C: unification work...

This commit is contained in:
tildearrow 2025-03-10 04:11:26 -05:00
parent d853c59b3d
commit f49395194b
2 changed files with 33 additions and 43 deletions

View file

@ -71,18 +71,14 @@ void DivPlatformSCV::tick(bool sysTick) {
} else if (chan[i].std.arp.had) { } else if (chan[i].std.arp.had) {
if (!chan[i].inPorta) { if (!chan[i].inPorta) {
int f=parent->calcArp(chan[i].note,chan[i].std.arp.val); int f=parent->calcArp(chan[i].note,chan[i].std.arp.val);
if (i==3 && !waveMode) {
chan[i].baseFreq=f;
} else {
chan[i].baseFreq=NOTE_PERIODIC(f); chan[i].baseFreq=NOTE_PERIODIC(f);
} }
}
chan[i].freqChanged=true; chan[i].freqChanged=true;
} }
if (chan[i].std.wave.had) { if (chan[i].std.wave.had) {
chan[i].wave=chan[i].std.wave.val&7; chan[i].wave=chan[i].std.wave.val&7;
} }
if (chan[i].std.duty.had) { if (chan[i].std.duty.had && i==3) {
waveMode=chan[i].std.duty.val&1; waveMode=chan[i].std.duty.val&1;
} }
if (chan[i].std.ex1.had) { if (chan[i].std.ex1.had) {
@ -98,18 +94,12 @@ void DivPlatformSCV::tick(bool sysTick) {
chan[i].freqChanged=true; chan[i].freqChanged=true;
} }
if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) {
if (i==3) {
if (waveMode) { if (waveMode) {
if (i==3) {
chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER); chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER);
}
if (chan[i].keyOn) kon[i]=1;
if (chan[i].keyOff) kon[i]=0;
if (chan[i].keyOn) chan[i].keyOn=false;
if (chan[i].keyOff) chan[i].keyOff=false;
chan[i].freqChanged=false;
} else { } else {
if (i==3) {
chan[i].freq=(chan[i].baseFreq+chan[i].pitch+chan[i].pitch2+143); chan[i].freq=(chan[i].baseFreq+chan[i].pitch+chan[i].pitch2+143);
}
if (!parent->song.oldArpStrategy) { if (!parent->song.oldArpStrategy) {
if (chan[i].fixedArp) { if (chan[i].fixedArp) {
chan[i].freq=(chan[i].baseNoteOverride)+chan[i].pitch+chan[i].pitch2; chan[i].freq=(chan[i].baseNoteOverride)+chan[i].pitch+chan[i].pitch2;
@ -121,6 +111,10 @@ void DivPlatformSCV::tick(bool sysTick) {
chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER); chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER);
} }
if (i==3) { if (i==3) {
if (waveMode) {
if (chan[i].keyOn) kon[i]=1;
if (chan[i].keyOff) kon[i]=0;
}
if (chan[i].freq<0) chan[i].freq=0; if (chan[i].freq<0) chan[i].freq=0;
} else { } else {
if (chan[i].freq<1) chan[i].freq=1; if (chan[i].freq<1) chan[i].freq=1;
@ -130,7 +124,6 @@ void DivPlatformSCV::tick(bool sysTick) {
if (chan[i].keyOff) chan[i].keyOff=false; if (chan[i].keyOff) chan[i].keyOff=false;
chan[i].freqChanged=false; chan[i].freqChanged=false;
} }
}
if (waveMode) { if (waveMode) {
if (kon[i]) { if (kon[i]) {
@ -185,7 +178,7 @@ int DivPlatformSCV::dispatch(DivCommand c) {
case DIV_CMD_NOTE_ON: { case DIV_CMD_NOTE_ON: {
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_UPD1771C); DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_UPD1771C);
if (c.value!=DIV_NOTE_NULL) { if (c.value!=DIV_NOTE_NULL) {
chan[c.chan].baseFreq=(c.chan==3 && !waveMode)?(c.value):NOTE_PERIODIC(c.value); chan[c.chan].baseFreq=NOTE_PERIODIC(c.value);
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
chan[c.chan].note=c.value; chan[c.chan].note=c.value;
} }
@ -236,7 +229,7 @@ int DivPlatformSCV::dispatch(DivCommand c) {
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;
case DIV_CMD_NOTE_PORTA: { case DIV_CMD_NOTE_PORTA: {
int destFreq=(c.chan==3 && !waveMode)?c.value2:(NOTE_PERIODIC(c.value2)); int destFreq=NOTE_PERIODIC(c.value2);
bool return2=false; bool return2=false;
if (destFreq>chan[c.chan].baseFreq) { if (destFreq>chan[c.chan].baseFreq) {
chan[c.chan].baseFreq+=c.value; chan[c.chan].baseFreq+=c.value;
@ -267,7 +260,7 @@ int DivPlatformSCV::dispatch(DivCommand c) {
break; break;
case DIV_CMD_LEGATO: { case DIV_CMD_LEGATO: {
int newNote=c.value+((HACKY_LEGATO_MESS)?(chan[c.chan].std.arp.val):(0)); int newNote=c.value+((HACKY_LEGATO_MESS)?(chan[c.chan].std.arp.val):(0));
chan[c.chan].baseFreq=(c.chan==3 && !waveMode)?newNote:(NOTE_PERIODIC(newNote)); chan[c.chan].baseFreq=NOTE_PERIODIC(newNote);
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
chan[c.chan].note=c.value; chan[c.chan].note=c.value;
break; break;
@ -277,12 +270,8 @@ int DivPlatformSCV::dispatch(DivCommand c) {
if (parent->song.resetMacroOnPorta) chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_UPD1771C)); if (parent->song.resetMacroOnPorta) chan[c.chan].macroInit(parent->getIns(chan[c.chan].ins,DIV_INS_UPD1771C));
} }
if (!chan[c.chan].inPorta && c.value && !parent->song.brokenPortaArp && chan[c.chan].std.arp.will && !NEW_ARP_STRAT) { if (!chan[c.chan].inPorta && c.value && !parent->song.brokenPortaArp && chan[c.chan].std.arp.will && !NEW_ARP_STRAT) {
if (c.chan==3 && !waveMode) {
chan[c.chan].baseFreq=chan[c.chan].note;
} else {
chan[c.chan].baseFreq=NOTE_PERIODIC(chan[c.chan].note); chan[c.chan].baseFreq=NOTE_PERIODIC(chan[c.chan].note);
} }
}
chan[c.chan].inPorta=c.value; chan[c.chan].inPorta=c.value;
break; break;
case DIV_CMD_GET_VOLMAX: case DIV_CMD_GET_VOLMAX:

View file

@ -27,12 +27,13 @@
class DivPlatformSCV: public DivDispatch { class DivPlatformSCV: public DivDispatch {
struct Channel: public SharedChannel<signed char> { struct Channel: public SharedChannel<signed char> {
unsigned int wave; unsigned int wave;
int pos, duty; int pos, duty, baseFreqNoise;
Channel(): Channel():
SharedChannel<signed char>(15), SharedChannel<signed char>(15),
wave(0), wave(0),
pos(0), pos(0),
duty(0) {} duty(0),
baseFreqNoise(0) {}
}; };
Channel chan[4]; Channel chan[4];
DivDispatchOscBuffer* oscBuf[4]; DivDispatchOscBuffer* oscBuf[4];