From 2c05602bcb603fdc82a5ec36f384db74090486c7 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 29 Jun 2023 11:07:04 +0200 Subject: Add fader CC messages --- src/app.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 5 deletions(-) (limited to 'src/app.c') diff --git a/src/app.c b/src/app.c index 6de719b..b28e622 100644 --- a/src/app.c +++ b/src/app.c @@ -118,6 +118,17 @@ u16 font_numbers[10] = { 0xF792, }; +static u8 cc_map[8 * 8] = { + 1, 2, 4, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 90, 91, 92, 93, 94, 95, + 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 88, 89, 3, 4, 5, 7, +}; + // Enums and structs. typedef enum Pads { POLY_PAD_ROW_0 = 11 + 10 * 7 + 0, @@ -281,6 +292,7 @@ typedef struct State { Sensitivity kbd_sense; // Faders. u8 fader_page; + u8 faders[8 * 8]; } State; // Globals. @@ -361,6 +373,12 @@ select_ch_sel(u8 target) { state.ch_listen[target] = !state.ch_listen[target]; } +void +save_state(void) { + save_request = 1; + save_timer = SAVE_TIMER; +} + int kbd_find_note(int index) { int note = -1; @@ -443,9 +461,60 @@ kbd_find_note(int index) { } void -save_state(void) { - save_request = 1; - save_timer = SAVE_TIMER; +handle_faders(int index) { + int value = -1; + int fader = -1; + if (index >= POLY_PAD_ROW_0 && index <= (POLY_PAD_ROW_0 + 7)) { + value = 127; + fader = index - POLY_PAD_ROW_0; + } + if (index >= POLY_PAD_ROW_1 && index <= (POLY_PAD_ROW_1 + 7)) { + value = 108; + fader = index - POLY_PAD_ROW_1; + } + if (index >= POLY_PAD_ROW_2 && index <= (POLY_PAD_ROW_2 + 7)) { + value = 90; + fader = index - POLY_PAD_ROW_2; + } + if (index >= POLY_PAD_ROW_3 && index <= (POLY_PAD_ROW_3 + 7)) { + value = 72; + fader = index - POLY_PAD_ROW_3; + } + if (index >= POLY_PAD_ROW_4 && index <= (POLY_PAD_ROW_4 + 7)) { + value = 54; + fader = index - POLY_PAD_ROW_4; + } + if (index >= POLY_PAD_ROW_5 && index <= (POLY_PAD_ROW_5 + 7)) { + value = 36; + fader = index - POLY_PAD_ROW_5; + } + if (index >= POLY_PAD_ROW_6 && index <= (POLY_PAD_ROW_6 + 7)) { + value = 18; + fader = index - POLY_PAD_ROW_6; + } + if (index >= POLY_PAD_ROW_7 && index <= (POLY_PAD_ROW_7 + 7)) { + value = 0; + fader = index - POLY_PAD_ROW_7; + } + if (fader < 0 || value < 0) { + return; + } + + // Update fader state. + state.faders[state.fader_page * 8 + fader] = value; + // save_state(); // NOTE: Too much flashing... + + // Send CC. + u8 channel = 0; + for (int i = 0; i < 16; i++) { + if (state.ch_listen[i] != 0) { + channel = i; + 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); } void @@ -649,7 +718,7 @@ app_surface_event(u8 type, u8 index, u8 value) { state.fader_page = 7; save_state(); } break; - default: break; + default: { handle_faders(index); } break; } } break; default: break; @@ -1028,6 +1097,36 @@ draw_poly_faders(void) { case 7: { DRAW(POLY_PAD_ROW_7 + 8, GREY); } break; default: break; } + Color colors[] = { + PINK, BLUE, GREEN, YELLOW, ORANGE, RED, CYAN, PURPLE, + }; + for (int i = 0; i < 8; i++) { + u8 val = state.faders[state.fader_page * 8 + i]; + if (val >= 0) { + DRAW(POLY_PAD_ROW_7 + i, colors[i]); + } + if (val >= 18) { + DRAW(POLY_PAD_ROW_6 + i, colors[i]); + } + if (val >= 36) { + DRAW(POLY_PAD_ROW_5 + i, colors[i]); + } + if (val >= 54) { + DRAW(POLY_PAD_ROW_4 + i, colors[i]); + } + if (val >= 72) { + DRAW(POLY_PAD_ROW_3 + i, colors[i]); + } + if (val >= 90) { + DRAW(POLY_PAD_ROW_2 + i, colors[i]); + } + if (val >= 108) { + DRAW(POLY_PAD_ROW_1 + i, colors[i]); + } + if (val >= 127) { + DRAW(POLY_PAD_ROW_0 + i, colors[i]); + } + } } void @@ -1059,7 +1158,7 @@ app_timer_event() { void app_init(const u16 *adc_raw) { hal_read_flash(0, (u8*)&state, sizeof(State)); - if (state.magic != 0xbadd10d0) { + if (state.magic != 0xbadd10de) { state = (State){ .magic = 0xbadd10de, .active = 1, @@ -1073,6 +1172,7 @@ 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