diff options
author | Bad Diode <bd@badd10de.dev> | 2023-04-24 17:31:17 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-04-24 17:31:17 +0200 |
commit | 4771c84572008a223b1f35f6b2cb1d8b92bb2083 (patch) | |
tree | b7f8318c2003a43dfa75c6e5727c15e895b908fd /src/sequencer.c | |
parent | 694bcf4790f7c03751972832bf6f2cbe6a215d04 (diff) | |
download | stepper-4771c84572008a223b1f35f6b2cb1d8b92bb2083.tar.gz stepper-4771c84572008a223b1f35f6b2cb1d8b92bb2083.zip |
Fix SRAM bug due to exceeding 32KB capacity
This means that currently the global channel parameters are not saved,
but this is kind of unimportant, since they are just used to change all
the triggers. In the future we may choose to discard a pattern, a bank
or compress the data before storing it on the SRAM, depending on how
much more data we need to save.
Diffstat (limited to 'src/sequencer.c')
-rw-r--r-- | src/sequencer.c | 56 |
1 files changed, 26 insertions, 30 deletions
diff --git a/src/sequencer.c b/src/sequencer.c index 397d6f9..9c92ef0 100644 --- a/src/sequencer.c +++ b/src/sequencer.c | |||
@@ -462,7 +462,7 @@ handle_pattern_selection(void) { | |||
462 | } | 462 | } |
463 | 463 | ||
464 | bool | 464 | bool |
465 | set_param_selection_sq1(size_t i, InputHandler return_handler) { | 465 | set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler) { |
466 | // Go back to trigger selection. | 466 | // Go back to trigger selection. |
467 | if (key_released(KEY_A)) { | 467 | if (key_released(KEY_A)) { |
468 | input_handler = return_handler; | 468 | input_handler = return_handler; |
@@ -525,8 +525,6 @@ set_param_selection_sq1(size_t i, InputHandler return_handler) { | |||
525 | } else { | 525 | } else { |
526 | inc = 1; | 526 | inc = 1; |
527 | } | 527 | } |
528 | Pattern *pat = &patterns[pattern_selection_loc]; | ||
529 | ChannelSquareParams *params = &pat->ch1.params[i]; | ||
530 | switch (param_selection_loc) { | 528 | switch (param_selection_loc) { |
531 | case 0: { | 529 | case 0: { |
532 | params->duty_cycle = CLAMP(params->duty_cycle + inc, 0, 3); | 530 | params->duty_cycle = CLAMP(params->duty_cycle + inc, 0, 3); |
@@ -558,7 +556,7 @@ set_param_selection_sq1(size_t i, InputHandler return_handler) { | |||
558 | } | 556 | } |
559 | 557 | ||
560 | bool | 558 | bool |
561 | set_param_selection_sq2(size_t i, InputHandler return_handler) { | 559 | set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler) { |
562 | // Go back to trigger selection. | 560 | // Go back to trigger selection. |
563 | if (key_released(KEY_A)) { | 561 | if (key_released(KEY_A)) { |
564 | input_handler = return_handler; | 562 | input_handler = return_handler; |
@@ -588,8 +586,6 @@ set_param_selection_sq2(size_t i, InputHandler return_handler) { | |||
588 | } else { | 586 | } else { |
589 | inc = 1; | 587 | inc = 1; |
590 | } | 588 | } |
591 | Pattern *pat = &patterns[pattern_selection_loc]; | ||
592 | ChannelSquareParams *params = &pat->ch2.params[i]; | ||
593 | switch (param_selection_loc) { | 589 | switch (param_selection_loc) { |
594 | case 0: { | 590 | case 0: { |
595 | params->duty_cycle = CLAMP(params->duty_cycle + inc, 0, 3); | 591 | params->duty_cycle = CLAMP(params->duty_cycle + inc, 0, 3); |
@@ -612,9 +608,7 @@ set_param_selection_sq2(size_t i, InputHandler return_handler) { | |||
612 | } | 608 | } |
613 | 609 | ||
614 | bool | 610 | bool |
615 | set_param_selection_wave(size_t i, InputHandler return_handler) { | 611 | set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) { |
616 | Pattern *pat = &patterns[pattern_selection_loc]; | ||
617 | |||
618 | // Go back to trigger selection. | 612 | // Go back to trigger selection. |
619 | if (key_released(KEY_A)) { | 613 | if (key_released(KEY_A)) { |
620 | input_handler = return_handler; | 614 | input_handler = return_handler; |
@@ -724,7 +718,7 @@ set_param_selection_wave(size_t i, InputHandler return_handler) { | |||
724 | if (param_selection_loc < 32) { | 718 | if (param_selection_loc < 32) { |
725 | // Draw on wave a. | 719 | // Draw on wave a. |
726 | u8 byte_number = param_selection_loc / 2; | 720 | u8 byte_number = param_selection_loc / 2; |
727 | u8 *byte = &pat->ch3.params[i].wave_a; | 721 | u8 *byte = ¶ms->wave_a; |
728 | byte += byte_number; | 722 | byte += byte_number; |
729 | if (odd) { | 723 | if (odd) { |
730 | *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); | 724 | *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); |
@@ -734,7 +728,7 @@ set_param_selection_wave(size_t i, InputHandler return_handler) { | |||
734 | } else if (param_selection_loc < 64){ | 728 | } else if (param_selection_loc < 64){ |
735 | // Draw on wave b. | 729 | // Draw on wave b. |
736 | u8 byte_number = (param_selection_loc - 32) / 2; | 730 | u8 byte_number = (param_selection_loc - 32) / 2; |
737 | u8 *byte = &pat->ch3.params[i].wave_b; | 731 | u8 *byte = ¶ms->wave_b; |
738 | byte += byte_number; | 732 | byte += byte_number; |
739 | if (odd) { | 733 | if (odd) { |
740 | *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); | 734 | *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); |
@@ -743,8 +737,8 @@ set_param_selection_wave(size_t i, InputHandler return_handler) { | |||
743 | } | 737 | } |
744 | } else if (param_selection_loc < 72) { | 738 | } else if (param_selection_loc < 72) { |
745 | // Copy default waves. | 739 | // Copy default waves. |
746 | u32 *wave_a = &pat->ch3.params[i].wave_a; | 740 | u32 *wave_a = ¶ms->wave_a; |
747 | u32 *wave_b = &pat->ch3.params[i].wave_b; | 741 | u32 *wave_b = ¶ms->wave_b; |
748 | switch (param_selection_loc) { | 742 | switch (param_selection_loc) { |
749 | case 64: { memcpy32(wave_a, sine_wave, 16); } break; | 743 | case 64: { memcpy32(wave_a, sine_wave, 16); } break; |
750 | case 65: { memcpy32(wave_a, saw_wave, 16); } break; | 744 | case 65: { memcpy32(wave_a, saw_wave, 16); } break; |
@@ -766,10 +760,10 @@ set_param_selection_wave(size_t i, InputHandler return_handler) { | |||
766 | } break; | 760 | } break; |
767 | } | 761 | } |
768 | } else if (param_selection_loc == 72) { | 762 | } else if (param_selection_loc == 72) { |
769 | u8 *wave_mode = &pat->ch3.params[i].wave_mode; | 763 | u8 *wave_mode = ¶ms->wave_mode; |
770 | *wave_mode = CLAMP(*wave_mode + inc, 0, 2); | 764 | *wave_mode = CLAMP(*wave_mode + inc, 0, 2); |
771 | } else if (param_selection_loc == 73) { | 765 | } else if (param_selection_loc == 73) { |
772 | u8 *wave_volume = &pat->ch3.params[i].wave_volume; | 766 | u8 *wave_volume = ¶ms->wave_volume; |
773 | *wave_volume = CLAMP(*wave_volume + inc, 0, 4); | 767 | *wave_volume = CLAMP(*wave_volume + inc, 0, 4); |
774 | } | 768 | } |
775 | redraw_params = true; | 769 | redraw_params = true; |
@@ -780,7 +774,7 @@ set_param_selection_wave(size_t i, InputHandler return_handler) { | |||
780 | } | 774 | } |
781 | 775 | ||
782 | bool | 776 | bool |
783 | set_param_selection_noise(size_t i, InputHandler return_handler) { | 777 | set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handler) { |
784 | // Go back to trigger selection. | 778 | // Go back to trigger selection. |
785 | if (key_released(KEY_A)) { | 779 | if (key_released(KEY_A)) { |
786 | input_handler = return_handler; | 780 | input_handler = return_handler; |
@@ -810,8 +804,6 @@ set_param_selection_noise(size_t i, InputHandler return_handler) { | |||
810 | } else { | 804 | } else { |
811 | inc = 1; | 805 | inc = 1; |
812 | } | 806 | } |
813 | Pattern *pat = &patterns[pattern_selection_loc]; | ||
814 | ChannelNoiseParams *params = &pat->ch4.params[i]; | ||
815 | switch (param_selection_loc) { | 807 | switch (param_selection_loc) { |
816 | case 0: { | 808 | case 0: { |
817 | params->bit_mode = CLAMP(params->bit_mode + inc, 0, 1); | 809 | params->bit_mode = CLAMP(params->bit_mode + inc, 0, 1); |
@@ -836,9 +828,9 @@ set_param_selection_noise(size_t i, InputHandler return_handler) { | |||
836 | void | 828 | void |
837 | handle_param_selection_ch1() { | 829 | handle_param_selection_ch1() { |
838 | Pattern *pat = &patterns[pattern_selection_loc]; | 830 | Pattern *pat = &patterns[pattern_selection_loc]; |
839 | if (set_param_selection_sq1(16, handle_channel_selection)) { | 831 | if (set_param_selection_sq1(&ch1_params, handle_channel_selection)) { |
840 | for (size_t i = 0; i < 16; i++) { | 832 | for (size_t i = 0; i < 16; i++) { |
841 | pat->ch1.params[i] = pat->ch1.params[16]; | 833 | pat->ch1.params[i] = ch1_params; |
842 | } | 834 | } |
843 | } | 835 | } |
844 | } | 836 | } |
@@ -846,9 +838,9 @@ handle_param_selection_ch1() { | |||
846 | void | 838 | void |
847 | handle_param_selection_ch2() { | 839 | handle_param_selection_ch2() { |
848 | Pattern *pat = &patterns[pattern_selection_loc]; | 840 | Pattern *pat = &patterns[pattern_selection_loc]; |
849 | if (set_param_selection_sq2(16, handle_channel_selection)) { | 841 | if (set_param_selection_sq2(&ch2_params, handle_channel_selection)) { |
850 | for (size_t i = 0; i < 16; i++) { | 842 | for (size_t i = 0; i < 16; i++) { |
851 | pat->ch2.params[i] = pat->ch2.params[16]; | 843 | pat->ch2.params[i] = ch2_params; |
852 | } | 844 | } |
853 | } | 845 | } |
854 | } | 846 | } |
@@ -856,9 +848,9 @@ handle_param_selection_ch2() { | |||
856 | void | 848 | void |
857 | handle_param_selection_ch3() { | 849 | handle_param_selection_ch3() { |
858 | Pattern *pat = &patterns[pattern_selection_loc]; | 850 | Pattern *pat = &patterns[pattern_selection_loc]; |
859 | if (set_param_selection_wave(16, handle_channel_selection)) { | 851 | if (set_param_selection_wave(&ch3_params, handle_channel_selection)) { |
860 | for (size_t i = 0; i < 16; i++) { | 852 | for (size_t i = 0; i < 16; i++) { |
861 | pat->ch3.params[i] = pat->ch3.params[16]; | 853 | pat->ch3.params[i] = ch3_params; |
862 | } | 854 | } |
863 | } | 855 | } |
864 | } | 856 | } |
@@ -866,31 +858,35 @@ handle_param_selection_ch3() { | |||
866 | void | 858 | void |
867 | handle_param_selection_ch4() { | 859 | handle_param_selection_ch4() { |
868 | Pattern *pat = &patterns[pattern_selection_loc]; | 860 | Pattern *pat = &patterns[pattern_selection_loc]; |
869 | if (set_param_selection_noise(16, handle_channel_selection)) { | 861 | if (set_param_selection_noise(&ch4_params, handle_channel_selection)) { |
870 | for (size_t i = 0; i < 16; i++) { | 862 | for (size_t i = 0; i < 16; i++) { |
871 | pat->ch4.params[i] = pat->ch4.params[16]; | 863 | pat->ch4.params[i] = ch4_params; |
872 | } | 864 | } |
873 | } | 865 | } |
874 | } | 866 | } |
875 | 867 | ||
876 | void | 868 | void |
877 | handle_param_selection_sq1() { | 869 | handle_param_selection_sq1() { |
878 | set_param_selection_sq1(trig_selection_loc, handle_trigger_selection); | 870 | ChannelSquareParams *params = &patterns[pattern_selection_loc].ch1.params[trig_selection_loc]; |
871 | set_param_selection_sq1(params, handle_trigger_selection); | ||
879 | } | 872 | } |
880 | 873 | ||
881 | void | 874 | void |
882 | handle_param_selection_sq2() { | 875 | handle_param_selection_sq2() { |
883 | set_param_selection_sq2(trig_selection_loc, handle_trigger_selection); | 876 | ChannelSquareParams *params = &patterns[pattern_selection_loc].ch2.params[trig_selection_loc]; |
877 | set_param_selection_sq2(params, handle_trigger_selection); | ||
884 | } | 878 | } |
885 | 879 | ||
886 | void | 880 | void |
887 | handle_param_selection_wave() { | 881 | handle_param_selection_wave() { |
888 | set_param_selection_wave(trig_selection_loc, handle_trigger_selection); | 882 | ChannelWaveParams *params = &patterns[pattern_selection_loc].ch3.params[trig_selection_loc]; |
883 | set_param_selection_wave(params, handle_trigger_selection); | ||
889 | } | 884 | } |
890 | 885 | ||
891 | void | 886 | void |
892 | handle_param_selection_noise() { | 887 | handle_param_selection_noise() { |
893 | set_param_selection_noise(trig_selection_loc, handle_trigger_selection); | 888 | ChannelNoiseParams *params = &patterns[pattern_selection_loc].ch4.params[trig_selection_loc]; |
889 | set_param_selection_noise(params, handle_trigger_selection); | ||
894 | } | 890 | } |
895 | 891 | ||
896 | void | 892 | void |