aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-23 17:42:55 +0200
committerBad Diode <bd@badd10de.dev>2023-04-23 17:42:55 +0200
commitef6af29d99f7df6acf088ee28dc026023258c10c (patch)
tree807ad8d85305db695e9801d85d4c3f3c323cc8fb
parenta4092c4a6b1ad1589552c06b29a72d868ef778f1 (diff)
downloadstepper-ef6af29d99f7df6acf088ee28dc026023258c10c.tar.gz
stepper-ef6af29d99f7df6acf088ee28dc026023258c10c.zip
Remove drawing functions from input handlers
-rw-r--r--src/sequencer.c155
1 files changed, 47 insertions, 108 deletions
diff --git a/src/sequencer.c b/src/sequencer.c
index fd47d0b..b689bf5 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -9,11 +9,20 @@
9 9
10void set_time(int bpm); 10void set_time(int bpm);
11 11
12bool redraw_pattern_buttons = false;
13bool redraw_play_pause = false;
14bool redraw_trigs = false;
15bool redraw_channels = false;
16bool redraw_bank_buttons = false;
17bool redraw_params = false;
18bool redraw_bpm = false;
19bool redraw_piano_note = false;
20
12void 21void
13irq_timer(void) { 22irq_timer(void) {
14 if (current_pattern != next_pattern && step_counter == 0) { 23 if (current_pattern != next_pattern && step_counter == 0) {
15 current_pattern = next_pattern; 24 current_pattern = next_pattern;
16 draw_pattern_buttons(); 25 redraw_pattern_buttons = true;
17 } 26 }
18 Pattern *pat = &patterns[current_pattern]; 27 Pattern *pat = &patterns[current_pattern];
19 set_time(pat->bpm); 28 set_time(pat->bpm);
@@ -135,9 +144,7 @@ irq_timer(void) {
135 SOUND_NOISE_CTRL = 0; 144 SOUND_NOISE_CTRL = 0;
136 SOUND_NOISE_FREQ = 0; 145 SOUND_NOISE_FREQ = 0;
137 } 146 }
138 draw_current_step(COL_BG);
139 step_counter = (step_counter + 1) % 16; 147 step_counter = (step_counter + 1) % 16;
140 draw_current_step(COL_RED);
141} 148}
142 149
143void 150void
@@ -230,25 +237,18 @@ handle_channel_selection(void) {
230void 237void
231stop_playing(void) { 238stop_playing(void) {
232 play_status = 0; 239 play_status = 0;
233 if (step_counter != 0) {
234 draw_current_step(COL_BG);
235 }
236 step_counter = 0; 240 step_counter = 0;
237 TIMER_CTRL_0 = 0; 241 TIMER_CTRL_0 = 0;
238 SOUND_SQUARE1_CTRL = 0; 242 SOUND_SQUARE1_CTRL = 0;
239 SOUND_SQUARE2_CTRL = 0; 243 SOUND_SQUARE2_CTRL = 0;
240 SOUND_WAVE_CTRL = 0; 244 SOUND_WAVE_CTRL = 0;
241 SOUND_NOISE_CTRL = 0; 245 SOUND_NOISE_CTRL = 0;
242 draw_current_step(COL_RED); 246 redraw_play_pause = true;
243 draw_play();
244} 247}
245 248
246void 249void
247toggle_playing(void) { 250toggle_playing(void) {
248 play_status ^= 1; 251 play_status ^= 1;
249 if (step_counter != 0) {
250 draw_current_step(COL_BG);
251 }
252 step_counter = 0; 252 step_counter = 0;
253 if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) == 0) { 253 if ((TIMER_CTRL_0 & TIMER_CTRL_ENABLE) == 0) {
254 set_time(patterns[current_pattern].bpm); 254 set_time(patterns[current_pattern].bpm);
@@ -259,8 +259,7 @@ toggle_playing(void) {
259 SOUND_WAVE_CTRL = 0; 259 SOUND_WAVE_CTRL = 0;
260 SOUND_NOISE_CTRL = 0; 260 SOUND_NOISE_CTRL = 0;
261 } 261 }
262 draw_current_step(COL_RED); 262 redraw_play_pause = true;
263 draw_play();
264} 263}
265 264
266void 265void
@@ -275,7 +274,7 @@ pause_playing(void) {
275 SOUND_WAVE_CTRL = 0; 274 SOUND_WAVE_CTRL = 0;
276 SOUND_NOISE_CTRL = 0; 275 SOUND_NOISE_CTRL = 0;
277 } 276 }
278 draw_play(); 277 redraw_play_pause = true;
279} 278}
280 279
281void 280void
@@ -290,10 +289,10 @@ select_bank(int i) {
290 load_bank(i); 289 load_bank(i);
291 } 290 }
292 current_bank = i; 291 current_bank = i;
293 draw_pattern_buttons(); 292 redraw_pattern_buttons = true;
294 draw_triggers(); 293 redraw_trigs = true;
295 draw_channels(); 294 redraw_channels = true;
296 draw_bank_buttons(); 295 redraw_bank_buttons = true;
297} 296}
298 297
299void 298void
@@ -309,22 +308,14 @@ handle_right_col_selection(void) {
309 trig_selection_loc = 7; 308 trig_selection_loc = 7;
310 } break; 309 } break;
311 } 310 }
312 draw_right_col_cursor(COL_BG); 311 redraw_params = true;
313 draw_trig_cursor(trig_selection_loc, COL_CURSOR);
314 TriggerNote *trig = get_current_trig();
315 draw_note(trig->note, COL_NOTE_PRESSED);
316 draw_parameters();
317 } else if (key_tap(KEY_UP)) { 312 } else if (key_tap(KEY_UP)) {
318 if (right_col_selection_loc < R_COL_BANK_A) { 313 if (right_col_selection_loc < R_COL_BANK_A) {
319 draw_right_col_cursor(COL_BG);
320 right_col_selection_loc++; 314 right_col_selection_loc++;
321 draw_right_col_cursor(COL_CURSOR);
322 } 315 }
323 } else if (key_tap(KEY_DOWN)) { 316 } else if (key_tap(KEY_DOWN)) {
324 if (right_col_selection_loc > R_COL_BPM) { 317 if (right_col_selection_loc > R_COL_BPM) {
325 draw_right_col_cursor(COL_BG);
326 right_col_selection_loc--; 318 right_col_selection_loc--;
327 draw_right_col_cursor(COL_CURSOR);
328 } 319 }
329 } else if (key_tap(KEY_L)) { 320 } else if (key_tap(KEY_L)) {
330 switch (right_col_selection_loc) { 321 switch (right_col_selection_loc) {
@@ -335,7 +326,7 @@ handle_right_col_selection(void) {
335 && current_pattern == pattern_selection_loc) { 326 && current_pattern == pattern_selection_loc) {
336 set_time(patterns[current_pattern].bpm); 327 set_time(patterns[current_pattern].bpm);
337 } 328 }
338 draw_bpm(); 329 redraw_bpm = true;
339 } 330 }
340 } break; 331 } break;
341 } 332 }
@@ -348,7 +339,7 @@ handle_right_col_selection(void) {
348 && current_pattern == pattern_selection_loc) { 339 && current_pattern == pattern_selection_loc) {
349 set_time(patterns[current_pattern].bpm); 340 set_time(patterns[current_pattern].bpm);
350 } 341 }
351 draw_bpm(); 342 redraw_bpm = true;
352 } 343 }
353 } break; 344 } break;
354 } 345 }
@@ -380,29 +371,24 @@ void
380handle_pattern_selection(void) { 371handle_pattern_selection(void) {
381 if (key_tap(KEY_B)) { 372 if (key_tap(KEY_B)) {
382 next_pattern = pattern_selection_loc; 373 next_pattern = pattern_selection_loc;
383 draw_pattern_buttons(); 374 redraw_pattern_buttons = true;
384 } 375 }
385 if (key_tap(KEY_RIGHT)) { 376 if (key_tap(KEY_RIGHT)) {
386 input_handler = handle_channel_selection; 377 input_handler = handle_channel_selection;
387 draw_channel_cursor(channel_selection_loc, COL_CURSOR);
388 draw_pattern_cursor(pattern_selection_loc, COL_GREY);
389 } else if (key_tap(KEY_UP)) { 378 } else if (key_tap(KEY_UP)) {
390 if (pattern_selection_loc > 0) { 379 if (pattern_selection_loc > 0) {
391 draw_pattern_cursor(pattern_selection_loc, COL_BG);
392 pattern_selection_loc = pattern_selection_loc - 1; 380 pattern_selection_loc = pattern_selection_loc - 1;
393 draw_pattern_cursor(pattern_selection_loc, COL_CURSOR); 381 redraw_channels = true;
394 draw_channels(); 382 redraw_trigs = true;
395 draw_triggers(); 383 redraw_bpm = true;
396 draw_bpm();
397 } 384 }
398 } else if (key_tap(KEY_DOWN)) { 385 } else if (key_tap(KEY_DOWN)) {
399 if (pattern_selection_loc < 7) { 386 if (pattern_selection_loc < 7) {
400 draw_pattern_cursor(pattern_selection_loc, COL_BG); 387 draw_pattern_cursor(pattern_selection_loc, COL_BG);
401 pattern_selection_loc = pattern_selection_loc + 1; 388 pattern_selection_loc = pattern_selection_loc + 1;
402 draw_pattern_cursor(pattern_selection_loc, COL_CURSOR); 389 redraw_channels = true;
403 draw_channels(); 390 redraw_trigs = true;
404 draw_triggers(); 391 redraw_bpm = true;
405 draw_bpm();
406 } 392 }
407 } 393 }
408} 394}
@@ -411,9 +397,7 @@ void
411handle_param_selection_sq1(void) { 397handle_param_selection_sq1(void) {
412 // Go back to trigger selection. 398 // Go back to trigger selection.
413 if (key_released(KEY_A)) { 399 if (key_released(KEY_A)) {
414 draw_params_cursor(param_selection_loc, COL_BG);
415 input_handler = handle_trigger_selection; 400 input_handler = handle_trigger_selection;
416 draw_trig_cursor(trig_selection_loc, COL_CURSOR);
417 return; 401 return;
418 } 402 }
419 403
@@ -434,9 +418,7 @@ handle_param_selection_sq1(void) {
434 inc = -2; 418 inc = -2;
435 } 419 }
436 } 420 }
437 draw_params_cursor(param_selection_loc, COL_BG);
438 param_selection_loc = CLAMP(loc + inc, 0, 6); 421 param_selection_loc = CLAMP(loc + inc, 0, 6);
439 draw_params_cursor(param_selection_loc, COL_CURSOR);
440 } 422 }
441 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { 423 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) {
442 int inc = 0; 424 int inc = 0;
@@ -458,9 +440,7 @@ handle_param_selection_sq1(void) {
458 inc = -1; 440 inc = -1;
459 } 441 }
460 } 442 }
461 draw_params_cursor(param_selection_loc, COL_BG);
462 param_selection_loc = CLAMP(loc + inc, 0, 6); 443 param_selection_loc = CLAMP(loc + inc, 0, 6);
463 draw_params_cursor(param_selection_loc, COL_CURSOR);
464 } 444 }
465 445
466 // Adjust parameter. 446 // Adjust parameter.
@@ -496,8 +476,7 @@ handle_param_selection_sq1(void) {
496 params->sweep_direction ^= 1; 476 params->sweep_direction ^= 1;
497 } break; 477 } break;
498 } 478 }
499 draw_parameters(); 479 redraw_params = true;
500 draw_params_cursor(param_selection_loc, COL_CURSOR);
501 } 480 }
502} 481}
503 482
@@ -505,9 +484,7 @@ void
505handle_param_selection_sq2(void) { 484handle_param_selection_sq2(void) {
506 // Go back to trigger selection. 485 // Go back to trigger selection.
507 if (key_released(KEY_A)) { 486 if (key_released(KEY_A)) {
508 draw_params_cursor(param_selection_loc, COL_BG);
509 input_handler = handle_trigger_selection; 487 input_handler = handle_trigger_selection;
510 draw_trig_cursor(trig_selection_loc, COL_CURSOR);
511 return; 488 return;
512 } 489 }
513 490
@@ -520,9 +497,7 @@ handle_param_selection_sq2(void) {
520 } else { 497 } else {
521 inc = -1; 498 inc = -1;
522 } 499 }
523 draw_params_cursor(param_selection_loc, COL_BG);
524 param_selection_loc = CLAMP(loc + inc, 0, 3); 500 param_selection_loc = CLAMP(loc + inc, 0, 3);
525 draw_params_cursor(param_selection_loc, COL_CURSOR);
526 } 501 }
527 502
528 // Adjust parameter. 503 // Adjust parameter.
@@ -549,8 +524,7 @@ handle_param_selection_sq2(void) {
549 params->env_time = CLAMP(params->env_time + inc, 0, 7); 524 params->env_time = CLAMP(params->env_time + inc, 0, 7);
550 } break; 525 } break;
551 } 526 }
552 draw_parameters(); 527 redraw_params = true;
553 draw_params_cursor(param_selection_loc, COL_CURSOR);
554 } 528 }
555} 529}
556 530
@@ -560,9 +534,7 @@ handle_param_selection_wave(void) {
560 534
561 // Go back to trigger selection. 535 // Go back to trigger selection.
562 if (key_released(KEY_A)) { 536 if (key_released(KEY_A)) {
563 draw_params_cursor(param_selection_loc, COL_BG);
564 input_handler = handle_trigger_selection; 537 input_handler = handle_trigger_selection;
565 draw_trig_cursor(trig_selection_loc, COL_CURSOR);
566 return; 538 return;
567 } 539 }
568 540
@@ -589,9 +561,7 @@ handle_param_selection_wave(void) {
589 inc = -1; 561 inc = -1;
590 } 562 }
591 } 563 }
592 draw_params_cursor(param_selection_loc, COL_BG);
593 param_selection_loc = CLAMP(loc + inc, 0, 73); 564 param_selection_loc = CLAMP(loc + inc, 0, 73);
594 draw_params_cursor(param_selection_loc, COL_CURSOR);
595 } 565 }
596 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { 566 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) {
597 int inc = 0; 567 int inc = 0;
@@ -645,9 +615,7 @@ handle_param_selection_wave(void) {
645 inc = -1; 615 inc = -1;
646 } 616 }
647 } 617 }
648 draw_params_cursor(param_selection_loc, COL_BG);
649 param_selection_loc = CLAMP(loc + inc, 0, 73); 618 param_selection_loc = CLAMP(loc + inc, 0, 73);
650 draw_params_cursor(param_selection_loc, COL_CURSOR);
651 } 619 }
652 620
653 // Adjust parameter. 621 // Adjust parameter.
@@ -727,8 +695,7 @@ handle_param_selection_wave(void) {
727 u8 *wave_volume = &pat->ch3.params[trig_selection_loc].wave_volume; 695 u8 *wave_volume = &pat->ch3.params[trig_selection_loc].wave_volume;
728 *wave_volume = CLAMP(*wave_volume + inc, 0, 4); 696 *wave_volume = CLAMP(*wave_volume + inc, 0, 4);
729 } 697 }
730 draw_parameters(); 698 redraw_params = true;
731 draw_params_cursor(param_selection_loc, COL_CURSOR);
732 } 699 }
733} 700}
734 701
@@ -736,9 +703,7 @@ void
736handle_param_selection_noise(void) { 703handle_param_selection_noise(void) {
737 // Go back to trigger selection. 704 // Go back to trigger selection.
738 if (key_released(KEY_A)) { 705 if (key_released(KEY_A)) {
739 draw_params_cursor(param_selection_loc, COL_BG);
740 input_handler = handle_trigger_selection; 706 input_handler = handle_trigger_selection;
741 draw_trig_cursor(trig_selection_loc, COL_CURSOR);
742 return; 707 return;
743 } 708 }
744 709
@@ -751,9 +716,7 @@ handle_param_selection_noise(void) {
751 } else { 716 } else {
752 inc = -1; 717 inc = -1;
753 } 718 }
754 draw_params_cursor(param_selection_loc, COL_BG);
755 param_selection_loc = CLAMP(loc + inc, 0, 3); 719 param_selection_loc = CLAMP(loc + inc, 0, 3);
756 draw_params_cursor(param_selection_loc, COL_CURSOR);
757 } 720 }
758 721
759 // Adjust parameter. 722 // Adjust parameter.
@@ -780,8 +743,7 @@ handle_param_selection_noise(void) {
780 params->env_time = CLAMP(params->env_time + inc, 0, 7); 743 params->env_time = CLAMP(params->env_time + inc, 0, 7);
781 } break; 744 } break;
782 } 745 }
783 draw_parameters(); 746 redraw_params = true;
784 draw_params_cursor(param_selection_loc, COL_CURSOR);
785 } 747 }
786} 748}
787 749
@@ -792,24 +754,20 @@ handle_trigger_selection(void) {
792 if (key_tap(KEY_B)) { 754 if (key_tap(KEY_B)) {
793 // Toggle trigger. 755 // Toggle trigger.
794 trig->active ^= 1; 756 trig->active ^= 1;
795 draw_trigger(channel_selection_loc, trig_selection_loc); 757 redraw_trigs = true;
796 } else if (key_tap(KEY_L)) { 758 } else if (key_tap(KEY_L)) {
797 // Decrease note. 759 // Decrease note.
798 if (trig->active) { 760 if (trig->active) {
799 draw_note(trig->note, COL_FG);
800 trig->note = MAX(trig->note - 1, NOTE_C_2); 761 trig->note = MAX(trig->note - 1, NOTE_C_2);
801 draw_note(trig->note, COL_NOTE_PRESSED); 762 redraw_trigs = true;
802 clear_trigger(trig_selection_loc); 763 redraw_piano_note = true;
803 draw_trigger(channel_selection_loc, trig_selection_loc);
804 } 764 }
805 } else if (key_tap(KEY_R)) { 765 } else if (key_tap(KEY_R)) {
806 // Increase note. 766 // Increase note.
807 if (trig->active) { 767 if (trig->active) {
808 draw_note(trig->note, COL_FG);
809 trig->note = MIN( trig->note + 1, NOTE_C_8 - 1); 768 trig->note = MIN( trig->note + 1, NOTE_C_8 - 1);
810 draw_note(trig->note, COL_NOTE_PRESSED); 769 redraw_trigs = true;
811 clear_trigger(trig_selection_loc); 770 redraw_piano_note = true;
812 draw_trigger(channel_selection_loc, trig_selection_loc);
813 } 771 }
814 } 772 }
815 773
@@ -817,50 +775,31 @@ handle_trigger_selection(void) {
817 if (key_tap(KEY_LEFT)) { 775 if (key_tap(KEY_LEFT)) {
818 if (trig_selection_loc == 0 || trig_selection_loc == 8) { 776 if (trig_selection_loc == 0 || trig_selection_loc == 8) {
819 // We are at the boundary, switch to channel selection. 777 // We are at the boundary, switch to channel selection.
820 draw_trig_cursor(trig_selection_loc, COL_BG);
821 draw_note(trig->note, COL_FG);
822 input_handler = handle_channel_selection; 778 input_handler = handle_channel_selection;
823 draw_channel_cursor(channel_selection_loc, COL_CURSOR); 779 redraw_params = true;
824 clear_parameters();
825 } else { 780 } else {
826 draw_trig_cursor(trig_selection_loc, COL_BG);
827 draw_note(trig->note, COL_FG);
828 trig_selection_loc = MAX(trig_selection_loc - 1, 0); 781 trig_selection_loc = MAX(trig_selection_loc - 1, 0);
829 trig = get_current_trig(); 782 redraw_piano_note = true;
830 draw_trig_cursor(trig_selection_loc, COL_CURSOR); 783 redraw_params = true;
831 draw_note(trig->note, COL_NOTE_PRESSED);
832 draw_parameters();
833 } 784 }
834 } else if (key_tap(KEY_RIGHT)) { 785 } else if (key_tap(KEY_RIGHT)) {
835 if (trig_selection_loc != 7 && trig_selection_loc != 15) { 786 if (trig_selection_loc != 7 && trig_selection_loc != 15) {
836 draw_trig_cursor(trig_selection_loc, COL_BG);
837 draw_note(trig->note, COL_FG);
838 trig_selection_loc = MIN(trig_selection_loc + 1, 15); 787 trig_selection_loc = MIN(trig_selection_loc + 1, 15);
839 trig = get_current_trig(); 788 redraw_piano_note = true;
840 draw_trig_cursor(trig_selection_loc, COL_CURSOR); 789 redraw_params = true;
841 draw_note(trig->note, COL_NOTE_PRESSED);
842 draw_parameters();
843 } else if (trig_selection_loc == 7) { 790 } else if (trig_selection_loc == 7) {
844 input_handler = handle_right_col_selection; 791 input_handler = handle_right_col_selection;
845 right_col_selection_loc = R_COL_STOP; 792 right_col_selection_loc = R_COL_STOP;
846 draw_trig_cursor(trig_selection_loc, COL_BG); 793 redraw_params = true;
847 draw_note(trig->note, COL_FG);
848 draw_right_col_cursor(COL_CURSOR);
849 } else if (trig_selection_loc == 15) { 794 } else if (trig_selection_loc == 15) {
850 right_col_selection_loc = R_COL_BPM; 795 right_col_selection_loc = R_COL_BPM;
851 input_handler = handle_right_col_selection; 796 input_handler = handle_right_col_selection;
852 draw_trig_cursor(trig_selection_loc, COL_BG); 797 redraw_params = true;
853 draw_note(trig->note, COL_FG);
854 draw_right_col_cursor(COL_CURSOR);
855 } 798 }
856 } else if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { 799 } else if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) {
857 draw_trig_cursor(trig_selection_loc, COL_BG);
858 draw_note(trig->note, COL_FG);
859 trig_selection_loc = (trig_selection_loc + 8) % 16; 800 trig_selection_loc = (trig_selection_loc + 8) % 16;
860 trig = get_current_trig(); 801 redraw_piano_note = true;
861 draw_trig_cursor(trig_selection_loc, COL_CURSOR); 802 redraw_params = true;
862 draw_note(trig->note, COL_NOTE_PRESSED);
863 draw_parameters();
864 } else if (key_tap(KEY_A)) { 803 } else if (key_tap(KEY_A)) {
865 // Switch to parameter selection. 804 // Switch to parameter selection.
866 switch (channel_selection_loc) { 805 switch (channel_selection_loc) {
@@ -877,8 +816,8 @@ handle_trigger_selection(void) {
877 input_handler = handle_param_selection_noise; 816 input_handler = handle_param_selection_noise;
878 } break; 817 } break;
879 } 818 }
880 draw_params_cursor(param_selection_loc, COL_CURSOR); 819 redraw_piano_note = true;
881 draw_trig_cursor(trig_selection_loc, COL_GREY); 820 redraw_params = true;
882 } 821 }
883} 822}
884 823