PCE: better noise frequency handling
This commit is contained in:
parent
cac807551f
commit
503e822a33
|
@ -163,21 +163,15 @@ void DivPlatformPCE::tick(bool sysTick) {
|
||||||
if (chan[i].std.duty.had && i>=4) {
|
if (chan[i].std.duty.had && i>=4) {
|
||||||
chan[i].noise=chan[i].std.duty.val;
|
chan[i].noise=chan[i].std.duty.val;
|
||||||
chan[i].freqChanged=true;
|
chan[i].freqChanged=true;
|
||||||
int noiseSeek=chan[i].note;
|
|
||||||
if (noiseSeek<0) noiseSeek=0;
|
|
||||||
chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0);
|
|
||||||
}
|
}
|
||||||
if (NEW_ARP_STRAT) {
|
if (NEW_ARP_STRAT) {
|
||||||
chan[i].handleArp();
|
chan[i].handleArp();
|
||||||
int noiseSeek=chan[i].fixedArp?chan[i].baseNoteOverride:(chan[i].note+chan[i].arpOff);
|
|
||||||
if (noiseSeek<0) noiseSeek=0;
|
|
||||||
chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0);
|
|
||||||
} else if (chan[i].std.arp.had) {
|
} else if (chan[i].std.arp.had) {
|
||||||
if (!chan[i].inPorta) {
|
if (!chan[i].inPorta) {
|
||||||
int noiseSeek=parent->calcArp(chan[i].note,chan[i].std.arp.val);
|
int noiseSeek=parent->calcArp(chan[i].note,chan[i].std.arp.val);
|
||||||
chan[i].baseFreq=NOTE_PERIODIC(noiseSeek);
|
chan[i].baseFreq=NOTE_PERIODIC(noiseSeek);
|
||||||
if (noiseSeek<0) noiseSeek=0;
|
if (noiseSeek<0) noiseSeek=0;
|
||||||
chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0);
|
chan[i].noiseSeek=noiseSeek;
|
||||||
}
|
}
|
||||||
chan[i].freqChanged=true;
|
chan[i].freqChanged=true;
|
||||||
}
|
}
|
||||||
|
@ -246,6 +240,15 @@ void DivPlatformPCE::tick(bool sysTick) {
|
||||||
if (chan[i].freq>4095) chan[i].freq=4095;
|
if (chan[i].freq>4095) chan[i].freq=4095;
|
||||||
chWrite(i,0x02,chan[i].freq&0xff);
|
chWrite(i,0x02,chan[i].freq&0xff);
|
||||||
chWrite(i,0x03,chan[i].freq>>8);
|
chWrite(i,0x03,chan[i].freq>>8);
|
||||||
|
|
||||||
|
if (i>=4) {
|
||||||
|
int noiseSeek=(chan[i].fixedArp?chan[i].baseNoteOverride:(chan[i].note+chan[i].arpOff))+chan[i].pitch2;
|
||||||
|
if (!parent->song.properNoiseLayout && noiseSeek<0) noiseSeek=0;
|
||||||
|
if (!NEW_ARP_STRAT) {
|
||||||
|
noiseSeek=chan[i].noiseSeek;
|
||||||
|
}
|
||||||
|
chWrite(i,0x07,chan[i].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0);
|
||||||
|
}
|
||||||
if (chan[i].keyOn) {
|
if (chan[i].keyOn) {
|
||||||
//rWrite(16+i*5,0x80);
|
//rWrite(16+i*5,0x80);
|
||||||
//chWrite(i,0x04,0x80|chan[i].vol);
|
//chWrite(i,0x04,0x80|chan[i].vol);
|
||||||
|
@ -331,9 +334,8 @@ int DivPlatformPCE::dispatch(DivCommand c) {
|
||||||
chan[c.chan].baseFreq=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;
|
||||||
int noiseSeek=chan[c.chan].note;
|
chan[c.chan].noiseSeek=c.value;
|
||||||
if (noiseSeek<0) noiseSeek=0;
|
if (chan[c.chan].noiseSeek<0) chan[c.chan].noiseSeek=0;
|
||||||
chWrite(c.chan,0x07,chan[c.chan].noise?(0x80|(parent->song.properNoiseLayout?(noiseSeek&31):noiseFreq[noiseSeek%12])):0);
|
|
||||||
}
|
}
|
||||||
chan[c.chan].active=true;
|
chan[c.chan].active=true;
|
||||||
chan[c.chan].keyOn=true;
|
chan[c.chan].keyOn=true;
|
||||||
|
@ -431,7 +433,7 @@ int DivPlatformPCE::dispatch(DivCommand c) {
|
||||||
}
|
}
|
||||||
case DIV_CMD_STD_NOISE_MODE:
|
case DIV_CMD_STD_NOISE_MODE:
|
||||||
chan[c.chan].noise=c.value;
|
chan[c.chan].noise=c.value;
|
||||||
chWrite(c.chan,0x07,chan[c.chan].noise?(0x80|chan[c.chan].note):0);
|
chan[c.chan].freqChanged=true;
|
||||||
break;
|
break;
|
||||||
case DIV_CMD_SAMPLE_MODE:
|
case DIV_CMD_SAMPLE_MODE:
|
||||||
chan[c.chan].pcm=c.value;
|
chan[c.chan].pcm=c.value;
|
||||||
|
|
|
@ -34,7 +34,7 @@ class DivPlatformPCE: public DivDispatch {
|
||||||
unsigned char pan;
|
unsigned char pan;
|
||||||
bool noise, pcm, furnaceDac, deferredWaveUpdate;
|
bool noise, pcm, furnaceDac, deferredWaveUpdate;
|
||||||
signed short wave;
|
signed short wave;
|
||||||
int macroVolMul;
|
int macroVolMul, noiseSeek;
|
||||||
DivWaveSynth ws;
|
DivWaveSynth ws;
|
||||||
Channel():
|
Channel():
|
||||||
SharedChannel<signed char>(31),
|
SharedChannel<signed char>(31),
|
||||||
|
@ -51,7 +51,8 @@ class DivPlatformPCE: public DivDispatch {
|
||||||
furnaceDac(false),
|
furnaceDac(false),
|
||||||
deferredWaveUpdate(false),
|
deferredWaveUpdate(false),
|
||||||
wave(-1),
|
wave(-1),
|
||||||
macroVolMul(31) {}
|
macroVolMul(31),
|
||||||
|
noiseSeek(0) {}
|
||||||
};
|
};
|
||||||
Channel chan[6];
|
Channel chan[6];
|
||||||
DivDispatchOscBuffer* oscBuf[6];
|
DivDispatchOscBuffer* oscBuf[6];
|
||||||
|
|
Loading…
Reference in New Issue