From 37566423f433075c848e515fee29a48a65769728 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 11 May 2024 13:52:00 +0200 Subject: Fix some issues with PO20 sync (too narrow pulses) --- src/sequencer.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/sequencer.c b/src/sequencer.c index ed13486..64e0e49 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -42,7 +42,7 @@ gate_off(void) { } void -gate_on(void) { +gate_on(SyncSetting sync_mode) { // SYNC24 NOTES // (from https://e-rm.de/data/E-RM_report_HowToDinSync_10_14_EN.pdf) // @@ -55,7 +55,17 @@ gate_on(void) { // for less lenient machines. gate_off(); gate_set(1, 1); - int n_ticks = -80 / 4; // 1.25ms + int n_ticks = 0; + switch (sync_mode) { + case SYNC_OUT_LINK_96BPQ: { n_ticks = -80 / 4; } break; + case SYNC_OUT_LINK_48BPQ: { n_ticks = -80 / 2; } break; + case SYNC_OUT_LINK_24BPQ: { n_ticks = -80; } break; + case SYNC_OUT_LINK_12BPQ: { n_ticks = -80 * 2; } break; + case SYNC_OUT_LINK_6BPQ: { n_ticks = -80 * 4; } break; + case SYNC_OUT_LINK_4BPQ: { n_ticks = -80 * 6; } break; + case SYNC_OUT_LINK_2BPQ: { n_ticks = -80 * 12; } break; + default: break; + } irs_set(IRQ_TIMER_3, gate_off); TIMER_DATA_3 = n_ticks; TIMER_CTRL_3 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; @@ -542,23 +552,24 @@ void sequencer_tick(void) { irs_interruptible(IRQ_VBLANK); // Audio mix. irs_interruptible(IRQ_TIMER_1); // Audio click sync. - irs_interruptible(IRQ_TIMER_3); // Link cable sync. + irs_interruptible(IRQ_TIMER_3); // Link cable sync out. + irs_interruptible(IRQ_SERIAL); // Linc cable sync in. switch (settings.sync) { - case SYNC_OUT_LINK_96BPQ: { gate_on(); } break; - case SYNC_OUT_LINK_48BPQ: { if (sync_ticks++ % 2 == 0) { gate_on(); } } break; - case SYNC_OUT_LINK_24BPQ: { if (sync_ticks++ % 4 == 0) { gate_on(); } } break; - case SYNC_OUT_LINK_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(); } } break; - case SYNC_OUT_LINK_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(); } } break; - case SYNC_OUT_LINK_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(); } } break; - case SYNC_OUT_LINK_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(); } } break; + case SYNC_OUT_LINK_96BPQ: { gate_on(SYNC_OUT_LINK_96BPQ); } break; + case SYNC_OUT_LINK_48BPQ: { if (sync_ticks++ % 2 == 0) { gate_on(SYNC_OUT_LINK_48BPQ); } } break; + case SYNC_OUT_LINK_24BPQ: { if (sync_ticks++ % 4 == 0) { gate_on(SYNC_OUT_LINK_24BPQ); } } break; + case SYNC_OUT_LINK_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(SYNC_OUT_LINK_12BPQ); } } break; + case SYNC_OUT_LINK_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(SYNC_OUT_LINK_6BPQ); } } break; + case SYNC_OUT_LINK_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(SYNC_OUT_LINK_4BPQ); } } break; + case SYNC_OUT_LINK_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(SYNC_OUT_LINK_2BPQ); } } break; case SYNC_OUT_AUDIO_12BPQ: { if (sync_ticks++ % 8 == 0) { audio_sync_click = true; } } break; case SYNC_OUT_AUDIO_6BPQ: { if (sync_ticks++ % 16 == 0) { audio_sync_click = true; } } break; case SYNC_OUT_AUDIO_4BPQ: { if (sync_ticks++ % 24 == 0) { audio_sync_click = true; } } break; case SYNC_OUT_AUDIO_2BPQ: { if (sync_ticks++ % 48 == 0) { audio_sync_click = true; } } break; - case SYNC_OUT_LINK_AUDIO_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(); audio_sync_click = true; } } break; - case SYNC_OUT_LINK_AUDIO_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(); audio_sync_click = true; } } break; - case SYNC_OUT_LINK_AUDIO_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(); audio_sync_click = true; } } break; - case SYNC_OUT_LINK_AUDIO_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_12BPQ: { if (sync_ticks++ % 8 == 0) { gate_on(SYNC_OUT_LINK_12BPQ); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_6BPQ: { if (sync_ticks++ % 16 == 0) { gate_on(SYNC_OUT_LINK_6BPQ); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_4BPQ: { if (sync_ticks++ % 24 == 0) { gate_on(SYNC_OUT_LINK_4BPQ); audio_sync_click = true; } } break; + case SYNC_OUT_LINK_AUDIO_2BPQ: { if (sync_ticks++ % 48 == 0) { gate_on(SYNC_OUT_LINK_2BPQ); audio_sync_click = true; } } break; case SYNC_OUT_LSDJ: { if (sync_ticks++ % 4 == 0) { u8 val = 0xff; @@ -2064,4 +2075,6 @@ sequencer_init(void) { SOUND_STATUS = SOUND_ENABLE; init_dsound(); set_audio_settings(); + // TODO: Set the gate to expected value depending on sync mode selected. + // Also applies to the reset_sequencer function. } -- cgit v1.2.1