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/globals.c | 6 +++--- src/main.c | 8 ++++++++ src/sequencer.c | 41 +++++++++++++++++++++++++---------------- src/settings.c | 2 +- src/settings.h | 1 - 5 files changed, 37 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/globals.c b/src/globals.c index 60e64e7..7396968 100644 --- a/src/globals.c +++ b/src/globals.c @@ -17,7 +17,7 @@ u32 last_channel_loc = 0; u32 last_pattern_loc = 0; u32 last_right_col_loc = 0; u32 last_step_counter = 0; -bool clear_screen = false; +bool clear_screen = true; // // Color indexes. @@ -120,5 +120,5 @@ typedef enum Scene { SCENE_SETTINGS, } Scene; -static Scene scene = SCENE_SETTINGS; -static Scene next_scene = SCENE_SETTINGS; +static Scene scene = SCENE_SEQUENCER; +static Scene next_scene = SCENE_SEQUENCER; diff --git a/src/main.c b/src/main.c index 4a4f265..3012d9b 100644 --- a/src/main.c +++ b/src/main.c @@ -147,6 +147,14 @@ update(void) { if (next_scene != scene) { scene = next_scene; clear_screen = true; + redraw_trigs = true; + redraw_channels = true; + redraw_pattern_buttons = true; + redraw_bank_buttons = true; + redraw_bpm = true; + redraw_play_pause = true; + redraw_piano_note = true; + redraw_params = true; } last_trig_loc = trig_selection_loc; last_channel_loc = channel_selection_loc; 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) { diff --git a/src/settings.c b/src/settings.c index fd5b090..fca5696 100644 --- a/src/settings.c +++ b/src/settings.c @@ -57,7 +57,7 @@ handle_settings_input(void) { save_metadata(); clear_screen = true; } - if (key_tap(KEY_B)) { + if (key_tap(KEY_A)) { next_scene = SCENE_SEQUENCER; } } diff --git a/src/settings.h b/src/settings.h index db46144..57b61a5 100644 --- a/src/settings.h +++ b/src/settings.h @@ -40,5 +40,4 @@ typedef struct Settings { CursorSetting cursor; } Settings; - #endif // SETTINGS_H -- cgit v1.2.1