From 9bce3c39f535edcc4cd7cc830824f6806e3de98b Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 28 Jun 2023 18:09:09 +0200 Subject: Add velocity sensitivity control --- src/app.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) (limited to 'src/app.c') diff --git a/src/app.c b/src/app.c index 0c3806b..de3d796 100644 --- a/src/app.c +++ b/src/app.c @@ -32,6 +32,8 @@ #include "app.h" +#define LERP(x, y0, y1) ((float)y0 + (float)x * ((float)y1 - (float)y0)) + // Font. u16 font_numbers[10] = { /* @@ -150,6 +152,7 @@ typedef enum Button { POLY_PAD_DEVICE = POLY_TOP_ROW + 6, POLY_PAD_USER = POLY_TOP_ROW + 7, POLY_PAD_ACTIVE = 11, + POLY_PAD_KBD_SENS = 11 + 6, POLY_PAD_STEAL = 11 + 7, POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0, POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1, @@ -214,6 +217,13 @@ typedef enum Stealing { POLY_STEAL_LOW = 3, } Stealing; +typedef enum Sensitivity { + SENS_NO = 0, + SENS_LOW = 1, + SENS_MED = 2, + SENS_HIGH = 3, +} Sensitivity; + typedef struct Color { int r; int g; @@ -259,6 +269,7 @@ typedef struct State { // Keyboard. u8 kbd_octave; u8 kbd_root; + Sensitivity kbd_sense; } State; // Globals. @@ -298,10 +309,19 @@ poly_active_toggle(void) { state.active = !state.active; } +void +poly_kbd_sens_cycle(void) { + poly_stop_all(); + state.kbd_sense++; + if (state.kbd_sense > SENS_HIGH) { + state.kbd_sense = SENS_NO; + } +} + void poly_steal_cycle(void) { poly_stop_all(); - state.stealing += 1; + state.stealing++; if (state.stealing > POLY_STEAL_LOW) { state.stealing = POLY_STEAL_OFF; } @@ -483,6 +503,7 @@ app_surface_event(u8 type, u8 index, u8 value) { // Handle active toggle. case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; case POLY_PAD_STEAL: { poly_steal_cycle(); } break; + case POLY_PAD_KBD_SENS: { poly_kbd_sens_cycle(); } break; default: break; } } @@ -516,15 +537,29 @@ app_surface_event(u8 type, u8 index, u8 value) { return; } u8 channel = 0; - // TODO: Velocity on/off/curve configuration. // TODO: Aftertouch? // TODO: Per KBD channel selection. int note = kbd_find_note(index); if (note == -1) { return; } - if (value) { + float vel = value; + switch (state.kbd_sense) { + case SENS_NO: { value = 100; } break; + case SENS_LOW: { + vel = LERP(vel / 127, 55, 105); + value = vel; + } break; + case SENS_MED: { + vel = LERP(vel / 127, 40, 110); + value = vel; + } break; + case SENS_HIGH: { + vel = LERP(vel / 127, 20, 120); + value = vel; + } break; + } app_midi_event(USBSTANDALONE, NOTEON | channel, note, value); } else { app_midi_event(USBSTANDALONE, NOTEOFF | channel, note, value); @@ -750,6 +785,16 @@ draw_poly_steal_button(void) { } } +void +draw_poly_kbd_sens_button(void) { + switch (state.kbd_sense) { + case SENS_NO: { DRAW(POLY_PAD_KBD_SENS, RED); } break; + case SENS_LOW: { DRAW(POLY_PAD_KBD_SENS, CYAN); } break; + case SENS_MED: { DRAW(POLY_PAD_KBD_SENS, ORANGE); } break; + case SENS_HIGH: { DRAW(POLY_PAD_KBD_SENS, PURPLE); } break; + } +} + void draw_poly_main(void) { DRAW(POLY_PAD_SESSION, GREY); @@ -827,6 +872,7 @@ draw_poly_setup(void) { draw_max_channel(); draw_sel_channel(); draw_poly_steal_button(); + draw_poly_kbd_sens_button(); draw_poly_active_button(); } @@ -904,6 +950,7 @@ app_init(const u16 *adc_raw) { .mode = MOD_POLY_MAIN, .kbd_octave = 0, .kbd_root = 0, + .kbd_sense = SENS_MED, }; } -- cgit v1.2.1