From 5cd6fa9ce339189d5e4e57d78206254f687507fa Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 11 Jun 2021 16:42:18 +0200 Subject: Add parameter cursor drawing for ch3 --- src/sequencer.c | 311 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 188 insertions(+), 123 deletions(-) (limited to 'src') diff --git a/src/sequencer.c b/src/sequencer.c index b82ee8a..002b4d0 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -135,7 +135,7 @@ static const u32 square_wave[16] = { static int bpm = 115; static int step_counter = 0; int trig_selection_loc = 0; -int param_selection_loc = 64; +int param_selection_loc = 0; int channel_selection_loc = 0; typedef struct TriggerNote { @@ -345,7 +345,7 @@ draw_trigger(size_t chan, size_t i) { void draw_trig_cursor(size_t i, u8 clr) { size_t offset_x = TRIG_OFFSET_X * (i % 8); - size_t offset_y = i < 8 ? 1 : 1 + TRIG_OFFSET_Y; + size_t offset_y = i < 8 ? 2 : 2 + TRIG_OFFSET_Y; size_t x0 = TRIG_START_X + offset_x; size_t x1 = TRIG_START_X + TRIG_W + offset_x; size_t y = TRIG_START_Y + TRIG_H + offset_y; @@ -408,7 +408,7 @@ draw_channels(void) { void draw_channel_cursor(size_t i, u8 clr) { size_t offset_x = 0; - size_t offset_y = CHAN_H + i * CHAN_OFFSET_Y; + size_t offset_y = CHAN_H + i * CHAN_OFFSET_Y + 1; size_t x0 = CHAN_START_X + offset_x; size_t x1 = CHAN_START_X + offset_x + CHAN_W; size_t y = CHAN_START_Y + offset_y; @@ -560,6 +560,66 @@ draw_piano(void) { #define PARAMS_START_X 35 #define PARAMS_START_Y 12 +void +draw_parameters_cursor_ch3(size_t i, u8 clr) { + u8 x_positions[] = { + // 32 half bytes (Wave A). + 0, 4, 8, 12, 16, 20, 24, 28, + 34, 38, 42, 46, 50, 54, 58, 62, + 0, 4, 8, 12, 16, 20, 24, 28, + 34, 38, 42, 46, 50, 54, 58, 62, + // 32 half bytes (Wave B). + 70, 74, 78, 82, 86, 90, 94, 98, + 104, 108, 112, 116, 120, 124, 128, 132, + 70, 74, 78, 82, 86, 90, 94, 98, + 104, 108, 112, 116, 120, 124, 128, 132, + // Default wave A. + 1, 18, 35, 52, + // Default wave B. + 71, 88, 105, 122, + }; + u8 y_positions[] = { + // 32 half bytes (Wave A) + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + // 32 half bytes (Wave B) + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, + // Default wave A. + 20, 20, 20, 20, + // Default wave B. + 20, 20, 20, 20, + }; + size_t cursor_length = 0; + if (i < 64) { + cursor_length = 4; + } else { + cursor_length = 13; + } + size_t x = PARAMS_START_X + x_positions[i] - 1; + size_t y = PARAMS_START_Y + PARAMS_H - 18 + y_positions[i]; + draw_line(x, y, x + cursor_length, y, clr); +} + +void +draw_parameters_cursor(size_t i, u8 clr) { + switch (channel_selection_loc) { + case 0: { + } break; + case 1: { + } break; + case 2: { + draw_parameters_cursor_ch3(i, clr); + } break; + case 3: { + } break; + } +} + IWRAM_CODE void draw_wave_pattern(u8 *pattern, int x, int y, u8 clr) { @@ -1019,128 +1079,133 @@ handle_param_selection_ch2(void) { void handle_param_selection_ch3(void) { if (key_tap(KEY_A)) { - // TODO: draw param cursor. + // Go back to trigger selection. + draw_parameters_cursor(param_selection_loc, COL_BG); 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; - // if (key_tap(KEY_RIGHT)) { - // if (loc == 15 || loc == 31) { - // inc = 17; - // } else if (loc != 47 && loc != 63){ - // inc = 1; - // } - // } else { - // if (loc == 32 || loc == 48) { - // inc = -17; - // } else if (loc != 16 && loc != 64){ - // inc = -1; - // } - // } - // param_selection_loc = CLAMP(loc + inc, 0, 71); - // } - // if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { - // int inc = 0; - // int loc = param_selection_loc; - // if (key_tap(KEY_UP)) { - // if ((loc >= 16 && loc < 32) || (loc >= 48 && loc < 64)) { - // inc = -16; - // } else if (loc == 64) { - // inc = -48; - // } else if (loc == 65) { - // inc = -45; - // } else if (loc == 66) { - // inc = -42; - // } else if (loc == 67) { - // inc = -39; - // } else if (loc == 68) { - // inc = -20; - // } else if (loc == 69) { - // inc = -17; - // } else if (loc == 70) { - // inc = -14; - // } else if (loc == 71) { - // inc = -11; - // } - // } else { - // if (loc < 16 || (loc >= 32 && loc < 48)) { - // inc = 16; - // } else if (loc >= 16 && loc <= 19){ - // inc = 48 - (loc - 16); - // } else if (loc >= 20 && loc <= 23){ - // inc = 45 - (loc - 20); - // } else if (loc >= 24 && loc <= 27){ - // inc = 42 - (loc - 24); - // } else if (loc >= 28 && loc <= 31){ - // inc = 39 - (loc - 28); - // } else if (loc >= 48 && loc <= 51){ - // inc = 20 - (loc - 48); - // } else if (loc >= 52 && loc <= 55){ - // inc = 17 - (loc - 52); - // } else if (loc >= 56 && loc <= 59){ - // inc = 14 - (loc - 56); - // } else if (loc >= 60 && loc <= 63){ - // inc = 11 - (loc - 60); - // } - // } - // param_selection_loc = CLAMP(loc + inc, 0, 71); - // } - // if (key_tap(KEY_R) || key_tap(KEY_L)) { - // int odd = param_selection_loc & 0x1; - // int inc; - // if (key_tap(KEY_R)) { - // inc = 1; - // } else { - // inc = -1; - // } - // // Wave: AA BB CC DD ... - // // ^^ - // // |`- odd - // // `-- even - // if (param_selection_loc < 32) { - // u8 byte_number = param_selection_loc >> 1; - // u8 byte = sequences[2][trig_selection_loc].wave_a[byte_number]; - // if (odd) { - // byte = (~0xF & byte) | ((byte + inc) & 0xF); - // } else { - // byte = (0xF & byte) | (((byte >> 4) + inc) & 0xF) << 4; - // } - // sequences[2][trig_selection_loc].wave_a[byte_number] = byte; - // } else if (param_selection_loc < 64){ - // u8 byte_number = (param_selection_loc - 32) >> 1; - // u8 byte = sequences[2][trig_selection_loc].wave_b[byte_number]; - // if (odd) { - // byte = (~0xF & byte) | (byte + inc); - // } else { - // byte = (0xF & byte) | ((byte >> 4) + inc) << 4; - // } - // sequences[2][trig_selection_loc].wave_b[byte_number] = byte; - // } else if (param_selection_loc == 64){ - // dma_copy(&trig->wave_a, &sine_wave, 16); - // } else if (param_selection_loc == 65){ - // dma_copy(&trig->wave_a, &saw_wave, 16); - // } else if (param_selection_loc == 66){ - // dma_copy(&trig->wave_a, &square_wave, 16); - // } else if (param_selection_loc == 67){ - // u32 rand_wave[4] = { - // rng32(), rng32(), rng32(), rng32(), - // }; - // dma_copy(&trig->wave_a, &rand_wave, 16); - // } else if (param_selection_loc == 68){ - // dma_copy(&trig->wave_b, &sine_wave, 16); - // } else if (param_selection_loc == 69){ - // dma_copy(&trig->wave_b, &saw_wave, 16); - // } else if (param_selection_loc == 70){ - // dma_copy(&trig->wave_b, &square_wave, 16); - // } else if (param_selection_loc == 71){ - // u32 rand_wave[4] = { - // rng32(), rng32(), rng32(), rng32(), - // }; - // dma_copy(&trig->wave_b, &rand_wave, 16); - // } - // } + if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { + int inc = 0; + int loc = param_selection_loc; + if (key_tap(KEY_RIGHT)) { + if (loc == 15 || loc == 31) { + inc = 17; + } else if (loc != 47 && loc != 63){ + inc = 1; + } + } else { + if (loc == 32 || loc == 48) { + inc = -17; + } else if (loc != 16 && loc != 64){ + inc = -1; + } + } + draw_parameters_cursor_ch3(param_selection_loc, COL_BG); + param_selection_loc = CLAMP(loc + inc, 0, 71); + draw_parameters_cursor_ch3(param_selection_loc, COL_BLUE); + } + if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { + int inc = 0; + int loc = param_selection_loc; + if (key_tap(KEY_UP)) { + if ((loc >= 16 && loc < 32) || (loc >= 48 && loc < 64)) { + inc = -16; + } else if (loc == 64) { + inc = -48; + } else if (loc == 65) { + inc = -45; + } else if (loc == 66) { + inc = -42; + } else if (loc == 67) { + inc = -39; + } else if (loc == 68) { + inc = -20; + } else if (loc == 69) { + inc = -17; + } else if (loc == 70) { + inc = -14; + } else if (loc == 71) { + inc = -11; + } + } else { + if (loc < 16 || (loc >= 32 && loc < 48)) { + inc = 16; + } else if (loc >= 16 && loc <= 19){ + inc = 48 - (loc - 16); + } else if (loc >= 20 && loc <= 23){ + inc = 45 - (loc - 20); + } else if (loc >= 24 && loc <= 27){ + inc = 42 - (loc - 24); + } else if (loc >= 28 && loc <= 31){ + inc = 39 - (loc - 28); + } else if (loc >= 48 && loc <= 51){ + inc = 20 - (loc - 48); + } else if (loc >= 52 && loc <= 55){ + inc = 17 - (loc - 52); + } else if (loc >= 56 && loc <= 59){ + inc = 14 - (loc - 56); + } else if (loc >= 60 && loc <= 63){ + inc = 11 - (loc - 60); + } + } + draw_parameters_cursor_ch3(param_selection_loc, COL_BG); + param_selection_loc = CLAMP(loc + inc, 0, 71); + draw_parameters_cursor_ch3(param_selection_loc, COL_BLUE); + } + if (key_tap(KEY_R) || key_tap(KEY_L)) { + int odd = param_selection_loc & 0x1; + int inc; + if (key_tap(KEY_R)) { + inc = 1; + } else { + inc = -1; + } + // Wave: AA BB CC DD ... + // ^^ + // |`- odd + // `-- even + // if (param_selection_loc < 32) { + // u8 byte_number = param_selection_loc >> 1; + // u8 byte = sequences[2][trig_selection_loc].wave_a[byte_number]; + // if (odd) { + // byte = (~0xF & byte) | ((byte + inc) & 0xF); + // } else { + // byte = (0xF & byte) | (((byte >> 4) + inc) & 0xF) << 4; + // } + // sequences[2][trig_selection_loc].wave_a[byte_number] = byte; + // } else if (param_selection_loc < 64){ + // u8 byte_number = (param_selection_loc - 32) >> 1; + // u8 byte = sequences[2][trig_selection_loc].wave_b[byte_number]; + // if (odd) { + // byte = (~0xF & byte) | (byte + inc); + // } else { + // byte = (0xF & byte) | ((byte >> 4) + inc) << 4; + // } + // sequences[2][trig_selection_loc].wave_b[byte_number] = byte; + // } else if (param_selection_loc == 64){ + // dma_copy(&trig->wave_a, &sine_wave, 16, 3); + // } else if (param_selection_loc == 65){ + // dma_copy(&trig->wave_a, &saw_wave, 16, 3); + // } else if (param_selection_loc == 66){ + // dma_copy(&trig->wave_a, &square_wave, 16, 3); + // } else if (param_selection_loc == 67){ + // u32 rand_wave[4] = { + // rng32(), rng32(), rng32(), rng32(), + // }; + // dma_copy(&trig->wave_a, &rand_wave, 16, 3); + // } else if (param_selection_loc == 68){ + // dma_copy(&trig->wave_b, &sine_wave, 16, 3); + // } else if (param_selection_loc == 69){ + // dma_copy(&trig->wave_b, &saw_wave, 16, 3); + // } else if (param_selection_loc == 70){ + // dma_copy(&trig->wave_b, &square_wave, 16, 3); + // } else if (param_selection_loc == 71){ + // u32 rand_wave[4] = { + // rng32(), rng32(), rng32(), rng32(), + // }; + // dma_copy(&trig->wave_b, &rand_wave, 16, 3); + // } + } } void @@ -1220,7 +1285,7 @@ handle_trigger_selection(void) { input_handler = handle_param_selection_ch3; } break; } - // TODO: draw param cursor. + draw_parameters_cursor(param_selection_loc, COL_BLUE); draw_trig_cursor(trig_selection_loc, COL_GREY); } } -- cgit v1.2.1