From fff06404696bb8790901cdefe016cd8d0fe856cb Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 25 Aug 2023 15:42:58 +0200 Subject: Add pattern chain buttons behaviour (toggle/clear/random) --- src/sequencer.c | 91 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 20 deletions(-) (limited to 'src/sequencer.c') diff --git a/src/sequencer.c b/src/sequencer.c index 58714cb..266db94 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -138,7 +138,7 @@ play_step(void) { } else if (current_bank != next_bank && step_counter == 15) { select_bank(next_bank); update_bpm = true; - } else if (chain.len != 0 && step_counter == 15) { + } else if (chain.len != 0 && step_counter == 15 && chain.enabled) { redraw_pattern_buttons = true; update_bpm = true; if (!chain.playing) { @@ -762,6 +762,8 @@ handle_pattern_chain(void) { } else if (key_tap(KEY_LEFT)) { if (param_selection_loc == 8) { param_selection_loc = 15; + } else if (param_selection_loc == 16) { + param_selection_loc = 18; } else if (param_selection_loc > 0) { param_selection_loc--; } else if (param_selection_loc == 0) { @@ -770,48 +772,97 @@ handle_pattern_chain(void) { } else if (key_tap(KEY_RIGHT)) { if (param_selection_loc < 15 && param_selection_loc != 7) { param_selection_loc++; + } else if (param_selection_loc < 18 && param_selection_loc >= 16) { + param_selection_loc++; + } else if (param_selection_loc == 18) { + param_selection_loc = 16; } else if (param_selection_loc == 7) { param_selection_loc = 0; } else if (param_selection_loc == 15) { param_selection_loc = 8; } } else if (key_tap(KEY_UP)) { - if (param_selection_loc <= 7) { - param_selection_loc += 8; - } else { + if (param_selection_loc >= 1 && param_selection_loc <= 2) { + param_selection_loc = 16; + } else if (param_selection_loc >= 3 && param_selection_loc <= 4) { + param_selection_loc = 17; + } else if (param_selection_loc >= 5 && param_selection_loc <= 6) { + param_selection_loc = 18; + } else if (param_selection_loc >= 8 && param_selection_loc <= 15){ param_selection_loc -= 8; } } else if (key_tap(KEY_DOWN)) { if (param_selection_loc <= 7) { param_selection_loc += 8; - } else { - param_selection_loc -= 8; + } else if (param_selection_loc == 16){ + param_selection_loc = 1; + } else if (param_selection_loc == 17){ + param_selection_loc = 3; + } else if (param_selection_loc == 18){ + param_selection_loc = 5; } } else if (key_tap(KEY_B)) { - if (chain.active[param_selection_loc]) { - // Can't toggle current chain. - if (!play_status - || param_selection_loc != chain.current - || chain.len == 1) { - chain.active[param_selection_loc] = 0; - chain.len--; - } - } else { - if (chain.len == 0) { - chain.current = param_selection_loc; - } - chain.active[param_selection_loc] = 1; - chain.len++; + switch (param_selection_loc) { + case CHAIN_BTN_ENABLE: { + chain.enabled ^= 1; + chain.current = 15; + chain.current = find_next_pattern(); + chain.playing = false; + } break; + case CHAIN_BTN_CLEAR: { + chain.len = 0; + chain.playing = false; + for (size_t i = 0; i < MAX_CHAIN; i++) { + chain.active[i] = false; + chain.chain[i] = 0; + } + chain.current = 15; + chain.current = find_next_pattern(); + } break; + case CHAIN_BTN_RANDOM: { + u8 cur = chain.current % 16; + for (size_t i = 0; i < MAX_CHAIN; i++) { + if (i == cur && chain.playing) { + continue; + } + if (rng16() < 32765) { + chain.active[i] = true; + } else { + chain.active[i] = false; + } + // NOTE: Should we also randomize the patterns or isn't it + // necessary? + } + } break; + default: { + if (chain.active[param_selection_loc]) { + // Can't toggle current chain. + if (!play_status + || param_selection_loc != chain.current + || chain.len == 1) { + chain.active[param_selection_loc] = 0; + chain.len--; + } + } else { + if (chain.len == 0) { + chain.current = param_selection_loc; + } + chain.active[param_selection_loc] = 1; + chain.len++; + } + } break; } } else if (key_tap(KEY_L)) { if (chain.active[param_selection_loc] && chain.chain[param_selection_loc] > 0 + && param_selection_loc <= 15 && (!play_status || param_selection_loc != chain.current)) { chain.chain[param_selection_loc]--; } } else if (key_tap(KEY_R)) { if (chain.active[param_selection_loc] && chain.chain[param_selection_loc] < 7 + && param_selection_loc <= 15 && (!play_status || param_selection_loc != chain.current)) { chain.chain[param_selection_loc]++; } -- cgit v1.2.1