summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-06-29 14:29:05 +0200
committerBad Diode <bd@badd10de.dev>2023-06-29 14:29:05 +0200
commit6cd23251029da176a696560e175853ed38fe34d4 (patch)
tree47d00555f75d239623e9466ffe8f3c63b6a8f494
parentd3e457b9904c0ae51ce4e066c792cf04999a1165 (diff)
downloadlaunchpad-polymaker-6cd23251029da176a696560e175853ed38fe34d4.tar.gz
launchpad-polymaker-6cd23251029da176a696560e175853ed38fe34d4.zip
Add CC send to left side buttons
-rw-r--r--src/app.c152
1 files changed, 97 insertions, 55 deletions
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 {
174 POLY_PAD_PLAY_5 = POLY_PAD_ROW_5 + 8, 174 POLY_PAD_PLAY_5 = POLY_PAD_ROW_5 + 8,
175 POLY_PAD_PLAY_6 = POLY_PAD_ROW_6 + 8, 175 POLY_PAD_PLAY_6 = POLY_PAD_ROW_6 + 8,
176 POLY_PAD_PLAY_7 = POLY_PAD_ROW_7 + 8, 176 POLY_PAD_PLAY_7 = POLY_PAD_ROW_7 + 8,
177 POLY_PAD_SHIFT = POLY_PAD_ROW_0 - 1,
178 POLY_PAD_CLICK = POLY_PAD_ROW_1 - 1,
179 POLY_PAD_UNDO = POLY_PAD_ROW_2 - 1,
180 POLY_PAD_DELETE = POLY_PAD_ROW_3 - 1,
181 POLY_PAD_QUANT = POLY_PAD_ROW_4 - 1,
182 POLY_PAD_DUPLIC = POLY_PAD_ROW_5 - 1,
183 POLY_PAD_DOUBLE = POLY_PAD_ROW_6 - 1,
184 POLY_PAD_REC = POLY_PAD_ROW_7 - 1,
177 POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0, 185 POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0,
178 POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1, 186 POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1,
179 POLY_PAD_MIN_CH_2 = POLY_PAD_ROW_0 + 2, 187 POLY_PAD_MIN_CH_2 = POLY_PAD_ROW_0 + 2,
@@ -254,11 +262,11 @@ typedef struct Color {
254#define DRAW(PAD, CLR) hal_plot_led(TYPEPAD, (PAD), (CLR).r, (CLR).g, (CLR).b) 262#define DRAW(PAD, CLR) hal_plot_led(TYPEPAD, (PAD), (CLR).r, (CLR).g, (CLR).b)
255#define BLACK (Color){ 0 , 0 , 0 } 263#define BLACK (Color){ 0 , 0 , 0 }
256#define WHITE (Color){ MAXLED , MAXLED , MAXLED } 264#define WHITE (Color){ MAXLED , MAXLED , MAXLED }
257#define GREY (Color){ MAXLED / 2 , MAXLED / 2 , MAXLED / 2 } 265#define GREY (Color){ MAXLED / 8 , MAXLED / 8 , MAXLED / 8 }
258#define RED (Color){ 62 , 8 , 15 } 266#define RED (Color){ 62 , 8 , 15 }
259#define RED_DIM (Color){ MAXLED / 5 , 0 , 0 } 267#define RED_DIM (Color){ 62 / 5 , 0 , 3 }
260#define YELLOW (Color){ 61 , 58 , 25 } 268#define YELLOW (Color){ 61 , 58 , 25 }
261#define YELLOW_DIM (Color){ 5 , 5 , 0 } 269#define YELLOW_DIM (Color){ 61 / 5 , 58 / 5 , 25 / 5 }
262#define PURPLE (Color){ 20 , 0 , 40 } 270#define PURPLE (Color){ 20 , 0 , 40 }
263#define PURPLE_DIM (Color){ 2 , 0 , 5 } 271#define PURPLE_DIM (Color){ 2 , 0 , 5 }
264#define GREEN (Color){ 17 , 53 , 36 } 272#define GREEN (Color){ 17 , 53 , 36 }
@@ -462,6 +470,13 @@ kbd_find_note(int index) {
462} 470}
463 471
464void 472void
473send_cc(u8 channel, u8 cc, u8 val) {
474 hal_send_midi(USBSTANDALONE, CC | channel, cc, val);
475 hal_send_midi(USBMIDI, CC | channel, cc, val);
476 hal_send_midi(DINMIDI, CC | channel, cc, val);
477}
478
479void
465handle_faders(int index) { 480handle_faders(int index) {
466 int value = -1; 481 int value = -1;
467 int fader = -1; 482 int fader = -1;
@@ -513,29 +528,53 @@ handle_faders(int index) {
513 break; 528 break;
514 } 529 }
515 } 530 }
516 hal_send_midi(USBSTANDALONE, CC | channel, cc_map[state.fader_page * 8 + fader], value); 531 send_cc(channel, cc_map[state.fader_page * 8 + fader], value);
517 hal_send_midi(USBMIDI, CC | channel, cc_map[state.fader_page * 8 + fader], value);
518 hal_send_midi(DINMIDI, CC | channel, cc_map[state.fader_page * 8 + fader], value);
519} 532}
520 533
521void 534void
522app_surface_event(u8 type, u8 index, u8 value) { 535app_surface_event(u8 type, u8 index, u8 value) {
523 switch (type) { 536 switch (type) {
524 case TYPEPAD: { 537 case TYPEPAD: {
538 if (value) {
539 u8 channel = 0;
540 for (int i = 0; i < 16; i++) {
541 if (state.ch_listen[i] != 0) {
542 channel = i;
543 break;
544 }
545 }
546 switch (index) {
547 // Different sections.
548 case POLY_PAD_SESSION: {
549 state.mode = MOD_POLY_MAIN;
550 save_state();
551 } break;
552 case POLY_PAD_DEVICE: {
553 state.mode = MOD_POLY_FADER;
554 save_state();
555 } break;
556 case POLY_PAD_NOTE: {
557 state.mode = MOD_POLY_KBD;
558 save_state();
559 } break;
560 // Side buttons.
561 case POLY_PAD_SHIFT: { send_cc(channel, 102, 127); } break;
562 case POLY_PAD_CLICK: { send_cc(channel, 103, 127); } break;
563 case POLY_PAD_UNDO: { send_cc(channel, 104, 127); } break;
564 case POLY_PAD_DELETE: { send_cc(channel, 105, 127); } break;
565 case POLY_PAD_QUANT: { send_cc(channel, 106, 127); } break;
566 case POLY_PAD_DUPLIC: { send_cc(channel, 107, 127); } break;
567 case POLY_PAD_DOUBLE: { send_cc(channel, 108, 127); } break;
568 case POLY_PAD_REC: { send_cc(channel, 109, 127); } break;
569 default: break;
570 }
571 }
525 switch (state.mode) { 572 switch (state.mode) {
526 case MOD_POLY_MAIN: { 573 case MOD_POLY_MAIN: {
527 if (value) { 574 if (value) {
528 switch (index) { 575 switch (index) {
529 case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; 576 case POLY_PAD_ACTIVE: { poly_active_toggle(); } break;
530 case POLY_PAD_STEAL: { poly_steal_cycle(); } break; 577 case POLY_PAD_STEAL: { poly_steal_cycle(); } break;
531 case POLY_PAD_NOTE: {
532 state.mode = MOD_POLY_KBD;
533 save_state();
534 } break;
535 case POLY_PAD_DEVICE: {
536 state.mode = MOD_POLY_FADER;
537 save_state();
538 } break;
539 default: break; 578 default: break;
540 } 579 }
541 } 580 }
@@ -621,15 +660,6 @@ app_surface_event(u8 type, u8 index, u8 value) {
621 case POLY_PAD_LEFT: { 660 case POLY_PAD_LEFT: {
622 if (state.kbd_root > 0) { state.kbd_root--; } 661 if (state.kbd_root > 0) { state.kbd_root--; }
623 } break; 662 } break;
624 // Different sections.
625 case POLY_PAD_SESSION: {
626 state.mode = MOD_POLY_MAIN;
627 save_state();
628 } break;
629 case POLY_PAD_DEVICE: {
630 state.mode = MOD_POLY_FADER;
631 save_state();
632 } break;
633 default: break; 663 default: break;
634 } 664 }
635 return; 665 return;
@@ -677,15 +707,6 @@ app_surface_event(u8 type, u8 index, u8 value) {
677 return; 707 return;
678 } 708 }
679 switch (index) { 709 switch (index) {
680 // Different sections.
681 case POLY_PAD_SESSION: {
682 state.mode = MOD_POLY_MAIN;
683 save_state();
684 } break;
685 case POLY_PAD_NOTE: {
686 state.mode = MOD_POLY_KBD;
687 save_state();
688 } break;
689 // Fader page. 710 // Fader page.
690 case POLY_PAD_PLAY_0: { 711 case POLY_PAD_PLAY_0: {
691 state.fader_page = 0; 712 state.fader_page = 0;
@@ -924,9 +945,13 @@ clear_pads(void) {
924 for (int i = 0; i < PAD_COUNT; ++i) { 945 for (int i = 0; i < PAD_COUNT; ++i) {
925 DRAW(ADC_MAP[i], BLACK); 946 DRAW(ADC_MAP[i], BLACK);
926 } 947 }
927 DRAW(POLY_PAD_SESSION, BLACK); 948 DRAW(POLY_PAD_UP, BLACK);
928 DRAW(POLY_PAD_NOTE, BLACK); 949 DRAW(POLY_PAD_DOWN, BLACK);
929 DRAW(POLY_PAD_DEVICE, BLACK); 950 DRAW(POLY_PAD_LEFT, BLACK);
951 DRAW(POLY_PAD_RIGHT, BLACK);
952 DRAW(POLY_PAD_SESSION, GREY);
953 DRAW(POLY_PAD_NOTE, GREY);
954 DRAW(POLY_PAD_DEVICE, GREY);
930 DRAW(POLY_PAD_USER, BLACK); 955 DRAW(POLY_PAD_USER, BLACK);
931 DRAW(POLY_PAD_PLAY_0, BLACK); 956 DRAW(POLY_PAD_PLAY_0, BLACK);
932 DRAW(POLY_PAD_PLAY_1, BLACK); 957 DRAW(POLY_PAD_PLAY_1, BLACK);
@@ -936,6 +961,14 @@ clear_pads(void) {
936 DRAW(POLY_PAD_PLAY_5, BLACK); 961 DRAW(POLY_PAD_PLAY_5, BLACK);
937 DRAW(POLY_PAD_PLAY_6, BLACK); 962 DRAW(POLY_PAD_PLAY_6, BLACK);
938 DRAW(POLY_PAD_PLAY_7, BLACK); 963 DRAW(POLY_PAD_PLAY_7, BLACK);
964 DRAW(POLY_PAD_SHIFT, PINK);
965 DRAW(POLY_PAD_CLICK, BLUE);
966 DRAW(POLY_PAD_UNDO, GREEN);
967 DRAW(POLY_PAD_DELETE, YELLOW);
968 DRAW(POLY_PAD_QUANT, ORANGE);
969 DRAW(POLY_PAD_DUPLIC, CYAN);
970 DRAW(POLY_PAD_DOUBLE, PURPLE);
971 DRAW(POLY_PAD_REC, RED);
939} 972}
940 973
941void 974void
@@ -969,7 +1002,7 @@ draw_poly_kbd_sens_button(void) {
969 1002
970void 1003void
971draw_poly_main(void) { 1004draw_poly_main(void) {
972 DRAW(POLY_PAD_SESSION, GREY); 1005 DRAW(POLY_PAD_SESSION, WHITE);
973 print_number((n_voices / 10) % 10, WHITE, 0, 0); 1006 print_number((n_voices / 10) % 10, WHITE, 0, 0);
974 print_number(n_voices % 10, WHITE, 4, 0); 1007 print_number(n_voices % 10, WHITE, 4, 0);
975 draw_poly_active_button(); 1008 draw_poly_active_button();
@@ -980,7 +1013,7 @@ void
980draw_min_channel(void) { 1013draw_min_channel(void) {
981 for (u8 i = 0; i < 8; i++) { 1014 for (u8 i = 0; i < 8; i++) {
982 if (i == state.ch_min) { 1015 if (i == state.ch_min) {
983 DRAW(POLY_PAD_MIN_CH_0 + i, GREY); 1016 DRAW(POLY_PAD_MIN_CH_0 + i, WHITE);
984 } else if (state.ch_max >= 8 || i <= state.ch_max) { 1017 } else if (state.ch_max >= 8 || i <= state.ch_max) {
985 DRAW(POLY_PAD_MIN_CH_0 + i, RED); 1018 DRAW(POLY_PAD_MIN_CH_0 + i, RED);
986 } else { 1019 } else {
@@ -989,7 +1022,7 @@ draw_min_channel(void) {
989 } 1022 }
990 for (u8 i = 0; i < 8; i++) { 1023 for (u8 i = 0; i < 8; i++) {
991 if ((i + 8) == state.ch_min) { 1024 if ((i + 8) == state.ch_min) {
992 DRAW(POLY_PAD_MIN_CH_8 + i, GREY); 1025 DRAW(POLY_PAD_MIN_CH_8 + i, WHITE);
993 } else if (state.ch_max >= 16 || (i + 8) <= state.ch_max) { 1026 } else if (state.ch_max >= 16 || (i + 8) <= state.ch_max) {
994 DRAW(POLY_PAD_MIN_CH_8 + i, RED); 1027 DRAW(POLY_PAD_MIN_CH_8 + i, RED);
995 } else { 1028 } else {
@@ -1002,7 +1035,7 @@ void
1002draw_max_channel(void) { 1035draw_max_channel(void) {
1003 for (u8 i = 0; i < 8; i++) { 1036 for (u8 i = 0; i < 8; i++) {
1004 if (i == state.ch_max) { 1037 if (i == state.ch_max) {
1005 DRAW(POLY_PAD_MAX_CH_0 + i, GREY); 1038 DRAW(POLY_PAD_MAX_CH_0 + i, WHITE);
1006 } else if (i < state.ch_min) { 1039 } else if (i < state.ch_min) {
1007 DRAW(POLY_PAD_MAX_CH_0 + i, YELLOW_DIM); 1040 DRAW(POLY_PAD_MAX_CH_0 + i, YELLOW_DIM);
1008 } else { 1041 } else {
@@ -1011,7 +1044,7 @@ draw_max_channel(void) {
1011 } 1044 }
1012 for (u8 i = 0; i < 8; i++) { 1045 for (u8 i = 0; i < 8; i++) {
1013 if ((i + 8) == state.ch_max) { 1046 if ((i + 8) == state.ch_max) {
1014 DRAW(POLY_PAD_MAX_CH_8 + i, GREY); 1047 DRAW(POLY_PAD_MAX_CH_8 + i, WHITE);
1015 } else if (state.ch_min >= 8 && (i + 8) < state.ch_min) { 1048 } else if (state.ch_min >= 8 && (i + 8) < state.ch_min) {
1016 DRAW(POLY_PAD_MAX_CH_8 + i, YELLOW_DIM); 1049 DRAW(POLY_PAD_MAX_CH_8 + i, YELLOW_DIM);
1017 } else { 1050 } else {
@@ -1056,7 +1089,7 @@ draw_kbd(int loc, Color clr) {
1056 int idx_top = row_idx[loc]; 1089 int idx_top = row_idx[loc];
1057 int idx_bot = row_idx[loc + 1]; 1090 int idx_bot = row_idx[loc + 1];
1058 Color colors[] = { 1091 Color colors[] = {
1059 PINK, BLUE, GREEN, YELLOW, ORANGE, RED, CYAN, 1092 PINK, BLUE, GREEN, YELLOW, ORANGE, CYAN, PURPLE,
1060 }; 1093 };
1061 Color root_clr = colors[state.kbd_octave + 3 - loc / 2]; 1094 Color root_clr = colors[state.kbd_octave + 3 - loc / 2];
1062 DRAW(idx_top + 1, state.kbd_root == 1 ? WHITE : root_clr); 1095 DRAW(idx_top + 1, state.kbd_root == 1 ? WHITE : root_clr);
@@ -1077,7 +1110,11 @@ draw_kbd(int loc, Color clr) {
1077 1110
1078void 1111void
1079draw_poly_kbd(void) { 1112draw_poly_kbd(void) {
1080 DRAW(POLY_PAD_NOTE, GREY); 1113 DRAW(POLY_PAD_UP, GREY);
1114 DRAW(POLY_PAD_DOWN, GREY);
1115 DRAW(POLY_PAD_LEFT, GREY);
1116 DRAW(POLY_PAD_RIGHT, GREY);
1117 DRAW(POLY_PAD_NOTE, WHITE);
1081 draw_kbd(0, PURPLE); 1118 draw_kbd(0, PURPLE);
1082 draw_kbd(2, PURPLE); 1119 draw_kbd(2, PURPLE);
1083 draw_kbd(4, PURPLE); 1120 draw_kbd(4, PURPLE);
@@ -1086,20 +1123,26 @@ draw_poly_kbd(void) {
1086 1123
1087void 1124void
1088draw_poly_faders(void) { 1125draw_poly_faders(void) {
1089 DRAW(POLY_PAD_DEVICE, GREY); 1126 DRAW(POLY_PAD_DEVICE, WHITE);
1090 switch (state.fader_page) { 1127 for (int i = 0; i < 8; i++) {
1091 case 0: { DRAW(POLY_PAD_ROW_0 + 8, GREY); } break; 1128 Color clr = GREY;
1092 case 1: { DRAW(POLY_PAD_ROW_1 + 8, GREY); } break; 1129 if (i == state.fader_page) {
1093 case 2: { DRAW(POLY_PAD_ROW_2 + 8, GREY); } break; 1130 clr = WHITE;
1094 case 3: { DRAW(POLY_PAD_ROW_3 + 8, GREY); } break; 1131 }
1095 case 4: { DRAW(POLY_PAD_ROW_4 + 8, GREY); } break; 1132 switch (i) {
1096 case 5: { DRAW(POLY_PAD_ROW_5 + 8, GREY); } break; 1133 case 0: { DRAW(POLY_PAD_ROW_0 + 8, clr); } break;
1097 case 6: { DRAW(POLY_PAD_ROW_6 + 8, GREY); } break; 1134 case 1: { DRAW(POLY_PAD_ROW_1 + 8, clr); } break;
1098 case 7: { DRAW(POLY_PAD_ROW_7 + 8, GREY); } break; 1135 case 2: { DRAW(POLY_PAD_ROW_2 + 8, clr); } break;
1099 default: break; 1136 case 3: { DRAW(POLY_PAD_ROW_3 + 8, clr); } break;
1137 case 4: { DRAW(POLY_PAD_ROW_4 + 8, clr); } break;
1138 case 5: { DRAW(POLY_PAD_ROW_5 + 8, clr); } break;
1139 case 6: { DRAW(POLY_PAD_ROW_6 + 8, clr); } break;
1140 case 7: { DRAW(POLY_PAD_ROW_7 + 8, clr); } break;
1141 default: break;
1142 }
1100 } 1143 }
1101 Color colors[] = { 1144 Color colors[] = {
1102 PINK, BLUE, GREEN, YELLOW, ORANGE, RED, CYAN, PURPLE, 1145 PINK, BLUE, GREEN, YELLOW, ORANGE, CYAN, PURPLE, RED,
1103 }; 1146 };
1104 for (int i = 0; i < 8; i++) { 1147 for (int i = 0; i < 8; i++) {
1105 u8 val = state.faders[state.fader_page * 8 + i]; 1148 u8 val = state.faders[state.fader_page * 8 + i];
@@ -1173,7 +1216,6 @@ app_init(const u16 *adc_raw) {
1173 .kbd_sense = SENS_MED, 1216 .kbd_sense = SENS_MED,
1174 }; 1217 };
1175 } 1218 }
1176 // TODO: Send non-zero fader CCs at the start.
1177 1219
1178 // store off the raw ADC frame pointer for later use 1220 // store off the raw ADC frame pointer for later use
1179 g_ADC = adc_raw; 1221 g_ADC = adc_raw;