From c7f40ebf4ace263037e87a41ac331080aee2db36 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 9 Jun 2021 13:52:37 +0200 Subject: Add stub input handlers for parameters --- src/sequencer.c | 245 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 173 insertions(+), 72 deletions(-) (limited to 'src') diff --git a/src/sequencer.c b/src/sequencer.c index fa9b674..3e34d68 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -388,7 +388,7 @@ draw_channels(void) { unpack_tiles(channel_buttons, channel_tiles, 3 * 4); size_t k = 0; for (size_t i = 0; i < 4; i++) { - bool active; + bool active = false; switch (i) { case 0: { active = ch1.active; @@ -529,15 +529,21 @@ set_time(int bpm) { } +// Input handling works using a FSM. The input handler is switched to whichever +// function controls each section. For example, channel selection or trigger +// selection. void (*input_handler)(void); #define SEQ_N_CHANNELS 3 -void handle_trigger_cursor(void); -void handle_channel_cursor(void); +void handle_trigger_selection(void); +void handle_channel_selection(void); +void handle_param_selection_ch1(void); +void handle_param_selection_ch2(void); +void handle_param_selection_ch3(void); void -handle_channel_cursor(void) { +handle_channel_selection(void) { if (key_tap(KEY_B)) { switch (channel_selection_loc) { case 0: { @@ -555,7 +561,7 @@ handle_channel_cursor(void) { if (key_tap(KEY_RIGHT)) { trig_selection_loc = 0; param_selection_loc = 0; - input_handler = handle_trigger_cursor; + input_handler = handle_trigger_selection; draw_channel_cursor(channel_selection_loc, COL_GREY); draw_trig_cursor(trig_selection_loc, COL_BLUE); } else if (key_tap(KEY_UP)) { @@ -580,75 +586,81 @@ handle_channel_cursor(void) { } void -handle_trigger_cursor(void) { - TriggerNote *trig; - switch (channel_selection_loc) { - case 0: { - trig = &ch1.notes[trig_selection_loc]; - } break; - case 1: { - trig = &ch2.notes[trig_selection_loc]; - } break; - case 2: { - trig = &ch3.notes[trig_selection_loc]; - } break; - } - - if (key_tap(KEY_B)) { - // Toggle trigger. - trig->active ^= 1; - draw_trigger(channel_selection_loc, trig_selection_loc); - } else if (key_tap(KEY_A)) { - // Switch to parameter selection. - // current_selection = SEQ_SELECT_PARAMETER; - } else if (key_tap(KEY_L)) { - // Decrease note. - if (trig->active) { - trig->note = MAX(trig->note - 1, NOTE_C_2); - clear_trigger(trig_selection_loc); - draw_trigger(channel_selection_loc, trig_selection_loc); - } - } else if (key_tap(KEY_R)) { - // Increase note. - if (trig->active) { - trig->note = MIN( trig->note + 1, NOTE_C_8); - clear_trigger(trig_selection_loc); - draw_trigger(channel_selection_loc, trig_selection_loc); - } - } - - // Move trigger cursor. - if (key_tap(KEY_LEFT)) { - if (trig_selection_loc == 0 || trig_selection_loc == 8) { - // We are at the boundary, switch to channel selection. - draw_trig_cursor(trig_selection_loc, COL_BG); - input_handler = handle_channel_cursor; - draw_channel_cursor(channel_selection_loc, COL_BLUE); - } else { - draw_trig_cursor(trig_selection_loc, COL_BG); - trig_selection_loc = MAX(trig_selection_loc - 1, 0); - draw_trig_cursor(trig_selection_loc, COL_BLUE); - } - } else if (key_tap(KEY_RIGHT)) { - if (trig_selection_loc != 7) { - draw_trig_cursor(trig_selection_loc, COL_BG); - trig_selection_loc = MIN(trig_selection_loc + 1, 15); - draw_trig_cursor(trig_selection_loc, COL_BLUE); - } - } else if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { - draw_trig_cursor(trig_selection_loc, COL_BG); - trig_selection_loc = (trig_selection_loc + 8) % 16; +handle_param_selection_ch1(void) { + if (key_tap(KEY_A)) { + // TODO: draw param cursor. + input_handler = handle_trigger_selection; draw_trig_cursor(trig_selection_loc, COL_BLUE); } + // // Move through the selected synth parameters. + // if (key_tap(KEY_LEFT)) { + // int max_param = 6; + // if (channel_selection_loc == 1) { + // max_param = 3; + // } + // if (param_selection_loc == 0) { + // param_selection_loc = max_param; + // } else { + // param_selection_loc = MAX(param_selection_loc - 1, 0); + // } + // } + // if (key_tap(KEY_RIGHT)) { + // int max_param = 6; + // if (channel_selection_loc == 1) { + // max_param = 3; + // } + // if (param_selection_loc == max_param) { + // param_selection_loc = 0; + // } else { + // param_selection_loc = MIN(param_selection_loc + 1, max_param); + // } + // } + + // // Adjust the parameters up or down. + // if (key_tap(KEY_L) || key_tap(KEY_R)) { + // int inc; + // if (key_tap(KEY_L)) { + // inc = -1; + // } else { + // inc = 1; + // } + // switch (param_selection_loc) { + // case 0: { + // trig->env_volume = CLAMP(trig->env_volume + inc, 0, 15); + // } break; + // case 1: { + // trig->env_time = CLAMP(trig->env_time + inc, 0, 7); + // } break; + // case 2: { + // trig->env_direction ^= 1; + // } break; + // case 3: { + // trig->duty_cycle = CLAMP(trig->duty_cycle + inc, 0, 3); + // } break; + // case 4: { + // trig->sweep_number = CLAMP(trig->sweep_number + inc, 0, 7); + // } break; + // case 5: { + // trig->sweep_time = CLAMP(trig->sweep_time + inc, 0, 7); + // } break; + // case 6: { + // if (trig->sweep_direction == 0) { + // trig->sweep_direction = 1; + // } else { + // trig->sweep_direction = 0; + // } + // } break; + // } + // } } void -handle_sequencer_input(void) { - poll_keys(); - input_handler(); - // SeqTrigger *trig = &sequences[channel_selection_loc][trig_selection_loc]; - // } else if (current_selection == SEQ_SELECT_PARAMETER) { - // if (channel_selection_loc < 2) { +handle_param_selection_ch2(void) { + if (key_tap(KEY_A)) { + // TODO: draw param cursor. + input_handler = handle_trigger_selection; + draw_trig_cursor(trig_selection_loc, COL_BLUE); + } // // Move through the selected synth parameters. // if (key_tap(KEY_LEFT)) { // int max_param = 6; @@ -709,7 +721,15 @@ handle_sequencer_input(void) { // } break; // } // } - // } else if (channel_selection_loc == 2) { +} + +void +handle_param_selection_ch3(void) { + if (key_tap(KEY_A)) { + // TODO: draw param cursor. + input_handler = handle_trigger_selection; + draw_trig_cursor(trig_selection_loc, COL_BLUE); + } // if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { // int inc = 0; // int loc = param_selection_loc; @@ -828,7 +848,87 @@ handle_sequencer_input(void) { // dma_copy(&trig->wave_b, &rand_wave, 16); // } // } - // } +} + +void +handle_trigger_selection(void) { + TriggerNote *trig; + switch (channel_selection_loc) { + case 0: { + trig = &ch1.notes[trig_selection_loc]; + } break; + case 1: { + trig = &ch2.notes[trig_selection_loc]; + } break; + case 2: { + trig = &ch3.notes[trig_selection_loc]; + } break; + } + + if (key_tap(KEY_B)) { + // Toggle trigger. + trig->active ^= 1; + draw_trigger(channel_selection_loc, trig_selection_loc); + } else if (key_tap(KEY_L)) { + // Decrease note. + if (trig->active) { + trig->note = MAX(trig->note - 1, NOTE_C_2); + clear_trigger(trig_selection_loc); + draw_trigger(channel_selection_loc, trig_selection_loc); + } + } else if (key_tap(KEY_R)) { + // Increase note. + if (trig->active) { + trig->note = MIN( trig->note + 1, NOTE_C_8); + clear_trigger(trig_selection_loc); + draw_trigger(channel_selection_loc, trig_selection_loc); + } + } + + // Move trigger cursor. + if (key_tap(KEY_LEFT)) { + if (trig_selection_loc == 0 || trig_selection_loc == 8) { + // We are at the boundary, switch to channel selection. + draw_trig_cursor(trig_selection_loc, COL_BG); + input_handler = handle_channel_selection; + draw_channel_cursor(channel_selection_loc, COL_BLUE); + } else { + draw_trig_cursor(trig_selection_loc, COL_BG); + trig_selection_loc = MAX(trig_selection_loc - 1, 0); + draw_trig_cursor(trig_selection_loc, COL_BLUE); + } + } else if (key_tap(KEY_RIGHT)) { + if (trig_selection_loc != 7) { + draw_trig_cursor(trig_selection_loc, COL_BG); + trig_selection_loc = MIN(trig_selection_loc + 1, 15); + draw_trig_cursor(trig_selection_loc, COL_BLUE); + } + } else if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { + draw_trig_cursor(trig_selection_loc, COL_BG); + trig_selection_loc = (trig_selection_loc + 8) % 16; + draw_trig_cursor(trig_selection_loc, COL_BLUE); + } else if (key_tap(KEY_A)) { + // Switch to parameter selection. + switch (channel_selection_loc) { + case 0: { + input_handler = handle_param_selection_ch1; + } break; + case 1: { + input_handler = handle_param_selection_ch2; + } break; + case 2: { + input_handler = handle_param_selection_ch3; + } break; + } + // TODO: draw param cursor. + draw_trig_cursor(trig_selection_loc, COL_GREY); + } +} + +void +handle_sequencer_input(void) { + poll_keys(); + input_handler(); if (key_tap(KEY_START)) { // Stop the sequencer or start playing from the beginning. @@ -865,7 +965,8 @@ sequencer_init(void) { draw_channels(); // Initialize input handler. - input_handler = handle_trigger_cursor; + channel_selection_loc = 2; // DEBUG: Starting on CH3 + input_handler = handle_trigger_selection; draw_trig_cursor(trig_selection_loc, 3); draw_channel_cursor(channel_selection_loc, 5); -- cgit v1.2.1