From ac17920096b18caa4cadec3fea347f9fc804baea Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 28 May 2023 20:07:07 +0200 Subject: Make sure link cable sync respects user settings --- src/sequencer.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) (limited to 'src/sequencer.c') diff --git a/src/sequencer.c b/src/sequencer.c index 44ec7bb..52e0e01 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -31,6 +31,22 @@ gate_off(void) { TIMER_CTRL_1 = 0; } +void +gate_on(void) { + SIO_MODE = SIO_MODE_GP + | SIO_SC_OUT(1) + | SIO_SD_OUT(1) + | SIO_SI_OUT(0) + | SIO_SO_OUT(1) + | SIO_SC(1) + | SIO_SD(1) + | SIO_SO(0); + int n_ticks = -244181 / 600; + irs_set(IRQ_TIMER_1, gate_off); + TIMER_DATA_1 = n_ticks; + TIMER_CTRL_1 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; +} + void play_step(void) { Pattern *pat = &patterns[current_pattern]; @@ -147,21 +163,12 @@ play_step(void) { SOUND_NOISE_CTRL = 0; SOUND_NOISE_FREQ = 0; } - // TODO: This should be configurable e.g. po needs a 1 each 2 to sync - // exactly, but we can also just want a pseudo clock divider. - if (step_counter % 2 == 0) { - SIO_MODE = SIO_MODE_GP - | SIO_SC_OUT(1) - | SIO_SD_OUT(1) - | SIO_SI_OUT(0) - | SIO_SO_OUT(1) - | SIO_SC(1) - | SIO_SD(1) - | SIO_SO(0); - int n_ticks = -244181 / 600; - irs_set(IRQ_TIMER_1, gate_off); - TIMER_DATA_1 = n_ticks; - TIMER_CTRL_1 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; + + switch (settings.sync) { + case SYNC_OUT_LINK_16: { gate_on(); } break; + case SYNC_OUT_LINK_8: { if (step_counter % 2 == 0) { gate_on(); } } break; + case SYNC_OUT_LINK_4: { if (step_counter % 4 == 0) { gate_on(); } } break; + default: break; } step_counter = (step_counter + 1) % 16; redraw_piano_note = true; @@ -424,7 +431,7 @@ handle_right_col_selection(void) { } } else if (key_tap(KEY_B)) { switch (right_col_selection_loc) { - case R_COL_STOP: { toggle_playing(); } break; + case R_COL_STOP: { next_scene = SCENE_SETTINGS; } break; case R_COL_PLAY: { pause_playing(); } break; case R_COL_BANK_A: { select_bank(0); } break; case R_COL_BANK_B: { select_bank(1); } break; @@ -984,6 +991,8 @@ handle_sequencer_input(void) { void sequencer_init(void) { + stop_playing(); + // Load the previous bank from SRAM or initialize it if needed. sram_read(&metadata, 0, sizeof(Metadata)); if (metadata.initialized != SAVE_INIT_MAGIC) { -- cgit v1.2.1