diff options
author | Bad Diode <bd@badd10de.dev> | 2023-07-22 09:30:13 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-07-22 09:30:13 +0200 |
commit | 2c4b3648075cc5faa24b859685426b208ccb3a80 (patch) | |
tree | 2a14278186211478923f2607c283ced8377af507 | |
parent | bac16fa2662f61cfa3b56111649685b4eb397442 (diff) | |
download | stepper-2c4b3648075cc5faa24b859685426b208ccb3a80.tar.gz stepper-2c4b3648075cc5faa24b859685426b208ccb3a80.zip |
Add probability handling and drawing
-rw-r--r-- | src/drawing.c | 80 | ||||
-rw-r--r-- | src/globals.c | 20 | ||||
-rw-r--r-- | src/sequencer.c | 21 |
3 files changed, 82 insertions, 39 deletions
diff --git a/src/drawing.c b/src/drawing.c index 653351d..8fef74f 100644 --- a/src/drawing.c +++ b/src/drawing.c | |||
@@ -667,6 +667,49 @@ clear_parameters(void) { | |||
667 | draw_filled_rect(x0, y0, x1, y1, COL_BG); | 667 | draw_filled_rect(x0, y0, x1, y1, COL_BG); |
668 | } | 668 | } |
669 | 669 | ||
670 | void | ||
671 | draw_prob(u8 prob, u8 clr) { | ||
672 | size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3; | ||
673 | size_t y = PARAMS_START_Y + 5; | ||
674 | switch (prob) { | ||
675 | case PROB_100: { | ||
676 | txt_drawf("100", x, y, clr); | ||
677 | txt_drawc('%', x + 18, y, clr); | ||
678 | } break; | ||
679 | case PROB_80: { | ||
680 | txt_drawf("80", x + 3, y, clr); | ||
681 | txt_drawc('%', x + 15, y, clr); | ||
682 | } break; | ||
683 | case PROB_60: { | ||
684 | txt_drawf("60", x + 3, y, clr); | ||
685 | txt_drawc('%', x + 15, y, clr); | ||
686 | } break; | ||
687 | case PROB_40: { | ||
688 | txt_drawf("40", x + 3, y, clr); | ||
689 | txt_drawc('%', x + 15, y, clr); | ||
690 | } break; | ||
691 | case PROB_20: { | ||
692 | txt_drawf("20", x + 3, y, clr); | ||
693 | txt_drawc('%', x + 15, y, clr); | ||
694 | } break; | ||
695 | case PROB_FIRST: { txt_drawf("1st", x + 3, y, clr); } break; | ||
696 | case PROB_NOT_FIRST: { | ||
697 | txt_drawf("1st", x + 3, y, clr); | ||
698 | draw_line(x + 3, y - 1, x + 21, y - 1, clr); | ||
699 | } break; | ||
700 | case PROB_ONE_TWO: { txt_drawf("1:2", x + 3, y, clr); } break; | ||
701 | case PROB_TWO_TWO: { txt_drawf("2:2", x + 3, y, clr); } break; | ||
702 | case PROB_ONE_THREE: { txt_drawf("1:3", x + 3, y, clr); } break; | ||
703 | case PROB_TWO_THREE: { txt_drawf("2:3", x + 3, y, clr); } break; | ||
704 | case PROB_THREE_THREE: { txt_drawf("3:3", x + 3, y, clr); } break; | ||
705 | case PROB_ONE_FOUR: { txt_drawf("1:4", x + 3, y, clr); } break; | ||
706 | case PROB_TWO_FOUR: { txt_drawf("2:4", x + 3, y, clr); } break; | ||
707 | case PROB_THREE_FOUR: { txt_drawf("3:4", x + 3, y, clr); } break; | ||
708 | case PROB_FOUR_FOUR: { txt_drawf("4:4", x + 3, y, clr); } break; | ||
709 | default: break; | ||
710 | } | ||
711 | } | ||
712 | |||
670 | IWRAM_CODE | 713 | IWRAM_CODE |
671 | void | 714 | void |
672 | draw_parameters_wave(ChannelWaveParams *params, bool global) { | 715 | draw_parameters_wave(ChannelWaveParams *params, bool global) { |
@@ -685,13 +728,8 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) { | |||
685 | draw_wave_pattern(waves[params->shape_b][params->phase_b], x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2); | 728 | draw_wave_pattern(waves[params->shape_b][params->phase_b], x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2); |
686 | } | 729 | } |
687 | 730 | ||
688 | // TODO: Trig probability | 731 | // Trig probability. |
689 | { | 732 | draw_prob(params->prob, col_fg); |
690 | size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3; | ||
691 | size_t y = PARAMS_START_Y + 5; | ||
692 | txt_drawf("100", x, y, col_fg); | ||
693 | txt_drawc('%', x + 18, y, col_fg); | ||
694 | } | ||
695 | 733 | ||
696 | // Mode selection. | 734 | // Mode selection. |
697 | { | 735 | { |
@@ -814,11 +852,6 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { | |||
814 | 852 | ||
815 | // Env. | 853 | // Env. |
816 | if (params->env_time == 0) { | 854 | if (params->env_time == 0) { |
817 | // TODO: Time 0 vol 0 (dir) doesn't make sense (mute) | ||
818 | // TODO: Time 0 vol 100 doesn't make sense (constant max volume) | ||
819 | // NOTE: Maybe it's just a matter of handling it better on the | ||
820 | // control? Have to check every time we change direction to swap | ||
821 | // the conditions. | ||
822 | draw_line(x0, y0, x2, y0, COL_ACC_2); | 855 | draw_line(x0, y0, x2, y0, COL_ACC_2); |
823 | } else { | 856 | } else { |
824 | draw_line(x0, y0, x1, y1, COL_ACC_2); | 857 | draw_line(x0, y0, x1, y1, COL_ACC_2); |
@@ -826,13 +859,8 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) { | |||
826 | } | 859 | } |
827 | } | 860 | } |
828 | 861 | ||
829 | // TODO: Trig probability | 862 | // Trig probability. |
830 | { | 863 | draw_prob(params->prob, col_fg); |
831 | size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3; | ||
832 | size_t y = PARAMS_START_Y + 5; | ||
833 | txt_drawf("100", x, y, col_fg); | ||
834 | txt_drawc('%', x + 18, y, col_fg); | ||
835 | } | ||
836 | 864 | ||
837 | // Sweep. | 865 | // Sweep. |
838 | if (sweep) { | 866 | if (sweep) { |
@@ -943,11 +971,6 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) { | |||
943 | 971 | ||
944 | // Env. | 972 | // Env. |
945 | if (params->env_time == 0) { | 973 | if (params->env_time == 0) { |
946 | // TODO: Time 0 vol 0 (dir) doesn't make sense (mute) | ||
947 | // TODO: Time 0 vol 100 doesn't make sense (constant max volume) | ||
948 | // NOTE: Maybe it's just a matter of handling it better on the | ||
949 | // control? Have to check every time we change direction to swap | ||
950 | // the conditions. | ||
951 | draw_line(x0, y0, x2, y0, COL_ACC_2); | 974 | draw_line(x0, y0, x2, y0, COL_ACC_2); |
952 | } else { | 975 | } else { |
953 | draw_line(x0, y0, x1, y1, COL_ACC_2); | 976 | draw_line(x0, y0, x1, y1, COL_ACC_2); |
@@ -955,13 +978,8 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) { | |||
955 | } | 978 | } |
956 | } | 979 | } |
957 | 980 | ||
958 | // TODO: Trig probability | 981 | // Trig probability. |
959 | { | 982 | draw_prob(params->prob, col_fg); |
960 | size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3; | ||
961 | size_t y = PARAMS_START_Y + 5; | ||
962 | txt_drawf("100", x, y, col_fg); | ||
963 | txt_drawc('%', x + 18, y, col_fg); | ||
964 | } | ||
965 | 983 | ||
966 | // Labels. | 984 | // Labels. |
967 | { | 985 | { |
diff --git a/src/globals.c b/src/globals.c index 758f3b5..51ef292 100644 --- a/src/globals.c +++ b/src/globals.c | |||
@@ -160,3 +160,23 @@ typedef struct Chain { | |||
160 | } Chain; | 160 | } Chain; |
161 | 161 | ||
162 | static Chain chain = {0}; | 162 | static Chain chain = {0}; |
163 | |||
164 | typedef enum Prob { | ||
165 | PROB_100, | ||
166 | PROB_80, | ||
167 | PROB_60, | ||
168 | PROB_40, | ||
169 | PROB_20, | ||
170 | PROB_FIRST, | ||
171 | PROB_NOT_FIRST, | ||
172 | PROB_ONE_TWO, | ||
173 | PROB_TWO_TWO, | ||
174 | PROB_ONE_THREE, | ||
175 | PROB_TWO_THREE, | ||
176 | PROB_THREE_THREE, | ||
177 | PROB_ONE_FOUR, | ||
178 | PROB_TWO_FOUR, | ||
179 | PROB_THREE_FOUR, | ||
180 | PROB_FOUR_FOUR, | ||
181 | PROB_NUM, | ||
182 | } Prob; | ||
diff --git a/src/sequencer.c b/src/sequencer.c index 04153aa..00baebb 100644 --- a/src/sequencer.c +++ b/src/sequencer.c | |||
@@ -71,6 +71,11 @@ find_prev_pattern(void) { | |||
71 | return idx; | 71 | return idx; |
72 | } | 72 | } |
73 | 73 | ||
74 | bool | ||
75 | should_play(u8 prob) { | ||
76 | return true; | ||
77 | } | ||
78 | |||
74 | void | 79 | void |
75 | play_step(void) { | 80 | play_step(void) { |
76 | Pattern *pat = &patterns[current_pattern]; | 81 | Pattern *pat = &patterns[current_pattern]; |
@@ -94,7 +99,7 @@ play_step(void) { | |||
94 | if (pat->ch1.active) { | 99 | if (pat->ch1.active) { |
95 | TriggerNote *trig = &pat->ch1.notes[step_counter]; | 100 | TriggerNote *trig = &pat->ch1.notes[step_counter]; |
96 | ChannelSquareParams *params = &pat->ch1.params[step_counter]; | 101 | ChannelSquareParams *params = &pat->ch1.params[step_counter]; |
97 | if (trig->active) { | 102 | if (trig->active && should_play(params->prob)) { |
98 | if (params->sweep_time == 0) { | 103 | if (params->sweep_time == 0) { |
99 | SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); | 104 | SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); |
100 | } else { | 105 | } else { |
@@ -128,7 +133,7 @@ play_step(void) { | |||
128 | if (pat->ch2.active) { | 133 | if (pat->ch2.active) { |
129 | TriggerNote *trig = &pat->ch2.notes[step_counter]; | 134 | TriggerNote *trig = &pat->ch2.notes[step_counter]; |
130 | ChannelSquareParams *params = &pat->ch2.params[step_counter]; | 135 | ChannelSquareParams *params = &pat->ch2.params[step_counter]; |
131 | if (trig->active) { | 136 | if (trig->active && should_play(params->prob)) { |
132 | SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) | 137 | SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) |
133 | | SOUND_SQUARE_ENV_TIME(params->env_time) | 138 | | SOUND_SQUARE_ENV_TIME(params->env_time) |
134 | | SOUND_SQUARE_ENV_DIR(params->env_direction) | 139 | | SOUND_SQUARE_ENV_DIR(params->env_direction) |
@@ -147,7 +152,7 @@ play_step(void) { | |||
147 | if (pat->ch3.active) { | 152 | if (pat->ch3.active) { |
148 | TriggerNote *trig = &pat->ch3.notes[step_counter]; | 153 | TriggerNote *trig = &pat->ch3.notes[step_counter]; |
149 | ChannelWaveParams *params = &pat->ch3.params[step_counter]; | 154 | ChannelWaveParams *params = &pat->ch3.params[step_counter]; |
150 | if (trig->active) { | 155 | if (trig->active && should_play(params->prob)) { |
151 | switch (params->wave_mode) { | 156 | switch (params->wave_mode) { |
152 | case 0: { | 157 | case 0: { |
153 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); | 158 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); |
@@ -195,7 +200,7 @@ play_step(void) { | |||
195 | if (pat->ch4.active) { | 200 | if (pat->ch4.active) { |
196 | TriggerNote *trig = &pat->ch4.notes[step_counter]; | 201 | TriggerNote *trig = &pat->ch4.notes[step_counter]; |
197 | ChannelNoiseParams *params = &pat->ch4.params[step_counter]; | 202 | ChannelNoiseParams *params = &pat->ch4.params[step_counter]; |
198 | if (trig->active) { | 203 | if (trig->active && should_play(params->prob)) { |
199 | static const u8 div_freq[] = { | 204 | static const u8 div_freq[] = { |
200 | 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4, | 205 | 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4, |
201 | 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4, | 206 | 7, 6, 5, 4, 7, 6, 5, 4, 7, 6, 5, 4, |
@@ -778,7 +783,7 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler | |||
778 | } | 783 | } |
779 | } break; | 784 | } break; |
780 | case 3: { params->env_direction ^= 1; } break; | 785 | case 3: { params->env_direction ^= 1; } break; |
781 | case 4: { /* TODO: probability */ } break; | 786 | case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; |
782 | case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break; | 787 | case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break; |
783 | case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break; | 788 | case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break; |
784 | case 7: { params->sweep_direction ^= 1; } break; | 789 | case 7: { params->sweep_direction ^= 1; } break; |
@@ -843,7 +848,7 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler | |||
843 | } | 848 | } |
844 | } break; | 849 | } break; |
845 | case 3: { params->env_direction ^= 1; } break; | 850 | case 3: { params->env_direction ^= 1; } break; |
846 | case 4: { /* TODO: probability */ } break; | 851 | case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; |
847 | } | 852 | } |
848 | redraw_params = true; | 853 | redraw_params = true; |
849 | return true; | 854 | return true; |
@@ -907,7 +912,7 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) | |||
907 | case 1: { params->phase_a = CLAMP(params->phase_a + inc, 0, WAVE_VARS - 1); } break; | 912 | case 1: { params->phase_a = CLAMP(params->phase_a + inc, 0, WAVE_VARS - 1); } break; |
908 | case 2: { params->shape_b = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break; | 913 | case 2: { params->shape_b = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break; |
909 | case 3: { params->phase_b = CLAMP(params->phase_b + inc, 0, WAVE_VARS - 1); } break; | 914 | case 3: { params->phase_b = CLAMP(params->phase_b + inc, 0, WAVE_VARS - 1); } break; |
910 | case 4: { /* TODO: probability */ } break; | 915 | case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; |
911 | case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; | 916 | case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; |
912 | case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; | 917 | case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; |
913 | } | 918 | } |
@@ -971,7 +976,7 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle | |||
971 | } | 976 | } |
972 | } break; | 977 | } break; |
973 | case 3: { params->env_direction ^= 1; } break; | 978 | case 3: { params->env_direction ^= 1; } break; |
974 | case 4: { /* TODO: probability */ } break; | 979 | case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; |
975 | } | 980 | } |
976 | redraw_params = true; | 981 | redraw_params = true; |
977 | return true; | 982 | return true; |