diff options
author | Bad Diode <bd@badd10de.dev> | 2023-08-25 15:42:58 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-08-25 15:42:58 +0200 |
commit | fff06404696bb8790901cdefe016cd8d0fe856cb (patch) | |
tree | a42ac0a2afe3b15f9b90e9cc76d311c256e0ed98 /src/sequencer.c | |
parent | 439f5564e4a92f91a43a7f36d734f6bd96effd63 (diff) | |
download | stepper-fff06404696bb8790901cdefe016cd8d0fe856cb.tar.gz stepper-fff06404696bb8790901cdefe016cd8d0fe856cb.zip |
Add pattern chain buttons behaviour (toggle/clear/random)
Diffstat (limited to 'src/sequencer.c')
-rw-r--r-- | src/sequencer.c | 91 |
1 files changed, 71 insertions, 20 deletions
diff --git a/src/sequencer.c b/src/sequencer.c index 58714cb..266db94 100644 --- a/src/sequencer.c +++ b/src/sequencer.c | |||
@@ -138,7 +138,7 @@ play_step(void) { | |||
138 | } else if (current_bank != next_bank && step_counter == 15) { | 138 | } else if (current_bank != next_bank && step_counter == 15) { |
139 | select_bank(next_bank); | 139 | select_bank(next_bank); |
140 | update_bpm = true; | 140 | update_bpm = true; |
141 | } else if (chain.len != 0 && step_counter == 15) { | 141 | } else if (chain.len != 0 && step_counter == 15 && chain.enabled) { |
142 | redraw_pattern_buttons = true; | 142 | redraw_pattern_buttons = true; |
143 | update_bpm = true; | 143 | update_bpm = true; |
144 | if (!chain.playing) { | 144 | if (!chain.playing) { |
@@ -762,6 +762,8 @@ handle_pattern_chain(void) { | |||
762 | } else if (key_tap(KEY_LEFT)) { | 762 | } else if (key_tap(KEY_LEFT)) { |
763 | if (param_selection_loc == 8) { | 763 | if (param_selection_loc == 8) { |
764 | param_selection_loc = 15; | 764 | param_selection_loc = 15; |
765 | } else if (param_selection_loc == 16) { | ||
766 | param_selection_loc = 18; | ||
765 | } else if (param_selection_loc > 0) { | 767 | } else if (param_selection_loc > 0) { |
766 | param_selection_loc--; | 768 | param_selection_loc--; |
767 | } else if (param_selection_loc == 0) { | 769 | } else if (param_selection_loc == 0) { |
@@ -770,48 +772,97 @@ handle_pattern_chain(void) { | |||
770 | } else if (key_tap(KEY_RIGHT)) { | 772 | } else if (key_tap(KEY_RIGHT)) { |
771 | if (param_selection_loc < 15 && param_selection_loc != 7) { | 773 | if (param_selection_loc < 15 && param_selection_loc != 7) { |
772 | param_selection_loc++; | 774 | param_selection_loc++; |
775 | } else if (param_selection_loc < 18 && param_selection_loc >= 16) { | ||
776 | param_selection_loc++; | ||
777 | } else if (param_selection_loc == 18) { | ||
778 | param_selection_loc = 16; | ||
773 | } else if (param_selection_loc == 7) { | 779 | } else if (param_selection_loc == 7) { |
774 | param_selection_loc = 0; | 780 | param_selection_loc = 0; |
775 | } else if (param_selection_loc == 15) { | 781 | } else if (param_selection_loc == 15) { |
776 | param_selection_loc = 8; | 782 | param_selection_loc = 8; |
777 | } | 783 | } |
778 | } else if (key_tap(KEY_UP)) { | 784 | } else if (key_tap(KEY_UP)) { |
779 | if (param_selection_loc <= 7) { | 785 | if (param_selection_loc >= 1 && param_selection_loc <= 2) { |
780 | param_selection_loc += 8; | 786 | param_selection_loc = 16; |
781 | } else { | 787 | } else if (param_selection_loc >= 3 && param_selection_loc <= 4) { |
788 | param_selection_loc = 17; | ||
789 | } else if (param_selection_loc >= 5 && param_selection_loc <= 6) { | ||
790 | param_selection_loc = 18; | ||
791 | } else if (param_selection_loc >= 8 && param_selection_loc <= 15){ | ||
782 | param_selection_loc -= 8; | 792 | param_selection_loc -= 8; |
783 | } | 793 | } |
784 | } else if (key_tap(KEY_DOWN)) { | 794 | } else if (key_tap(KEY_DOWN)) { |
785 | if (param_selection_loc <= 7) { | 795 | if (param_selection_loc <= 7) { |
786 | param_selection_loc += 8; | 796 | param_selection_loc += 8; |
787 | } else { | 797 | } else if (param_selection_loc == 16){ |
788 | param_selection_loc -= 8; | 798 | param_selection_loc = 1; |
799 | } else if (param_selection_loc == 17){ | ||
800 | param_selection_loc = 3; | ||
801 | } else if (param_selection_loc == 18){ | ||
802 | param_selection_loc = 5; | ||
789 | } | 803 | } |
790 | } else if (key_tap(KEY_B)) { | 804 | } else if (key_tap(KEY_B)) { |
791 | if (chain.active[param_selection_loc]) { | 805 | switch (param_selection_loc) { |
792 | // Can't toggle current chain. | 806 | case CHAIN_BTN_ENABLE: { |
793 | if (!play_status | 807 | chain.enabled ^= 1; |
794 | || param_selection_loc != chain.current | 808 | chain.current = 15; |
795 | || chain.len == 1) { | 809 | chain.current = find_next_pattern(); |
796 | chain.active[param_selection_loc] = 0; | 810 | chain.playing = false; |
797 | chain.len--; | 811 | } break; |
798 | } | 812 | case CHAIN_BTN_CLEAR: { |
799 | } else { | 813 | chain.len = 0; |
800 | if (chain.len == 0) { | 814 | chain.playing = false; |
801 | chain.current = param_selection_loc; | 815 | for (size_t i = 0; i < MAX_CHAIN; i++) { |
802 | } | 816 | chain.active[i] = false; |
803 | chain.active[param_selection_loc] = 1; | 817 | chain.chain[i] = 0; |
804 | chain.len++; | 818 | } |
819 | chain.current = 15; | ||
820 | chain.current = find_next_pattern(); | ||
821 | } break; | ||
822 | case CHAIN_BTN_RANDOM: { | ||
823 | u8 cur = chain.current % 16; | ||
824 | for (size_t i = 0; i < MAX_CHAIN; i++) { | ||
825 | if (i == cur && chain.playing) { | ||
826 | continue; | ||
827 | } | ||
828 | if (rng16() < 32765) { | ||
829 | chain.active[i] = true; | ||
830 | } else { | ||
831 | chain.active[i] = false; | ||
832 | } | ||
833 | // NOTE: Should we also randomize the patterns or isn't it | ||
834 | // necessary? | ||
835 | } | ||
836 | } break; | ||
837 | default: { | ||
838 | if (chain.active[param_selection_loc]) { | ||
839 | // Can't toggle current chain. | ||
840 | if (!play_status | ||
841 | || param_selection_loc != chain.current | ||
842 | || chain.len == 1) { | ||
843 | chain.active[param_selection_loc] = 0; | ||
844 | chain.len--; | ||
845 | } | ||
846 | } else { | ||
847 | if (chain.len == 0) { | ||
848 | chain.current = param_selection_loc; | ||
849 | } | ||
850 | chain.active[param_selection_loc] = 1; | ||
851 | chain.len++; | ||
852 | } | ||
853 | } break; | ||
805 | } | 854 | } |
806 | } else if (key_tap(KEY_L)) { | 855 | } else if (key_tap(KEY_L)) { |
807 | if (chain.active[param_selection_loc] | 856 | if (chain.active[param_selection_loc] |
808 | && chain.chain[param_selection_loc] > 0 | 857 | && chain.chain[param_selection_loc] > 0 |
858 | && param_selection_loc <= 15 | ||
809 | && (!play_status || param_selection_loc != chain.current)) { | 859 | && (!play_status || param_selection_loc != chain.current)) { |
810 | chain.chain[param_selection_loc]--; | 860 | chain.chain[param_selection_loc]--; |
811 | } | 861 | } |
812 | } else if (key_tap(KEY_R)) { | 862 | } else if (key_tap(KEY_R)) { |
813 | if (chain.active[param_selection_loc] | 863 | if (chain.active[param_selection_loc] |
814 | && chain.chain[param_selection_loc] < 7 | 864 | && chain.chain[param_selection_loc] < 7 |
865 | && param_selection_loc <= 15 | ||
815 | && (!play_status || param_selection_loc != chain.current)) { | 866 | && (!play_status || param_selection_loc != chain.current)) { |
816 | chain.chain[param_selection_loc]++; | 867 | chain.chain[param_selection_loc]++; |
817 | } | 868 | } |