diff options
author | Bad Diode <bd@badd10de.dev> | 2023-06-28 13:17:17 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-06-28 13:17:17 +0200 |
commit | 5d70f83bd9d5e8047a1dc7d00f885d586fe6196c (patch) | |
tree | a1d3d01fe474d9631c72db51e41681da400a1d9c | |
parent | 9bb91b5496b5a1bc730bdc70b3352a789c35d995 (diff) | |
download | launchpad-polymaker-5d70f83bd9d5e8047a1dc7d00f885d586fe6196c.tar.gz launchpad-polymaker-5d70f83bd9d5e8047a1dc7d00f885d586fe6196c.zip |
Allow note/main change and cleanup
-rw-r--r-- | src/app.c | 176 |
1 files changed, 99 insertions, 77 deletions
@@ -141,56 +141,64 @@ Pads row_idx[] = { | |||
141 | }; | 141 | }; |
142 | 142 | ||
143 | typedef enum Button { | 143 | typedef 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 | ||
196 | typedef enum Mode { | 204 | typedef enum Mode { |
@@ -251,6 +259,8 @@ u32 note_counter = 0; | |||
251 | u8 midi_in_connected = 0; | 259 | u8 midi_in_connected = 0; |
252 | u8 midi_out_connected = 0; | 260 | u8 midi_out_connected = 0; |
253 | u8 next_voice = 0; | 261 | u8 next_voice = 0; |
262 | static Mode prev_mode = MOD_POLY_MAIN; | ||
263 | static int save_state = 0; | ||
254 | 264 | ||
255 | // store ADC frame pointer | 265 | // store ADC frame pointer |
256 | static const u16 *g_ADC = 0; | 266 | static const u16 *g_ADC = 0; |
@@ -390,13 +400,17 @@ kbd_find_note(int index) { | |||
390 | void | 400 | void |
391 | app_surface_event(u8 type, u8 index, u8 value) { | 401 | app_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 | ||
695 | void | 715 | void |
@@ -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 | ||
702 | void | 724 | void |
@@ -728,6 +750,7 @@ draw_poly_steal_button(void) { | |||
728 | 750 | ||
729 | void | 751 | void |
730 | draw_poly_main(void) { | 752 | draw_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 | ||
843 | void | 866 | void |
867 | draw_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 | |||
875 | void | ||
844 | draw_scene(void) { | 876 | draw_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; |