From 6cd23251029da176a696560e175853ed38fe34d4 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 29 Jun 2023 14:29:05 +0200 Subject: Add CC send to left side buttons --- src/app.c | 152 +++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 97 insertions(+), 55 deletions(-) (limited to 'src/app.c') diff --git a/src/app.c b/src/app.c index a03eff0..f3708d6 100644 --- a/src/app.c +++ b/src/app.c @@ -174,6 +174,14 @@ typedef enum Button { POLY_PAD_PLAY_5 = POLY_PAD_ROW_5 + 8, POLY_PAD_PLAY_6 = POLY_PAD_ROW_6 + 8, POLY_PAD_PLAY_7 = POLY_PAD_ROW_7 + 8, + POLY_PAD_SHIFT = POLY_PAD_ROW_0 - 1, + POLY_PAD_CLICK = POLY_PAD_ROW_1 - 1, + POLY_PAD_UNDO = POLY_PAD_ROW_2 - 1, + POLY_PAD_DELETE = POLY_PAD_ROW_3 - 1, + POLY_PAD_QUANT = POLY_PAD_ROW_4 - 1, + POLY_PAD_DUPLIC = POLY_PAD_ROW_5 - 1, + POLY_PAD_DOUBLE = POLY_PAD_ROW_6 - 1, + POLY_PAD_REC = POLY_PAD_ROW_7 - 1, POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0, POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1, POLY_PAD_MIN_CH_2 = POLY_PAD_ROW_0 + 2, @@ -254,11 +262,11 @@ typedef struct Color { #define DRAW(PAD, CLR) hal_plot_led(TYPEPAD, (PAD), (CLR).r, (CLR).g, (CLR).b) #define BLACK (Color){ 0 , 0 , 0 } #define WHITE (Color){ MAXLED , MAXLED , MAXLED } -#define GREY (Color){ MAXLED / 2 , MAXLED / 2 , MAXLED / 2 } +#define GREY (Color){ MAXLED / 8 , MAXLED / 8 , MAXLED / 8 } #define RED (Color){ 62 , 8 , 15 } -#define RED_DIM (Color){ MAXLED / 5 , 0 , 0 } +#define RED_DIM (Color){ 62 / 5 , 0 , 3 } #define YELLOW (Color){ 61 , 58 , 25 } -#define YELLOW_DIM (Color){ 5 , 5 , 0 } +#define YELLOW_DIM (Color){ 61 / 5 , 58 / 5 , 25 / 5 } #define PURPLE (Color){ 20 , 0 , 40 } #define PURPLE_DIM (Color){ 2 , 0 , 5 } #define GREEN (Color){ 17 , 53 , 36 } @@ -461,6 +469,13 @@ kbd_find_note(int index) { return -1; } +void +send_cc(u8 channel, u8 cc, u8 val) { + hal_send_midi(USBSTANDALONE, CC | channel, cc, val); + hal_send_midi(USBMIDI, CC | channel, cc, val); + hal_send_midi(DINMIDI, CC | channel, cc, val); +} + void handle_faders(int index) { int value = -1; @@ -513,29 +528,53 @@ handle_faders(int index) { break; } } - hal_send_midi(USBSTANDALONE, CC | channel, cc_map[state.fader_page * 8 + fader], value); - hal_send_midi(USBMIDI, CC | channel, cc_map[state.fader_page * 8 + fader], value); - hal_send_midi(DINMIDI, CC | channel, cc_map[state.fader_page * 8 + fader], value); + send_cc(channel, cc_map[state.fader_page * 8 + fader], value); } void app_surface_event(u8 type, u8 index, u8 value) { switch (type) { case TYPEPAD: { + if (value) { + u8 channel = 0; + for (int i = 0; i < 16; i++) { + if (state.ch_listen[i] != 0) { + channel = i; + break; + } + } + switch (index) { + // Different sections. + case POLY_PAD_SESSION: { + state.mode = MOD_POLY_MAIN; + save_state(); + } break; + case POLY_PAD_DEVICE: { + state.mode = MOD_POLY_FADER; + save_state(); + } break; + case POLY_PAD_NOTE: { + state.mode = MOD_POLY_KBD; + save_state(); + } break; + // Side buttons. + case POLY_PAD_SHIFT: { send_cc(channel, 102, 127); } break; + case POLY_PAD_CLICK: { send_cc(channel, 103, 127); } break; + case POLY_PAD_UNDO: { send_cc(channel, 104, 127); } break; + case POLY_PAD_DELETE: { send_cc(channel, 105, 127); } break; + case POLY_PAD_QUANT: { send_cc(channel, 106, 127); } break; + case POLY_PAD_DUPLIC: { send_cc(channel, 107, 127); } break; + case POLY_PAD_DOUBLE: { send_cc(channel, 108, 127); } break; + case POLY_PAD_REC: { send_cc(channel, 109, 127); } break; + default: break; + } + } switch (state.mode) { case MOD_POLY_MAIN: { if (value) { switch (index) { case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; case POLY_PAD_STEAL: { poly_steal_cycle(); } break; - case POLY_PAD_NOTE: { - state.mode = MOD_POLY_KBD; - save_state(); - } break; - case POLY_PAD_DEVICE: { - state.mode = MOD_POLY_FADER; - save_state(); - } break; default: break; } } @@ -621,15 +660,6 @@ app_surface_event(u8 type, u8 index, u8 value) { case POLY_PAD_LEFT: { if (state.kbd_root > 0) { state.kbd_root--; } } break; - // Different sections. - case POLY_PAD_SESSION: { - state.mode = MOD_POLY_MAIN; - save_state(); - } break; - case POLY_PAD_DEVICE: { - state.mode = MOD_POLY_FADER; - save_state(); - } break; default: break; } return; @@ -677,15 +707,6 @@ app_surface_event(u8 type, u8 index, u8 value) { return; } switch (index) { - // Different sections. - case POLY_PAD_SESSION: { - state.mode = MOD_POLY_MAIN; - save_state(); - } break; - case POLY_PAD_NOTE: { - state.mode = MOD_POLY_KBD; - save_state(); - } break; // Fader page. case POLY_PAD_PLAY_0: { state.fader_page = 0; @@ -924,9 +945,13 @@ clear_pads(void) { for (int i = 0; i < PAD_COUNT; ++i) { DRAW(ADC_MAP[i], BLACK); } - DRAW(POLY_PAD_SESSION, BLACK); - DRAW(POLY_PAD_NOTE, BLACK); - DRAW(POLY_PAD_DEVICE, BLACK); + DRAW(POLY_PAD_UP, BLACK); + DRAW(POLY_PAD_DOWN, BLACK); + DRAW(POLY_PAD_LEFT, BLACK); + DRAW(POLY_PAD_RIGHT, BLACK); + DRAW(POLY_PAD_SESSION, GREY); + DRAW(POLY_PAD_NOTE, GREY); + DRAW(POLY_PAD_DEVICE, GREY); DRAW(POLY_PAD_USER, BLACK); DRAW(POLY_PAD_PLAY_0, BLACK); DRAW(POLY_PAD_PLAY_1, BLACK); @@ -936,6 +961,14 @@ clear_pads(void) { DRAW(POLY_PAD_PLAY_5, BLACK); DRAW(POLY_PAD_PLAY_6, BLACK); DRAW(POLY_PAD_PLAY_7, BLACK); + DRAW(POLY_PAD_SHIFT, PINK); + DRAW(POLY_PAD_CLICK, BLUE); + DRAW(POLY_PAD_UNDO, GREEN); + DRAW(POLY_PAD_DELETE, YELLOW); + DRAW(POLY_PAD_QUANT, ORANGE); + DRAW(POLY_PAD_DUPLIC, CYAN); + DRAW(POLY_PAD_DOUBLE, PURPLE); + DRAW(POLY_PAD_REC, RED); } void @@ -969,7 +1002,7 @@ draw_poly_kbd_sens_button(void) { void draw_poly_main(void) { - DRAW(POLY_PAD_SESSION, GREY); + DRAW(POLY_PAD_SESSION, WHITE); print_number((n_voices / 10) % 10, WHITE, 0, 0); print_number(n_voices % 10, WHITE, 4, 0); draw_poly_active_button(); @@ -980,7 +1013,7 @@ void draw_min_channel(void) { for (u8 i = 0; i < 8; i++) { if (i == state.ch_min) { - DRAW(POLY_PAD_MIN_CH_0 + i, GREY); + DRAW(POLY_PAD_MIN_CH_0 + i, WHITE); } else if (state.ch_max >= 8 || i <= state.ch_max) { DRAW(POLY_PAD_MIN_CH_0 + i, RED); } else { @@ -989,7 +1022,7 @@ draw_min_channel(void) { } for (u8 i = 0; i < 8; i++) { if ((i + 8) == state.ch_min) { - DRAW(POLY_PAD_MIN_CH_8 + i, GREY); + DRAW(POLY_PAD_MIN_CH_8 + i, WHITE); } else if (state.ch_max >= 16 || (i + 8) <= state.ch_max) { DRAW(POLY_PAD_MIN_CH_8 + i, RED); } else { @@ -1002,7 +1035,7 @@ void draw_max_channel(void) { for (u8 i = 0; i < 8; i++) { if (i == state.ch_max) { - DRAW(POLY_PAD_MAX_CH_0 + i, GREY); + DRAW(POLY_PAD_MAX_CH_0 + i, WHITE); } else if (i < state.ch_min) { DRAW(POLY_PAD_MAX_CH_0 + i, YELLOW_DIM); } else { @@ -1011,7 +1044,7 @@ draw_max_channel(void) { } for (u8 i = 0; i < 8; i++) { if ((i + 8) == state.ch_max) { - DRAW(POLY_PAD_MAX_CH_8 + i, GREY); + DRAW(POLY_PAD_MAX_CH_8 + i, WHITE); } else if (state.ch_min >= 8 && (i + 8) < state.ch_min) { DRAW(POLY_PAD_MAX_CH_8 + i, YELLOW_DIM); } else { @@ -1056,7 +1089,7 @@ draw_kbd(int loc, Color clr) { int idx_top = row_idx[loc]; int idx_bot = row_idx[loc + 1]; Color colors[] = { - PINK, BLUE, GREEN, YELLOW, ORANGE, RED, CYAN, + PINK, BLUE, GREEN, YELLOW, ORANGE, CYAN, PURPLE, }; Color root_clr = colors[state.kbd_octave + 3 - loc / 2]; DRAW(idx_top + 1, state.kbd_root == 1 ? WHITE : root_clr); @@ -1077,7 +1110,11 @@ draw_kbd(int loc, Color clr) { void draw_poly_kbd(void) { - DRAW(POLY_PAD_NOTE, GREY); + DRAW(POLY_PAD_UP, GREY); + DRAW(POLY_PAD_DOWN, GREY); + DRAW(POLY_PAD_LEFT, GREY); + DRAW(POLY_PAD_RIGHT, GREY); + DRAW(POLY_PAD_NOTE, WHITE); draw_kbd(0, PURPLE); draw_kbd(2, PURPLE); draw_kbd(4, PURPLE); @@ -1086,20 +1123,26 @@ draw_poly_kbd(void) { void draw_poly_faders(void) { - DRAW(POLY_PAD_DEVICE, GREY); - switch (state.fader_page) { - case 0: { DRAW(POLY_PAD_ROW_0 + 8, GREY); } break; - case 1: { DRAW(POLY_PAD_ROW_1 + 8, GREY); } break; - case 2: { DRAW(POLY_PAD_ROW_2 + 8, GREY); } break; - case 3: { DRAW(POLY_PAD_ROW_3 + 8, GREY); } break; - case 4: { DRAW(POLY_PAD_ROW_4 + 8, GREY); } break; - case 5: { DRAW(POLY_PAD_ROW_5 + 8, GREY); } break; - case 6: { DRAW(POLY_PAD_ROW_6 + 8, GREY); } break; - case 7: { DRAW(POLY_PAD_ROW_7 + 8, GREY); } break; - default: break; + DRAW(POLY_PAD_DEVICE, WHITE); + for (int i = 0; i < 8; i++) { + Color clr = GREY; + if (i == state.fader_page) { + clr = WHITE; + } + switch (i) { + case 0: { DRAW(POLY_PAD_ROW_0 + 8, clr); } break; + case 1: { DRAW(POLY_PAD_ROW_1 + 8, clr); } break; + case 2: { DRAW(POLY_PAD_ROW_2 + 8, clr); } break; + case 3: { DRAW(POLY_PAD_ROW_3 + 8, clr); } break; + case 4: { DRAW(POLY_PAD_ROW_4 + 8, clr); } break; + case 5: { DRAW(POLY_PAD_ROW_5 + 8, clr); } break; + case 6: { DRAW(POLY_PAD_ROW_6 + 8, clr); } break; + case 7: { DRAW(POLY_PAD_ROW_7 + 8, clr); } break; + default: break; + } } Color colors[] = { - PINK, BLUE, GREEN, YELLOW, ORANGE, RED, CYAN, PURPLE, + PINK, BLUE, GREEN, YELLOW, ORANGE, CYAN, PURPLE, RED, }; for (int i = 0; i < 8; i++) { u8 val = state.faders[state.fader_page * 8 + i]; @@ -1173,7 +1216,6 @@ app_init(const u16 *adc_raw) { .kbd_sense = SENS_MED, }; } - // TODO: Send non-zero fader CCs at the start. // store off the raw ADC frame pointer for later use g_ADC = adc_raw; -- cgit v1.2.1