diff options
author | Bad Diode <bd@badd10de.dev> | 2023-02-09 15:51:14 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-02-09 15:51:14 +0100 |
commit | 87e681d8f1981020fe3b5dd888e3f333ede2a065 (patch) | |
tree | adc4a23ef6dbd2a146fab0e9e870295508198d5f /src | |
parent | 6e331bd4b16b17cb9a5d0b38aab0099b9cd23d06 (diff) | |
download | launchpad-polymaker-87e681d8f1981020fe3b5dd888e3f333ede2a065.tar.gz launchpad-polymaker-87e681d8f1981020fe3b5dd888e3f333ede2a065.zip |
Add channel selection for listening
Diffstat (limited to 'src')
-rw-r--r-- | src/app.c | 95 |
1 files changed, 72 insertions, 23 deletions
@@ -151,6 +151,22 @@ typedef enum Button { | |||
151 | POLY_PAD_MAX_CH_D = 11 + 10 * 4 + 5, | 151 | POLY_PAD_MAX_CH_D = 11 + 10 * 4 + 5, |
152 | POLY_PAD_MAX_CH_E = 11 + 10 * 4 + 6, | 152 | POLY_PAD_MAX_CH_E = 11 + 10 * 4 + 6, |
153 | POLY_PAD_MAX_CH_F = 11 + 10 * 4 + 7, | 153 | POLY_PAD_MAX_CH_F = 11 + 10 * 4 + 7, |
154 | POLY_PAD_SEL_CH_0 = 11 + 10 * 3 + 0, | ||
155 | POLY_PAD_SEL_CH_1 = 11 + 10 * 3 + 1, | ||
156 | POLY_PAD_SEL_CH_2 = 11 + 10 * 3 + 2, | ||
157 | POLY_PAD_SEL_CH_3 = 11 + 10 * 3 + 3, | ||
158 | POLY_PAD_SEL_CH_4 = 11 + 10 * 3 + 4, | ||
159 | POLY_PAD_SEL_CH_5 = 11 + 10 * 3 + 5, | ||
160 | POLY_PAD_SEL_CH_6 = 11 + 10 * 3 + 6, | ||
161 | POLY_PAD_SEL_CH_7 = 11 + 10 * 3 + 7, | ||
162 | POLY_PAD_SEL_CH_8 = 11 + 10 * 2 + 0, | ||
163 | POLY_PAD_SEL_CH_9 = 11 + 10 * 2 + 1, | ||
164 | POLY_PAD_SEL_CH_A = 11 + 10 * 2 + 2, | ||
165 | POLY_PAD_SEL_CH_B = 11 + 10 * 2 + 3, | ||
166 | POLY_PAD_SEL_CH_C = 11 + 10 * 2 + 4, | ||
167 | POLY_PAD_SEL_CH_D = 11 + 10 * 2 + 5, | ||
168 | POLY_PAD_SEL_CH_E = 11 + 10 * 2 + 6, | ||
169 | POLY_PAD_SEL_CH_F = 11 + 10 * 2 + 7, | ||
154 | } Button; | 170 | } Button; |
155 | 171 | ||
156 | typedef enum Mode { | 172 | typedef enum Mode { |
@@ -171,7 +187,8 @@ u16 frame = 0; | |||
171 | u16 n_voices = 0; | 187 | u16 n_voices = 0; |
172 | u8 active = 1; | 188 | u8 active = 1; |
173 | u8 ch_min = 0; | 189 | u8 ch_min = 0; |
174 | u8 ch_max = 4; | 190 | u8 ch_max = 7; |
191 | u8 ch_listen[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; | ||
175 | Mode mode = MOD_POLY_SETUP; | 192 | Mode mode = MOD_POLY_SETUP; |
176 | Voice voices[16] = {0}; | 193 | Voice voices[16] = {0}; |
177 | 194 | ||
@@ -211,6 +228,11 @@ select_ch_max(u8 target) { | |||
211 | } | 228 | } |
212 | 229 | ||
213 | void | 230 | void |
231 | select_ch_sel(u8 target) { | ||
232 | ch_listen[target] = !ch_listen[target]; | ||
233 | } | ||
234 | |||
235 | void | ||
214 | app_surface_event(u8 type, u8 index, u8 value) { | 236 | app_surface_event(u8 type, u8 index, u8 value) { |
215 | switch (type) { | 237 | switch (type) { |
216 | case TYPEPAD: { | 238 | case TYPEPAD: { |
@@ -257,7 +279,23 @@ app_surface_event(u8 type, u8 index, u8 value) { | |||
257 | case POLY_PAD_MAX_CH_D: { select_ch_max(13); } break; | 279 | case POLY_PAD_MAX_CH_D: { select_ch_max(13); } break; |
258 | case POLY_PAD_MAX_CH_E: { select_ch_max(14); } break; | 280 | case POLY_PAD_MAX_CH_E: { select_ch_max(14); } break; |
259 | case POLY_PAD_MAX_CH_F: { select_ch_max(15); } break; | 281 | case POLY_PAD_MAX_CH_F: { select_ch_max(15); } break; |
260 | // TODO: Handle listen channel selection. | 282 | // Handle listen channel selection. |
283 | case POLY_PAD_SEL_CH_0: { select_ch_sel(0); } break; | ||
284 | case POLY_PAD_SEL_CH_1: { select_ch_sel(1); } break; | ||
285 | case POLY_PAD_SEL_CH_2: { select_ch_sel(2); } break; | ||
286 | case POLY_PAD_SEL_CH_3: { select_ch_sel(3); } break; | ||
287 | case POLY_PAD_SEL_CH_4: { select_ch_sel(4); } break; | ||
288 | case POLY_PAD_SEL_CH_5: { select_ch_sel(5); } break; | ||
289 | case POLY_PAD_SEL_CH_6: { select_ch_sel(6); } break; | ||
290 | case POLY_PAD_SEL_CH_7: { select_ch_sel(7); } break; | ||
291 | case POLY_PAD_SEL_CH_8: { select_ch_sel(8); } break; | ||
292 | case POLY_PAD_SEL_CH_9: { select_ch_sel(9); } break; | ||
293 | case POLY_PAD_SEL_CH_A: { select_ch_sel(10); } break; | ||
294 | case POLY_PAD_SEL_CH_B: { select_ch_sel(11); } break; | ||
295 | case POLY_PAD_SEL_CH_C: { select_ch_sel(12); } break; | ||
296 | case POLY_PAD_SEL_CH_D: { select_ch_sel(13); } break; | ||
297 | case POLY_PAD_SEL_CH_E: { select_ch_sel(14); } break; | ||
298 | case POLY_PAD_SEL_CH_F: { select_ch_sel(15); } break; | ||
261 | // Handle active toggle. | 299 | // Handle active toggle. |
262 | case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; | 300 | case POLY_PAD_ACTIVE: { poly_active_toggle(); } break; |
263 | default: break; | 301 | default: break; |
@@ -295,6 +333,11 @@ app_midi_event(u8 port, u8 status, u8 d1, u8 d2) { | |||
295 | return; | 333 | return; |
296 | } | 334 | } |
297 | u8 channel = status & 0x0F; | 335 | u8 channel = status & 0x0F; |
336 | // If the channel isn't set to listen, just passthrough the message. | ||
337 | if (!ch_listen[channel]) { | ||
338 | hal_send_midi(port, status, d1, d2); | ||
339 | return; | ||
340 | } | ||
298 | if ((status & 0xF0) == NOTEON) { | 341 | if ((status & 0xF0) == NOTEON) { |
299 | if (n_voices == (ch_max - ch_min + 1)) { | 342 | if (n_voices == (ch_max - ch_min + 1)) { |
300 | return; | 343 | return; |
@@ -430,10 +473,10 @@ draw_min_channel(void) { | |||
430 | continue; | 473 | continue; |
431 | } | 474 | } |
432 | if (ch_max < 8 && i > ch_max) { | 475 | if (ch_max < 8 && i > ch_max) { |
433 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, 0, 0, 5); | 476 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, 5, 0, 0); |
434 | continue; | 477 | continue; |
435 | } | 478 | } |
436 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, 0, 0, MAXLED / 2); | 479 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_0 + i, MAXLED / 2, 0, 0); |
437 | } | 480 | } |
438 | for (u8 i = 0; i < 8; i++) { | 481 | for (u8 i = 0; i < 8; i++) { |
439 | if ((i + 8) == ch_min) { | 482 | if ((i + 8) == ch_min) { |
@@ -441,37 +484,25 @@ draw_min_channel(void) { | |||
441 | continue; | 484 | continue; |
442 | } | 485 | } |
443 | if (ch_max < 16 && (i + 8) > ch_max) { | 486 | if (ch_max < 16 && (i + 8) > ch_max) { |
444 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, 0, 0, 5); | 487 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, 5, 0, 0); |
445 | continue; | 488 | continue; |
446 | } | 489 | } |
447 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, 0, 0, MAXLED / 2); | 490 | hal_plot_led(TYPEPAD, POLY_PAD_MIN_CH_8 + i, MAXLED / 2, 0, 0); |
448 | } | 491 | } |
449 | } | 492 | } |
450 | 493 | ||
451 | void | 494 | void |
452 | draw_max_channel(void) { | 495 | draw_max_channel(void) { |
453 | // for (u8 i = 0; i < 8; i++) { | ||
454 | // u8 color = 5; | ||
455 | // if (i == ch_max) { | ||
456 | // color = MAXLED; | ||
457 | // } | ||
458 | // hal_plot_led(TYPEPAD, 11 + 10 * 5 + i, color, 10, 10); | ||
459 | // color = 5; | ||
460 | // if (i + 8 == ch_max) { | ||
461 | // color = MAXLED; | ||
462 | // } | ||
463 | // hal_plot_led(TYPEPAD, 11 + 10 * 4 + i, color, 10, 10); | ||
464 | // } | ||
465 | for (u8 i = 0; i < 8; i++) { | 496 | for (u8 i = 0; i < 8; i++) { |
466 | if (i == ch_max) { | 497 | if (i == ch_max) { |
467 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, MAXLED, MAXLED, MAXLED); | 498 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, MAXLED, MAXLED, MAXLED); |
468 | continue; | 499 | continue; |
469 | } | 500 | } |
470 | if (i < ch_min) { | 501 | if (i < ch_min) { |
471 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, 5, 0, 0); | 502 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, 5, 5, 0); |
472 | continue; | 503 | continue; |
473 | } | 504 | } |
474 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, MAXLED / 2, 0, 0); | 505 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_0 + i, MAXLED / 2, MAXLED / 2, 0); |
475 | } | 506 | } |
476 | for (u8 i = 0; i < 8; i++) { | 507 | for (u8 i = 0; i < 8; i++) { |
477 | if ((i + 8) == ch_max) { | 508 | if ((i + 8) == ch_max) { |
@@ -479,10 +510,28 @@ draw_max_channel(void) { | |||
479 | continue; | 510 | continue; |
480 | } | 511 | } |
481 | if (ch_min >= 8 && (i + 8) < ch_min) { | 512 | if (ch_min >= 8 && (i + 8) < ch_min) { |
482 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, 5, 0, 0); | 513 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, 5, 5, 0); |
483 | continue; | 514 | continue; |
484 | } | 515 | } |
485 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, MAXLED / 2, 0, 0); | 516 | hal_plot_led(TYPEPAD, POLY_PAD_MAX_CH_8 + i, MAXLED / 2, MAXLED / 2, 0); |
517 | } | ||
518 | } | ||
519 | |||
520 | void | ||
521 | draw_sel_channel(void) { | ||
522 | for (u8 i = 0; i < 8; i++) { | ||
523 | if (ch_listen[i]) { | ||
524 | hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_0 + i, 20, 0, 40); | ||
525 | } else { | ||
526 | hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_0 + i, 2, 0, 5); | ||
527 | } | ||
528 | } | ||
529 | for (u8 i = 0; i < 8; i++) { | ||
530 | if (ch_listen[i + 8]) { | ||
531 | hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_8 + i, 20, 0, 40); | ||
532 | } else { | ||
533 | hal_plot_led(TYPEPAD, POLY_PAD_SEL_CH_8 + i, 2, 0, 5); | ||
534 | } | ||
486 | } | 535 | } |
487 | } | 536 | } |
488 | 537 | ||
@@ -491,7 +540,7 @@ draw_poly_setup(void) { | |||
491 | // TODO: ... | 540 | // TODO: ... |
492 | draw_min_channel(); | 541 | draw_min_channel(); |
493 | draw_max_channel(); | 542 | draw_max_channel(); |
494 | // draw_listen_channel(); | 543 | draw_sel_channel(); |
495 | draw_poly_active_button(); | 544 | draw_poly_active_button(); |
496 | } | 545 | } |
497 | 546 | ||