From 87e681d8f1981020fe3b5dd888e3f333ede2a065 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 9 Feb 2023 15:51:14 +0100 Subject: Add channel selection for listening --- src/app.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 23 deletions(-) (limited to 'src/app.c') diff --git a/src/app.c b/src/app.c index 466a1a3..29d114f 100644 --- a/src/app.c +++ b/src/app.c @@ -151,6 +151,22 @@ typedef enum Button { POLY_PAD_MAX_CH_D = 11 + 10 * 4 + 5, POLY_PAD_MAX_CH_E = 11 + 10 * 4 + 6, POLY_PAD_MAX_CH_F = 11 + 10 * 4 + 7, + POLY_PAD_SEL_CH_0 = 11 + 10 * 3 + 0, + POLY_PAD_SEL_CH_1 = 11 + 10 * 3 + 1, + POLY_PAD_SEL_CH_2 = 11 + 10 * 3 + 2, + POLY_PAD_SEL_CH_3 = 11 + 10 * 3 + 3, + POLY_PAD_SEL_CH_4 = 11 + 10 * 3 + 4, + POLY_PAD_SEL_CH_5 = 11 + 10 * 3 + 5, + POLY_PAD_SEL_CH_6 = 11 + 10 * 3 + 6, + POLY_PAD_SEL_CH_7 = 11 + 10 * 3 + 7, + POLY_PAD_SEL_CH_8 = 11 + 10 * 2 + 0, + POLY_PAD_SEL_CH_9 = 11 + 10 * 2 + 1, + POLY_PAD_SEL_CH_A = 11 + 10 * 2 + 2, + POLY_PAD_SEL_CH_B = 11 + 10 * 2 + 3, + POLY_PAD_SEL_CH_C = 11 + 10 * 2 + 4, + POLY_PAD_SEL_CH_D = 11 + 10 * 2 + 5, + POLY_PAD_SEL_CH_E = 11 + 10 * 2 + 6, + POLY_PAD_SEL_CH_F = 11 + 10 * 2 + 7, } Button; typedef enum Mode { @@ -171,7 +187,8 @@ u16 frame = 0; u16 n_voices = 0; u8 active = 1; u8 ch_min = 0; -u8 ch_max = 4; +u8 ch_max = 7; +u8 ch_listen[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; Mode mode = MOD_POLY_SETUP; Voice voices[16] = {0}; @@ -210,6 +227,11 @@ select_ch_max(u8 target) { } } +void +select_ch_sel(u8 target) { + ch_listen[target] = !ch_listen[target]; +} + void app_surface_event(u8 type, u8 index, u8 value) { switch (type) { @@ -257,7 +279,23 @@ app_surface_event(u8 type, u8 index, u8 value) { case POLY_PAD_MAX_CH_D: { select_ch_max(13); } break; case POLY_PAD_MAX_CH_E: { select_ch_max(14); } break; case POLY_PAD_MAX_CH_F: { select_ch_max(15); } break; - // TODO: Handle listen channel selection. + // Handle listen channel selection. + case POLY_PAD_SEL_CH_0: { select_ch_sel(0); } break; + case POLY_PAD_SEL_CH_1: { select_ch_sel(1); } break; + case POLY_PAD_SEL_CH_2: { select_ch_sel(2); } break; + case POLY_PAD_SEL_CH_3: { select_ch_sel(3); } break; + case POLY_PAD_SEL_CH_4: { select_ch_sel(4); } break; + case POLY_PAD_SEL_CH_5: { select_ch_sel(5); } break; + case POLY_PAD_SEL_CH_6: { select_ch_sel(6); } break; + case POLY_PAD_SEL_CH_7: { select_ch_sel(7); } break; + case POLY_PAD_SEL_CH_8: { select_ch_sel(8); } break; + case POLY_PAD_SEL_CH_9: { select_ch_sel(9); } break; + case POLY_PAD_SEL_CH_A: { select_ch_sel(10); } break; + case POLY_PAD_SEL_CH_B: { select_ch_sel(11); } break; + case POLY_PAD_SEL_CH_C: { select_ch_sel(12); } break; + case POLY_PAD_SEL_CH_D: { select_ch_sel(13); } break; + case POLY_PAD_SEL_CH_E: { select_ch_sel(14); } break; + case POLY_PAD_SEL_CH_F: { select_ch_sel(15); } break; // Handle active toggle. case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; default: break; @@ -295,6 +333,11 @@ app_midi_event(u8 port, u8 status, u8 d1, u8 d2) { return; } u8 channel = status & 0x0F; + // If the channel isn't set to listen, just passthrough the message. + if (!ch_listen[channel]) { + hal_send_midi(port, status, d1, d2); + return; + } if ((status & 0xF0) == NOTEON) { if (n_voices == (ch_max - ch_min + 1)) { return; @@ -430,10 +473,10 @@ draw_min_channel(void) { continue; } if (ch_max < 8 && i > ch_max) { - hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, 0, 0, 5); + hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, 5, 0, 0); continue; } - hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, 0, 0, MAXLED / 2); + hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, MAXLED / 2, 0, 0); } for (u8 i = 0; i < 8; i++) { if ((i + 8) == ch_min) { @@ -441,37 +484,25 @@ draw_min_channel(void) { continue; } if (ch_max < 16 && (i + 8) > ch_max) { - hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, 0, 0, 5); + hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, 5, 0, 0); continue; } - hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, 0, 0, MAXLED / 2); + hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, MAXLED / 2, 0, 0); } } void draw_max_channel(void) { - // for (u8 i = 0; i < 8; i++) { - // u8 color = 5; - // if (i == ch_max) { - // color = MAXLED; - // } - // hal_plot_led(TYPEPAD, 11 + 10 * 5 + i, color, 10, 10); - // color = 5; - // if (i + 8 == ch_max) { - // color = MAXLED; - // } - // hal_plot_led(TYPEPAD, 11 + 10 * 4 + i, color, 10, 10); - // } for (u8 i = 0; i < 8; i++) { if (i == ch_max) { hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, MAXLED, MAXLED, MAXLED); continue; } if (i < ch_min) { - hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, 5, 0, 0); + hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, 5, 5, 0); continue; } - hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, MAXLED / 2, 0, 0); + hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, MAXLED / 2, MAXLED / 2, 0); } for (u8 i = 0; i < 8; i++) { if ((i + 8) == ch_max) { @@ -479,10 +510,28 @@ draw_max_channel(void) { continue; } if (ch_min >= 8 && (i + 8) < ch_min) { - hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, 5, 0, 0); + hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, 5, 5, 0); continue; } - hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, MAXLED / 2, 0, 0); + hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, MAXLED / 2, MAXLED / 2, 0); + } +} + +void +draw_sel_channel(void) { + for (u8 i = 0; i < 8; i++) { + if (ch_listen[i]) { + hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_0 + i, 20, 0, 40); + } else { + hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_0 + i, 2, 0, 5); + } + } + for (u8 i = 0; i < 8; i++) { + if (ch_listen[i + 8]) { + hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_8 + i, 20, 0, 40); + } else { + hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_8 + i, 2, 0, 5); + } } } @@ -491,7 +540,7 @@ draw_poly_setup(void) { // TODO: ... draw_min_channel(); draw_max_channel(); - // draw_listen_channel(); + draw_sel_channel(); draw_poly_active_button(); } -- cgit v1.2.1