From 0fa40db0a578cc2dc3952fe108a332a1e3182452 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 24 Apr 2023 11:39:58 +0200 Subject: Add quick BPM adjustment with SEL+L/R --- src/sequencer.c | 61 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 18 deletions(-) (limited to 'src/sequencer.c') diff --git a/src/sequencer.c b/src/sequencer.c index 784d132..2940b25 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -19,13 +19,15 @@ bool redraw_bpm = true; bool redraw_piano_note = true; void -irq_timer(void) { - if (current_pattern != next_pattern && step_counter == 0) { +play_step(void) { + if (current_pattern != next_pattern && step_counter == 15) { current_pattern = next_pattern; redraw_pattern_buttons = true; + set_time(patterns[current_pattern].bpm); + play_step(); + return; } Pattern *pat = &patterns[current_pattern]; - set_time(pat->bpm); if (pat->ch1.active) { TriggerNote *trig = &pat->ch1.notes[step_counter]; ChannelSquareParams *params = &pat->ch1.params[step_counter]; @@ -156,7 +158,7 @@ set_time(int bpm) { // We have to operate on integer values, so the numbers have been // precalculated to `n_ticks = 244181 / bmp` int n_ticks = -244181 / bpm; - irs_set(IRQ_TIMER_0, irq_timer); + irs_set(IRQ_TIMER_0, play_step); TIMER_DATA_0 = n_ticks; TIMER_CTRL_0 = TIMER_CTRL_IRQ | TIMER_CTRL_ENABLE | TIMER_CTRL_FREQ_3; } @@ -242,7 +244,12 @@ toggle_playing(void) { play_status ^= 1; step_counter = 0; if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) == 0) { + if (current_pattern != next_pattern) { + current_pattern = next_pattern; + redraw_pattern_buttons = true; + } set_time(patterns[current_pattern].bpm); + play_step(); } else { TIMER_CTRL_0 ^= TIMER_CTRL_ENABLE; SOUND_SQUARE1_CTRL = 0; @@ -257,7 +264,12 @@ void pause_playing(void) { play_status ^= 1; if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) == 0) { + if (current_pattern != next_pattern && step_counter == 0) { + current_pattern = next_pattern; + redraw_pattern_buttons = true; + } set_time(patterns[current_pattern].bpm); + play_step(); } else { TIMER_CTRL_0 ^= TIMER_CTRL_ENABLE; SOUND_SQUARE1_CTRL = 0; @@ -312,27 +324,37 @@ handle_right_col_selection(void) { } else if (key_tap(KEY_L)) { switch (right_col_selection_loc) { case R_COL_BPM: { - if (patterns[pattern_selection_loc].bpm > 10) { - patterns[pattern_selection_loc].bpm--; - if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) != 0 - && current_pattern == pattern_selection_loc) { - set_time(patterns[current_pattern].bpm); - } - redraw_bpm = true; + s32 bpm_inc = -1; + if (key_pressed(KEY_SELECT)) { + bpm_inc = -10; } + patterns[pattern_selection_loc].bpm = CLAMP( + patterns[pattern_selection_loc].bpm + bpm_inc, + 10, + 300); + if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) != 0 + && current_pattern == pattern_selection_loc) { + set_time(patterns[current_pattern].bpm); + } + redraw_bpm = true; } break; } } else if (key_tap(KEY_R)) { switch (right_col_selection_loc) { case R_COL_BPM: { - if (patterns[pattern_selection_loc].bpm < 300) { - patterns[pattern_selection_loc].bpm++; - if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) != 0 - && current_pattern == pattern_selection_loc) { - set_time(patterns[current_pattern].bpm); - } - redraw_bpm = true; + s32 bpm_inc = 1; + if (key_pressed(KEY_SELECT)) { + bpm_inc = 10; + } + patterns[pattern_selection_loc].bpm = CLAMP( + patterns[pattern_selection_loc].bpm + bpm_inc, + 10, + 300); + if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) != 0 + && current_pattern == pattern_selection_loc) { + set_time(patterns[current_pattern].bpm); } + redraw_bpm = true; } break; } } else if (key_tap(KEY_B)) { @@ -830,6 +852,9 @@ handle_sequencer_input(void) { clipboard_copy(); input_handler(); } + if (input_handler == handle_right_col_selection) { + input_handler(); + } // Clipboard combo. else if (key_tap(KEY_A)) { clipboard_paste(); -- cgit v1.2.1