diff --git a/src/engine/platform/lynx.cpp b/src/engine/platform/lynx.cpp index 6e87fea78..24ee1f9c4 100644 --- a/src/engine/platform/lynx.cpp +++ b/src/engine/platform/lynx.cpp @@ -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);