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 /src/sequencer.c | |
parent | bac16fa2662f61cfa3b56111649685b4eb397442 (diff) | |
download | stepper-2c4b3648075cc5faa24b859685426b208ccb3a80.tar.gz stepper-2c4b3648075cc5faa24b859685426b208ccb3a80.zip |
Add probability handling and drawing
Diffstat (limited to 'src/sequencer.c')
-rw-r--r-- | src/sequencer.c | 21 |
1 files changed, 13 insertions, 8 deletions
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; |