summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-06-28 13:17:17 +0200
committerBad Diode <bd@badd10de.dev>2023-06-28 13:17:17 +0200
commit5d70f83bd9d5e8047a1dc7d00f885d586fe6196c (patch)
treea1d3d01fe474d9631c72db51e41681da400a1d9c
parent9bb91b5496b5a1bc730bdc70b3352a789c35d995 (diff)
downloadlaunchpad-polymaker-5d70f83bd9d5e8047a1dc7d00f885d586fe6196c.tar.gz
launchpad-polymaker-5d70f83bd9d5e8047a1dc7d00f885d586fe6196c.zip
Allow note/main change and cleanup
-rw-r--r--src/app.c176
1 files changed, 99 insertions, 77 deletions
diff --git a/src/app.c b/src/app.c
index a5c187a..b1009da 100644
--- a/src/app.c
+++ b/src/app.c
@@ -141,56 +141,64 @@ Pads row_idx[] = {
141}; 141};
142 142
143typedef enum Button { 143typedef enum Button {
144 POLY_PAD_ACTIVE = 11, 144 POLY_PAD_UP = POLY_TOP_ROW + 0,
145 POLY_PAD_STEAL = 11 + 7, 145 POLY_PAD_DOWN = POLY_TOP_ROW + 1,
146 POLY_PAD_MIN_CH_0 = 11 + 10 * 7 + 0, 146 POLY_PAD_LEFT = POLY_TOP_ROW + 2,
147 POLY_PAD_MIN_CH_1 = 11 + 10 * 7 + 1, 147 POLY_PAD_RIGHT = POLY_TOP_ROW + 3,
148 POLY_PAD_MIN_CH_2 = 11 + 10 * 7 + 2, 148 POLY_PAD_SESSION = POLY_TOP_ROW + 4,
149 POLY_PAD_MIN_CH_3 = 11 + 10 * 7 + 3, 149 POLY_PAD_NOTE = POLY_TOP_ROW + 5,
150 POLY_PAD_MIN_CH_4 = 11 + 10 * 7 + 4, 150 POLY_PAD_DEVICE = POLY_TOP_ROW + 6,
151 POLY_PAD_MIN_CH_5 = 11 + 10 * 7 + 5, 151 POLY_PAD_USER = POLY_TOP_ROW + 7,
152 POLY_PAD_MIN_CH_6 = 11 + 10 * 7 + 6, 152 POLY_PAD_ACTIVE = 11,
153 POLY_PAD_MIN_CH_7 = 11 + 10 * 7 + 7, 153 POLY_PAD_STEAL = 11 + 7,
154 POLY_PAD_MIN_CH_8 = 11 + 10 * 6 + 0, 154 POLY_PAD_MIN_CH_0 = POLY_PAD_ROW_0 + 0,
155 POLY_PAD_MIN_CH_9 = 11 + 10 * 6 + 1, 155 POLY_PAD_MIN_CH_1 = POLY_PAD_ROW_0 + 1,
156 POLY_PAD_MIN_CH_A = 11 + 10 * 6 + 2, 156 POLY_PAD_MIN_CH_2 = POLY_PAD_ROW_0 + 2,
157 POLY_PAD_MIN_CH_B = 11 + 10 * 6 + 3, 157 POLY_PAD_MIN_CH_3 = POLY_PAD_ROW_0 + 3,
158 POLY_PAD_MIN_CH_C = 11 + 10 * 6 + 4, 158 POLY_PAD_MIN_CH_4 = POLY_PAD_ROW_0 + 4,
159 POLY_PAD_MIN_CH_D = 11 + 10 * 6 + 5, 159 POLY_PAD_MIN_CH_5 = POLY_PAD_ROW_0 + 5,
160 POLY_PAD_MIN_CH_E = 11 + 10 * 6 + 6, 160 POLY_PAD_MIN_CH_6 = POLY_PAD_ROW_0 + 6,
161 POLY_PAD_MIN_CH_F = 11 + 10 * 6 + 7, 161 POLY_PAD_MIN_CH_7 = POLY_PAD_ROW_0 + 7,
162 POLY_PAD_MAX_CH_0 = 11 + 10 * 5 + 0, 162 POLY_PAD_MIN_CH_8 = POLY_PAD_ROW_1 + 0,
163 POLY_PAD_MAX_CH_1 = 11 + 10 * 5 + 1, 163 POLY_PAD_MIN_CH_9 = POLY_PAD_ROW_1 + 1,
164 POLY_PAD_MAX_CH_2 = 11 + 10 * 5 + 2, 164 POLY_PAD_MIN_CH_A = POLY_PAD_ROW_1 + 2,
165 POLY_PAD_MAX_CH_3 = 11 + 10 * 5 + 3, 165 POLY_PAD_MIN_CH_B = POLY_PAD_ROW_1 + 3,
166 POLY_PAD_MAX_CH_4 = 11 + 10 * 5 + 4, 166 POLY_PAD_MIN_CH_C = POLY_PAD_ROW_1 + 4,
167 POLY_PAD_MAX_CH_5 = 11 + 10 * 5 + 5, 167 POLY_PAD_MIN_CH_D = POLY_PAD_ROW_1 + 5,
168 POLY_PAD_MAX_CH_6 = 11 + 10 * 5 + 6, 168 POLY_PAD_MIN_CH_E = POLY_PAD_ROW_1 + 6,
169 POLY_PAD_MAX_CH_7 = 11 + 10 * 5 + 7, 169 POLY_PAD_MIN_CH_F = POLY_PAD_ROW_1 + 7,
170 POLY_PAD_MAX_CH_8 = 11 + 10 * 4 + 0, 170 POLY_PAD_MAX_CH_0 = POLY_PAD_ROW_2 + 0,
171 POLY_PAD_MAX_CH_9 = 11 + 10 * 4 + 1, 171 POLY_PAD_MAX_CH_1 = POLY_PAD_ROW_2 + 1,
172 POLY_PAD_MAX_CH_A = 11 + 10 * 4 + 2, 172 POLY_PAD_MAX_CH_2 = POLY_PAD_ROW_2 + 2,
173 POLY_PAD_MAX_CH_B = 11 + 10 * 4 + 3, 173 POLY_PAD_MAX_CH_3 = POLY_PAD_ROW_2 + 3,
174 POLY_PAD_MAX_CH_C = 11 + 10 * 4 + 4, 174 POLY_PAD_MAX_CH_4 = POLY_PAD_ROW_2 + 4,
175 POLY_PAD_MAX_CH_D = 11 + 10 * 4 + 5, 175 POLY_PAD_MAX_CH_5 = POLY_PAD_ROW_2 + 5,
176 POLY_PAD_MAX_CH_E = 11 + 10 * 4 + 6, 176 POLY_PAD_MAX_CH_6 = POLY_PAD_ROW_2 + 6,
177 POLY_PAD_MAX_CH_F = 11 + 10 * 4 + 7, 177 POLY_PAD_MAX_CH_7 = POLY_PAD_ROW_2 + 7,
178 POLY_PAD_SEL_CH_0 = 11 + 10 * 3 + 0, 178 POLY_PAD_MAX_CH_8 = POLY_PAD_ROW_3 + 0,
179 POLY_PAD_SEL_CH_1 = 11 + 10 * 3 + 1, 179 POLY_PAD_MAX_CH_9 = POLY_PAD_ROW_3 + 1,
180 POLY_PAD_SEL_CH_2 = 11 + 10 * 3 + 2, 180 POLY_PAD_MAX_CH_A = POLY_PAD_ROW_3 + 2,
181 POLY_PAD_SEL_CH_3 = 11 + 10 * 3 + 3, 181 POLY_PAD_MAX_CH_B = POLY_PAD_ROW_3 + 3,
182 POLY_PAD_SEL_CH_4 = 11 + 10 * 3 + 4, 182 POLY_PAD_MAX_CH_C = POLY_PAD_ROW_3 + 4,
183 POLY_PAD_SEL_CH_5 = 11 + 10 * 3 + 5, 183 POLY_PAD_MAX_CH_D = POLY_PAD_ROW_3 + 5,
184 POLY_PAD_SEL_CH_6 = 11 + 10 * 3 + 6, 184 POLY_PAD_MAX_CH_E = POLY_PAD_ROW_3 + 6,
185 POLY_PAD_SEL_CH_7 = 11 + 10 * 3 + 7, 185 POLY_PAD_MAX_CH_F = POLY_PAD_ROW_3 + 7,
186 POLY_PAD_SEL_CH_8 = 11 + 10 * 2 + 0, 186 POLY_PAD_SEL_CH_0 = POLY_PAD_ROW_4 + 0,
187 POLY_PAD_SEL_CH_9 = 11 + 10 * 2 + 1, 187 POLY_PAD_SEL_CH_1 = POLY_PAD_ROW_4 + 1,
188 POLY_PAD_SEL_CH_A = 11 + 10 * 2 + 2, 188 POLY_PAD_SEL_CH_2 = POLY_PAD_ROW_4 + 2,
189 POLY_PAD_SEL_CH_B = 11 + 10 * 2 + 3, 189 POLY_PAD_SEL_CH_3 = POLY_PAD_ROW_4 + 3,
190 POLY_PAD_SEL_CH_C = 11 + 10 * 2 + 4, 190 POLY_PAD_SEL_CH_4 = POLY_PAD_ROW_4 + 4,
191 POLY_PAD_SEL_CH_D = 11 + 10 * 2 + 5, 191 POLY_PAD_SEL_CH_5 = POLY_PAD_ROW_4 + 5,
192 POLY_PAD_SEL_CH_E = 11 + 10 * 2 + 6, 192 POLY_PAD_SEL_CH_6 = POLY_PAD_ROW_4 + 6,
193 POLY_PAD_SEL_CH_F = 11 + 10 * 2 + 7, 193 POLY_PAD_SEL_CH_7 = POLY_PAD_ROW_4 + 7,
194 POLY_PAD_SEL_CH_8 = POLY_PAD_ROW_5 + 0,
195 POLY_PAD_SEL_CH_9 = POLY_PAD_ROW_5 + 1,
196 POLY_PAD_SEL_CH_A = POLY_PAD_ROW_5 + 2,
197 POLY_PAD_SEL_CH_B = POLY_PAD_ROW_5 + 3,
198 POLY_PAD_SEL_CH_C = POLY_PAD_ROW_5 + 4,
199 POLY_PAD_SEL_CH_D = POLY_PAD_ROW_5 + 5,
200 POLY_PAD_SEL_CH_E = POLY_PAD_ROW_5 + 6,
201 POLY_PAD_SEL_CH_F = POLY_PAD_ROW_5 + 7,
194} Button; 202} Button;
195 203
196typedef enum Mode { 204typedef enum Mode {
@@ -251,6 +259,8 @@ u32 note_counter = 0;
251u8 midi_in_connected = 0; 259u8 midi_in_connected = 0;
252u8 midi_out_connected = 0; 260u8 midi_out_connected = 0;
253u8 next_voice = 0; 261u8 next_voice = 0;
262static Mode prev_mode = MOD_POLY_MAIN;
263static int save_state = 0;
254 264
255// store ADC frame pointer 265// store ADC frame pointer
256static const u16 *g_ADC = 0; 266static const u16 *g_ADC = 0;
@@ -390,13 +400,17 @@ kbd_find_note(int index) {
390void 400void
391app_surface_event(u8 type, u8 index, u8 value) { 401app_surface_event(u8 type, u8 index, u8 value) {
392 switch (type) { 402 switch (type) {
393 case TYPEPAD: { 403 case TYPEPAD: {
394 switch (state.mode) { 404 switch (state.mode) {
395 case MOD_POLY_MAIN: { 405 case MOD_POLY_MAIN: {
396 if (value) { 406 if (value) {
397 switch (index) { 407 switch (index) {
398 case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; 408 case POLY_PAD_ACTIVE: { poly_active_toggle(); } break;
399 case POLY_PAD_STEAL: { poly_steal_cycle(); } break; 409 case POLY_PAD_STEAL: { poly_steal_cycle(); } break;
410 case POLY_PAD_NOTE: {
411 state.mode = MOD_POLY_KBD;
412 save_state = 1;
413 } break;
400 default: break; 414 default: break;
401 } 415 }
402 } 416 }
@@ -463,20 +477,21 @@ app_surface_event(u8 type, u8 index, u8 value) {
463 } 477 }
464 } break; 478 } break;
465 case MOD_POLY_KBD: { 479 case MOD_POLY_KBD: {
466 // Transposition.
467 if (index >= POLY_TOP_ROW && index <= (POLY_TOP_ROW + 7)) { 480 if (index >= POLY_TOP_ROW && index <= (POLY_TOP_ROW + 7)) {
468 switch (index - POLY_TOP_ROW) { 481 switch (index) {
469 case 0: { 482 // Transposition.
470 if (state.kbd_octave < 3) { 483 case POLY_PAD_UP: {
471 state.kbd_octave++; 484 if (state.kbd_octave < 3) { state.kbd_octave++; }
472 }
473 } break; 485 } break;
474 case 1: { 486 case POLY_PAD_DOWN: {
475 if (state.kbd_octave > 0) { 487 if (state.kbd_octave > 0) { state.kbd_octave--; }
476 state.kbd_octave--;
477 }
478 } break; 488 } break;
479 default: {} break; 489 // Different sections.
490 case POLY_PAD_SESSION: {
491 state.mode = MOD_POLY_MAIN;
492 save_state = 1;
493 }
494 default: break;
480 } 495 }
481 return; 496 return;
482 } 497 }
@@ -508,11 +523,12 @@ app_surface_event(u8 type, u8 index, u8 value) {
508 switch (state.mode) { 523 switch (state.mode) {
509 case MOD_POLY_KBD: 524 case MOD_POLY_KBD:
510 case MOD_POLY_MAIN: { 525 case MOD_POLY_MAIN: {
526 prev_mode = state.mode;
511 state.mode = MOD_POLY_SETUP; 527 state.mode = MOD_POLY_SETUP;
512 } break; 528 } break;
513 case MOD_POLY_SETUP: { 529 case MOD_POLY_SETUP: {
514 state.mode = MOD_POLY_KBD; 530 state.mode = prev_mode;
515 hal_write_flash(0, (u8*)&state, sizeof(State)); 531 save_state = 1;
516 } break; 532 } break;
517 } 533 }
518 } 534 }
@@ -690,6 +706,10 @@ update(void) {
690 // } 706 // }
691 // } 707 // }
692 // n_voices = 0; 708 // n_voices = 0;
709 if (save_state) {
710 hal_write_flash(0, (u8*)&state, sizeof(State));
711 save_state = 0;
712 }
693} 713}
694 714
695void 715void
@@ -697,6 +717,8 @@ clear_pads(void) {
697 for (int i = 0; i < PAD_COUNT; ++i) { 717 for (int i = 0; i < PAD_COUNT; ++i) {
698 hal_plot_led(TYPEPAD, ADC_MAP[i], 0, 0, 0); 718 hal_plot_led(TYPEPAD, ADC_MAP[i], 0, 0, 0);
699 } 719 }
720 hal_plot_led(TYPEPAD, POLY_PAD_SESSION, 0, 0, 0);
721 hal_plot_led(TYPEPAD, POLY_PAD_NOTE, 0, 0, 0);
700} 722}
701 723
702void 724void
@@ -728,6 +750,7 @@ draw_poly_steal_button(void) {
728 750
729void 751void
730draw_poly_main(void) { 752draw_poly_main(void) {
753 hal_plot_led(TYPEPAD, POLY_PAD_SESSION, MAXLED / 2, MAXLED / 2, MAXLED / 2);
731 print_number((n_voices / 10) % 10, MAXLED, MAXLED, MAXLED, 0, 0); 754 print_number((n_voices / 10) % 10, MAXLED, MAXLED, MAXLED, 0, 0);
732 print_number( n_voices % 10, MAXLED, MAXLED, MAXLED, 4, 0); 755 print_number( n_voices % 10, MAXLED, MAXLED, MAXLED, 4, 0);
733 draw_poly_active_button(); 756 draw_poly_active_button();
@@ -841,20 +864,20 @@ draw_kbd(int loc, Color clr) {
841} 864}
842 865
843void 866void
867draw_poly_kbd(void) {
868 hal_plot_led(TYPEPAD, POLY_PAD_NOTE, MAXLED / 2, MAXLED / 2, MAXLED / 2);
869 draw_kbd(0, colors[0]);
870 draw_kbd(2, colors[1]);
871 draw_kbd(4, colors[2]);
872 draw_kbd(6, colors[3]);
873}
874
875void
844draw_scene(void) { 876draw_scene(void) {
845 switch (state.mode) { 877 switch (state.mode) {
846 case MOD_POLY_MAIN: { 878 case MOD_POLY_MAIN: { draw_poly_main(); } break;
847 draw_poly_main(); 879 case MOD_POLY_SETUP: { draw_poly_setup(); } break;
848 } break; 880 case MOD_POLY_KBD: { draw_poly_kbd(); } break;
849 case MOD_POLY_SETUP: {
850 draw_poly_setup();
851 } break;
852 case MOD_POLY_KBD: {
853 draw_kbd(0, colors[0]);
854 draw_kbd(2, colors[1]);
855 draw_kbd(4, colors[2]);
856 draw_kbd(6, colors[3]);
857 } break;
858 } 881 }
859} 882}
860 883
@@ -889,7 +912,6 @@ app_init(const u16 *adc_raw) {
889 .kbd_octave = 0, 912 .kbd_octave = 0,
890 }; 913 };
891 } 914 }
892 state.mode = MOD_POLY_KBD; // DEBUG:
893 915
894 // store off the raw ADC frame pointer for later use 916 // store off the raw ADC frame pointer for later use
895 g_ADC = adc_raw; 917 g_ADC = adc_raw;