aboutsummaryrefslogtreecommitdiffstats
path: root/src/sequencer.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-08-25 15:42:58 +0200
committerBad Diode <bd@badd10de.dev>2023-08-25 15:42:58 +0200
commitfff06404696bb8790901cdefe016cd8d0fe856cb (patch)
treea42ac0a2afe3b15f9b90e9cc76d311c256e0ed98 /src/sequencer.c
parent439f5564e4a92f91a43a7f36d734f6bd96effd63 (diff)
downloadstepper-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.c91
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 }