diff options
author | Bad Diode <bd@badd10de.dev> | 2023-06-29 14:29:05 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-06-29 14:29:05 +0200 |
commit | 6cd23251029da176a696560e175853ed38fe34d4 (patch) | |
tree | 47d00555f75d239623e9466ffe8f3c63b6a8f494 /src/app.c | |
parent | d3e457b9904c0ae51ce4e066c792cf04999a1165 (diff) | |
download | launchpad-polymaker-6cd23251029da176a696560e175853ed38fe34d4.tar.gz launchpad-polymaker-6cd23251029da176a696560e175853ed38fe34d4.zip |
Add CC send to left side buttons
Diffstat (limited to 'src/app.c')
-rw-r--r-- | src/app.c | 152 |
1 files changed, 97 insertions, 55 deletions
@@ -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 | ||
464 | void | 472 | void |
473 | send_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 | |||
479 | void | ||
465 | handle_faders(int index) { | 480 | handle_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 | ||
521 | void | 534 | void |
522 | app_surface_event(u8 type, u8 index, u8 value) { | 535 | app_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 | ||
941 | void | 974 | void |
@@ -969,7 +1002,7 @@ draw_poly_kbd_sens_button(void) { | |||
969 | 1002 | ||
970 | void | 1003 | void |
971 | draw_poly_main(void) { | 1004 | draw_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 | |||
980 | draw_min_channel(void) { | 1013 | draw_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 | |||
1002 | draw_max_channel(void) { | 1035 | draw_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 | ||
1078 | void | 1111 | void |
1079 | draw_poly_kbd(void) { | 1112 | draw_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 | ||
1087 | void | 1124 | void |
1088 | draw_poly_faders(void) { | 1125 | draw_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; |