summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-06-29 11:07:04 +0200
committerBad Diode <bd@badd10de.dev>2023-06-29 11:07:04 +0200
commit2c05602bcb603fdc82a5ec36f384db74090486c7 (patch)
tree13df2f2d8a9c47c42fabbdafe1bdfd2df9abe7a5
parenta62819f29862c44b3f76eb4986d0b6a1bdb20255 (diff)
downloadlaunchpad-polymaker-2c05602bcb603fdc82a5ec36f384db74090486c7.tar.gz
launchpad-polymaker-2c05602bcb603fdc82a5ec36f384db74090486c7.zip
Add fader CC messages
-rw-r--r--src/app.c110
1 files changed, 105 insertions, 5 deletions
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] = {
118 0xF792, 118 0xF792,
119}; 119};
120 120
121static 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.
122typedef enum Pads { 133typedef 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
376void
377save_state(void) {
378 save_request = 1;
379 save_timer = SAVE_TIMER;
380}
381
364int 382int
365kbd_find_note(int index) { 383kbd_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
445void 463void
446save_state(void) { 464handle_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
451void 520void
@@ -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
1033void 1132void
@@ -1059,7 +1158,7 @@ app_timer_event() {
1059void 1158void
1060app_init(const u16 *adc_raw) { 1159app_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;