summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-02-09 15:51:14 +0100
committerBad Diode <bd@badd10de.dev>2023-02-09 15:51:14 +0100
commit87e681d8f1981020fe3b5dd888e3f333ede2a065 (patch)
treeadc4a23ef6dbd2a146fab0e9e870295508198d5f
parent6e331bd4b16b17cb9a5d0b38aab0099b9cd23d06 (diff)
downloadlaunchpad-polymaker-87e681d8f1981020fe3b5dd888e3f333ede2a065.tar.gz
launchpad-polymaker-87e681d8f1981020fe3b5dd888e3f333ede2a065.zip
Add channel selection for listening
-rw-r--r--src/app.c95
1 files changed, 72 insertions, 23 deletions
diff --git a/src/app.c b/src/app.c
index 466a1a3..29d114f 100644
--- a/src/app.c
+++ b/src/app.c
@@ -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
156typedef enum Mode { 172typedef enum Mode {
@@ -171,7 +187,8 @@ u16 frame = 0;
171u16 n_voices = 0; 187u16 n_voices = 0;
172u8 active = 1; 188u8 active = 1;
173u8 ch_min = 0; 189u8 ch_min = 0;
174u8 ch_max = 4; 190u8 ch_max = 7;
191u8 ch_listen[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
175Mode mode = MOD_POLY_SETUP; 192Mode mode = MOD_POLY_SETUP;
176Voice voices[16] = {0}; 193Voice voices[16] = {0};
177 194
@@ -211,6 +228,11 @@ select_ch_max(u8 target) {
211} 228}
212 229
213void 230void
231select_ch_sel(u8 target) {
232 ch_listen[target] = !ch_listen[target];
233}
234
235void
214app_surface_event(u8 type, u8 index, u8 value) { 236app_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
451void 494void
452draw_max_channel(void) { 495draw_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
520void
521draw_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