diff options
author | Bad Diode <bd@badd10de.dev> | 2023-06-29 11:07:04 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-06-29 11:07:04 +0200 |
commit | 2c05602bcb603fdc82a5ec36f384db74090486c7 (patch) | |
tree | 13df2f2d8a9c47c42fabbdafe1bdfd2df9abe7a5 | |
parent | a62819f29862c44b3f76eb4986d0b6a1bdb20255 (diff) | |
download | launchpad-polymaker-2c05602bcb603fdc82a5ec36f384db74090486c7.tar.gz launchpad-polymaker-2c05602bcb603fdc82a5ec36f384db74090486c7.zip |
Add fader CC messages
-rw-r--r-- | src/app.c | 110 |
1 files changed, 105 insertions, 5 deletions
@@ -118,6 +118,17 @@ u16 font_numbers[10] = { | |||
118 | 0xF792, | 118 | 0xF792, |
119 | }; | 119 | }; |
120 | 120 | ||
121 | static u8 cc_map[8 * 8] = { | ||
122 | 1, 2, 4, 11, 12, 13, 14, 15, | ||
123 | 16, 17, 18, 19, 20, 21, 22, 23, | ||
124 | 70, 71, 72, 73, 74, 75, 76, 77, | ||
125 | 78, 79, 80, 81, 82, 83, 84, 85, | ||
126 | 86, 87, 90, 91, 92, 93, 94, 95, | ||
127 | 102, 103, 104, 105, 106, 107, 108, 109, | ||
128 | 110, 111, 112, 113, 114, 115, 116, 117, | ||
129 | 118, 119, 88, 89, 3, 4, 5, 7, | ||
130 | }; | ||
131 | |||
121 | // Enums and structs. | 132 | // Enums and structs. |
122 | typedef enum Pads { | 133 | typedef enum Pads { |
123 | POLY_PAD_ROW_0 = 11 + 10 * 7 + 0, | 134 | POLY_PAD_ROW_0 = 11 + 10 * 7 + 0, |
@@ -281,6 +292,7 @@ typedef struct State { | |||
281 | Sensitivity kbd_sense; | 292 | Sensitivity kbd_sense; |
282 | // Faders. | 293 | // Faders. |
283 | u8 fader_page; | 294 | u8 fader_page; |
295 | u8 faders[8 * 8]; | ||
284 | } State; | 296 | } State; |
285 | 297 | ||
286 | // Globals. | 298 | // Globals. |
@@ -361,6 +373,12 @@ select_ch_sel(u8 target) { | |||
361 | state.ch_listen[target] = !state.ch_listen[target]; | 373 | state.ch_listen[target] = !state.ch_listen[target]; |
362 | } | 374 | } |
363 | 375 | ||
376 | void | ||
377 | save_state(void) { | ||
378 | save_request = 1; | ||
379 | save_timer = SAVE_TIMER; | ||
380 | } | ||
381 | |||
364 | int | 382 | int |
365 | kbd_find_note(int index) { | 383 | kbd_find_note(int index) { |
366 | int note = -1; | 384 | int note = -1; |
@@ -443,9 +461,60 @@ kbd_find_note(int index) { | |||
443 | } | 461 | } |
444 | 462 | ||
445 | void | 463 | void |
446 | save_state(void) { | 464 | handle_faders(int index) { |
447 | save_request = 1; | 465 | int value = -1; |
448 | save_timer = SAVE_TIMER; | 466 | int fader = -1; |
467 | if (index >= POLY_PAD_ROW_0 && index <= (POLY_PAD_ROW_0 + 7)) { | ||
468 | value = 127; | ||
469 | fader = index - POLY_PAD_ROW_0; | ||
470 | } | ||
471 | if (index >= POLY_PAD_ROW_1 && index <= (POLY_PAD_ROW_1 + 7)) { | ||
472 | value = 108; | ||
473 | fader = index - POLY_PAD_ROW_1; | ||
474 | } | ||
475 | if (index >= POLY_PAD_ROW_2 && index <= (POLY_PAD_ROW_2 + 7)) { | ||
476 | value = 90; | ||
477 | fader = index - POLY_PAD_ROW_2; | ||
478 | } | ||
479 | if (index >= POLY_PAD_ROW_3 && index <= (POLY_PAD_ROW_3 + 7)) { | ||
480 | value = 72; | ||
481 | fader = index - POLY_PAD_ROW_3; | ||
482 | } | ||
483 | if (index >= POLY_PAD_ROW_4 && index <= (POLY_PAD_ROW_4 + 7)) { | ||
484 | value = 54; | ||
485 | fader = index - POLY_PAD_ROW_4; | ||
486 | } | ||
487 | if (index >= POLY_PAD_ROW_5 && index <= (POLY_PAD_ROW_5 + 7)) { | ||
488 | value = 36; | ||
489 | fader = index - POLY_PAD_ROW_5; | ||
490 | } | ||
491 | if (index >= POLY_PAD_ROW_6 && index <= (POLY_PAD_ROW_6 + 7)) { | ||
492 | value = 18; | ||
493 | fader = index - POLY_PAD_ROW_6; | ||
494 | } | ||
495 | if (index >= POLY_PAD_ROW_7 && index <= (POLY_PAD_ROW_7 + 7)) { | ||
496 | value = 0; | ||
497 | fader = index - POLY_PAD_ROW_7; | ||
498 | } | ||
499 | if (fader < 0 || value < 0) { | ||
500 | return; | ||
501 | } | ||
502 | |||
503 | // Update fader state. | ||
504 | state.faders[state.fader_page * 8 + fader] = value; | ||
505 | // save_state(); // NOTE: Too much flashing... | ||
506 | |||
507 | // Send CC. | ||
508 | u8 channel = 0; | ||
509 | for (int i = 0; i < 16; i++) { | ||
510 | if (state.ch_listen[i] != 0) { | ||
511 | channel = i; | ||
512 | break; | ||
513 | } | ||
514 | } | ||
515 | hal_send_midi(USBSTANDALONE, CC | channel, cc_map[state.fader_page * 8 + fader], value); | ||
516 | hal_send_midi(USBMIDI, CC | channel, cc_map[state.fader_page * 8 + fader], value); | ||
517 | hal_send_midi(DINMIDI, CC | channel, cc_map[state.fader_page * 8 + fader], value); | ||
449 | } | 518 | } |
450 | 519 | ||
451 | void | 520 | void |
@@ -649,7 +718,7 @@ app_surface_event(u8 type, u8 index, u8 value) { | |||
649 | state.fader_page = 7; | 718 | state.fader_page = 7; |
650 | save_state(); | 719 | save_state(); |
651 | } break; | 720 | } break; |
652 | default: break; | 721 | default: { handle_faders(index); } break; |
653 | } | 722 | } |
654 | } break; | 723 | } break; |
655 | default: break; | 724 | default: break; |
@@ -1028,6 +1097,36 @@ draw_poly_faders(void) { | |||
1028 | case 7: { DRAW(POLY_PAD_ROW_7 + 8, GREY); } break; | 1097 | case 7: { DRAW(POLY_PAD_ROW_7 + 8, GREY); } break; |
1029 | default: break; | 1098 | default: break; |
1030 | } | 1099 | } |
1100 | Color colors[] = { | ||
1101 | PINK, BLUE, GREEN, YELLOW, ORANGE, RED, CYAN, PURPLE, | ||
1102 | }; | ||
1103 | for (int i = 0; i < 8; i++) { | ||
1104 | u8 val = state.faders[state.fader_page * 8 + i]; | ||
1105 | if (val >= 0) { | ||
1106 | DRAW(POLY_PAD_ROW_7 + i, colors[i]); | ||
1107 | } | ||
1108 | if (val >= 18) { | ||
1109 | DRAW(POLY_PAD_ROW_6 + i, colors[i]); | ||
1110 | } | ||
1111 | if (val >= 36) { | ||
1112 | DRAW(POLY_PAD_ROW_5 + i, colors[i]); | ||
1113 | } | ||
1114 | if (val >= 54) { | ||
1115 | DRAW(POLY_PAD_ROW_4 + i, colors[i]); | ||
1116 | } | ||
1117 | if (val >= 72) { | ||
1118 | DRAW(POLY_PAD_ROW_3 + i, colors[i]); | ||
1119 | } | ||
1120 | if (val >= 90) { | ||
1121 | DRAW(POLY_PAD_ROW_2 + i, colors[i]); | ||
1122 | } | ||
1123 | if (val >= 108) { | ||
1124 | DRAW(POLY_PAD_ROW_1 + i, colors[i]); | ||
1125 | } | ||
1126 | if (val >= 127) { | ||
1127 | DRAW(POLY_PAD_ROW_0 + i, colors[i]); | ||
1128 | } | ||
1129 | } | ||
1031 | } | 1130 | } |
1032 | 1131 | ||
1033 | void | 1132 | void |
@@ -1059,7 +1158,7 @@ app_timer_event() { | |||
1059 | void | 1158 | void |
1060 | app_init(const u16 *adc_raw) { | 1159 | app_init(const u16 *adc_raw) { |
1061 | hal_read_flash(0, (u8*)&state, sizeof(State)); | 1160 | hal_read_flash(0, (u8*)&state, sizeof(State)); |
1062 | if (state.magic != 0xbadd10d0) { | 1161 | if (state.magic != 0xbadd10de) { |
1063 | state = (State){ | 1162 | state = (State){ |
1064 | .magic = 0xbadd10de, | 1163 | .magic = 0xbadd10de, |
1065 | .active = 1, | 1164 | .active = 1, |
@@ -1073,6 +1172,7 @@ app_init(const u16 *adc_raw) { | |||
1073 | .kbd_sense = SENS_MED, | 1172 | .kbd_sense = SENS_MED, |
1074 | }; | 1173 | }; |
1075 | } | 1174 | } |
1175 | // TODO: Send non-zero fader CCs at the start. | ||
1076 | 1176 | ||
1077 | // store off the raw ADC frame pointer for later use | 1177 | // store off the raw ADC frame pointer for later use |
1078 | g_ADC = adc_raw; | 1178 | g_ADC = adc_raw; |