Lynx: fix sample mode switching glitch

issue #1372
This commit is contained in:
tildearrow 2023-08-22 00:25:23 -05:00
parent 54934dcfc9
commit 251893c5f8
1 changed files with 15 additions and 1 deletions

View File

@ -238,7 +238,9 @@ void DivPlatformLynx::tick(bool sysTick) {
chan[i].fd=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].std.duty.had) {
chan[i].duty=chan[i].std.duty.val;
WRITE_FEEDBACK(i, chan[i].duty.feedback);
if (!chan[i].pcm) {
WRITE_FEEDBACK(i, chan[i].duty.feedback);
}
}
WRITE_CONTROL(i, (chan[i].fd.clockDivider|0x18|chan[i].duty.int_feedback7));
WRITE_BACKUP( i, chan[i].fd.backup );
@ -257,9 +259,21 @@ void DivPlatformLynx::tick(bool sysTick) {
int DivPlatformLynx::dispatch(DivCommand c) {
switch (c.cmd) {
case DIV_CMD_NOTE_ON: {
bool prevPCM=chan[c.chan].pcm;
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_MIKEY);
chan[c.chan].macroVolMul=ins->type==DIV_INS_AMIGA?64:127;
chan[c.chan].pcm=(ins->type==DIV_INS_AMIGA || ins->amiga.useSample);
if (chan[c.chan].pcm!=prevPCM) {
if (chan[c.chan].pcm) {
WRITE_FEEDBACK(c.chan,0);
WRITE_CONTROL(c.chan,0x18);
WRITE_BACKUP(c.chan,0);
} else {
WRITE_FEEDBACK(c.chan,chan[c.chan].duty.feedback);
WRITE_CONTROL(c.chan,(chan[c.chan].fd.clockDivider|0x18|chan[c.chan].duty.int_feedback7));
WRITE_BACKUP(c.chan,chan[c.chan].fd.backup);
}
}
if (c.value!=DIV_NOTE_NULL) {
if (chan[c.chan].pcm) {
chan[c.chan].sample=ins->amiga.getSample(c.value);