diff options
author | Bad Diode <bd@badd10de.dev> | 2024-01-15 16:06:05 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2024-01-15 16:06:05 +0100 |
commit | f6efcdd98b32f1cd0d5a4a52abb333437c04b44f (patch) | |
tree | f4542a21ceb080af21b684250650368de7fc9e3e /src/sequencer.c | |
parent | 65089bc6ca9e31878afd583e133cb376ef03f268 (diff) | |
download | stepper-f6efcdd98b32f1cd0d5a4a52abb333437c04b44f.tar.gz stepper-f6efcdd98b32f1cd0d5a4a52abb333437c04b44f.zip |
[WIP] Add decay control and attack/decay params on ch3
Diffstat (limited to 'src/sequencer.c')
-rw-r--r-- | src/sequencer.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/src/sequencer.c b/src/sequencer.c index 01b8e95..8863d14 100644 --- a/src/sequencer.c +++ b/src/sequencer.c | |||
@@ -160,7 +160,7 @@ play_step(void) { | |||
160 | bool ch1_active = settings.global_mute ? !settings.mutes[0] : pat->ch1.active; | 160 | bool ch1_active = settings.global_mute ? !settings.mutes[0] : pat->ch1.active; |
161 | if (ch1_active && !pat->empty) { | 161 | if (ch1_active && !pat->empty) { |
162 | TriggerNote *trig = &pat->ch1.notes[step_counter]; | 162 | TriggerNote *trig = &pat->ch1.notes[step_counter]; |
163 | ChannelSquareParams *params = &pat->ch1.params[step_counter]; | 163 | ChannelSquare1Params *params = &pat->ch1.params[step_counter]; |
164 | if (trig->active && should_play(params->prob)) { | 164 | if (trig->active && should_play(params->prob)) { |
165 | if (params->sweep_time == 0) { | 165 | if (params->sweep_time == 0) { |
166 | SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); | 166 | SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); |
@@ -204,7 +204,7 @@ play_step(void) { | |||
204 | bool ch2_active = settings.global_mute ? !settings.mutes[1] : pat->ch2.active; | 204 | bool ch2_active = settings.global_mute ? !settings.mutes[1] : pat->ch2.active; |
205 | if (ch2_active && !pat->empty) { | 205 | if (ch2_active && !pat->empty) { |
206 | TriggerNote *trig = &pat->ch2.notes[step_counter]; | 206 | TriggerNote *trig = &pat->ch2.notes[step_counter]; |
207 | ChannelSquareParams *params = &pat->ch2.params[step_counter]; | 207 | ChannelSquare2Params *params = &pat->ch2.params[step_counter]; |
208 | if (trig->active && should_play(params->prob)) { | 208 | if (trig->active && should_play(params->prob)) { |
209 | SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) | 209 | SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) |
210 | | SOUND_SQUARE_ENV_TIME(params->env_time) | 210 | | SOUND_SQUARE_ENV_TIME(params->env_time) |
@@ -252,6 +252,8 @@ play_step(void) { | |||
252 | } break; | 252 | } break; |
253 | } | 253 | } |
254 | wave_env_ticks = 0; | 254 | wave_env_ticks = 0; |
255 | wave_env_attack = params->wave_attack; | ||
256 | wave_env_decay = params->wave_decay; | ||
255 | SOUND_WAVE_MODE |= SOUND_WAVE_ENABLE; | 257 | SOUND_WAVE_MODE |= SOUND_WAVE_ENABLE; |
256 | 258 | ||
257 | SOUND_WAVE_FREQ = SOUND_FREQ_RESET | 259 | SOUND_WAVE_FREQ = SOUND_FREQ_RESET |
@@ -1075,7 +1077,7 @@ handle_pattern_selection(void) { | |||
1075 | } | 1077 | } |
1076 | 1078 | ||
1077 | bool | 1079 | bool |
1078 | set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler) { | 1080 | set_param_selection_sq1(ChannelSquare1Params *params, InputHandler return_handler) { |
1079 | // Go back to trigger selection. | 1081 | // Go back to trigger selection. |
1080 | if (key_released(KEY_A)) { | 1082 | if (key_released(KEY_A)) { |
1081 | input_handler = return_handler; | 1083 | input_handler = return_handler; |
@@ -1159,7 +1161,7 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler | |||
1159 | } | 1161 | } |
1160 | 1162 | ||
1161 | bool | 1163 | bool |
1162 | set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler) { | 1164 | set_param_selection_sq2(ChannelSquare2Params *params, InputHandler return_handler) { |
1163 | // Go back to trigger selection. | 1165 | // Go back to trigger selection. |
1164 | if (key_released(KEY_A)) { | 1166 | if (key_released(KEY_A)) { |
1165 | input_handler = return_handler; | 1167 | input_handler = return_handler; |
@@ -1245,11 +1247,9 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) | |||
1245 | if (key_retrig(KEY_RIGHT)) { | 1247 | if (key_retrig(KEY_RIGHT)) { |
1246 | if (param_selection_loc == 4) { | 1248 | if (param_selection_loc == 4) { |
1247 | param_selection_loc = 0; | 1249 | param_selection_loc = 0; |
1248 | } else if (param_selection_loc == 6) { | ||
1249 | param_selection_loc = 9; | ||
1250 | } else if (param_selection_loc == 9) { | 1250 | } else if (param_selection_loc == 9) { |
1251 | param_selection_loc = 5; | 1251 | param_selection_loc = 5; |
1252 | } else if (param_selection_loc < 6) { | 1252 | } else { |
1253 | param_selection_loc++; | 1253 | param_selection_loc++; |
1254 | } | 1254 | } |
1255 | } else { | 1255 | } else { |
@@ -1257,9 +1257,7 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) | |||
1257 | param_selection_loc = 4; | 1257 | param_selection_loc = 4; |
1258 | } else if (param_selection_loc == 5) { | 1258 | } else if (param_selection_loc == 5) { |
1259 | param_selection_loc = 9; | 1259 | param_selection_loc = 9; |
1260 | } else if (param_selection_loc == 9) { | 1260 | } else { |
1261 | param_selection_loc = 6; | ||
1262 | } else if (param_selection_loc > 0) { | ||
1263 | param_selection_loc--; | 1261 | param_selection_loc--; |
1264 | } | 1262 | } |
1265 | } | 1263 | } |
@@ -1268,13 +1266,9 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) | |||
1268 | } | 1266 | } |
1269 | 1267 | ||
1270 | if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { | 1268 | if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { |
1271 | if (param_selection_loc == 4) { | 1269 | if (param_selection_loc < 5) { |
1272 | param_selection_loc = 9; | ||
1273 | } else if (param_selection_loc == 9) { | ||
1274 | param_selection_loc = 4; | ||
1275 | } else if (param_selection_loc < 2) { | ||
1276 | param_selection_loc += 5; | 1270 | param_selection_loc += 5; |
1277 | } else if (param_selection_loc > 4) { | 1271 | } else if (param_selection_loc >= 5) { |
1278 | param_selection_loc -= 5; | 1272 | param_selection_loc -= 5; |
1279 | } | 1273 | } |
1280 | redraw_params = true; | 1274 | redraw_params = true; |
@@ -1297,6 +1291,8 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) | |||
1297 | case 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break; | 1291 | case 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break; |
1298 | case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; | 1292 | case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; |
1299 | case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; | 1293 | case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; |
1294 | case 7: { params->wave_attack = CLAMP(params->wave_attack + inc, 0, 24); } break; | ||
1295 | case 8: { params->wave_decay = CLAMP(params->wave_decay + inc, 0, 24); } break; | ||
1300 | case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; | 1296 | case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; |
1301 | } | 1297 | } |
1302 | redraw_params = true; | 1298 | redraw_params = true; |
@@ -1475,6 +1471,12 @@ handle_param_selection_ch3() { | |||
1475 | case 6: { | 1471 | case 6: { |
1476 | pat->ch3.params[i].wave_volume = ch3_params.wave_volume; | 1472 | pat->ch3.params[i].wave_volume = ch3_params.wave_volume; |
1477 | } break; | 1473 | } break; |
1474 | case 7: { | ||
1475 | pat->ch3.params[i].wave_attack = ch3_params.wave_attack; | ||
1476 | } break; | ||
1477 | case 8: { | ||
1478 | pat->ch3.params[i].wave_decay = ch3_params.wave_decay; | ||
1479 | } break; | ||
1478 | case 9: { | 1480 | case 9: { |
1479 | pat->ch3.params[i].pan = ch3_params.pan; | 1481 | pat->ch3.params[i].pan = ch3_params.pan; |
1480 | } break; | 1482 | } break; |
@@ -1516,13 +1518,13 @@ handle_param_selection_ch4() { | |||
1516 | 1518 | ||
1517 | void | 1519 | void |
1518 | handle_param_selection_sq1() { | 1520 | handle_param_selection_sq1() { |
1519 | ChannelSquareParams *params = &patterns[pattern_selection_loc].ch1.params[trig_selection_loc]; | 1521 | ChannelSquare1Params *params = &patterns[pattern_selection_loc].ch1.params[trig_selection_loc]; |
1520 | set_param_selection_sq1(params, handle_trigger_selection); | 1522 | set_param_selection_sq1(params, handle_trigger_selection); |
1521 | } | 1523 | } |
1522 | 1524 | ||
1523 | void | 1525 | void |
1524 | handle_param_selection_sq2() { | 1526 | handle_param_selection_sq2() { |
1525 | ChannelSquareParams *params = &patterns[pattern_selection_loc].ch2.params[trig_selection_loc]; | 1527 | ChannelSquare2Params *params = &patterns[pattern_selection_loc].ch2.params[trig_selection_loc]; |
1526 | set_param_selection_sq2(params, handle_trigger_selection); | 1528 | set_param_selection_sq2(params, handle_trigger_selection); |
1527 | } | 1529 | } |
1528 | 1530 | ||
@@ -1543,7 +1545,7 @@ nudge_trigs(int cur_loc, int next_loc) { | |||
1543 | Pattern *pat = &patterns[pattern_selection_loc]; | 1545 | Pattern *pat = &patterns[pattern_selection_loc]; |
1544 | switch (channel_selection_loc) { | 1546 | switch (channel_selection_loc) { |
1545 | case 0: { | 1547 | case 0: { |
1546 | ChannelSquareParams cur_params = pat->ch1.params[cur_loc]; | 1548 | ChannelSquare1Params cur_params = pat->ch1.params[cur_loc]; |
1547 | TriggerNote cur_trig = pat->ch1.notes[cur_loc]; | 1549 | TriggerNote cur_trig = pat->ch1.notes[cur_loc]; |
1548 | pat->ch1.params[cur_loc] = pat->ch1.params[next_loc]; | 1550 | pat->ch1.params[cur_loc] = pat->ch1.params[next_loc]; |
1549 | pat->ch1.notes[cur_loc] = pat->ch1.notes[next_loc]; | 1551 | pat->ch1.notes[cur_loc] = pat->ch1.notes[next_loc]; |
@@ -1551,7 +1553,7 @@ nudge_trigs(int cur_loc, int next_loc) { | |||
1551 | pat->ch1.notes[next_loc] = cur_trig; | 1553 | pat->ch1.notes[next_loc] = cur_trig; |
1552 | } break; | 1554 | } break; |
1553 | case 1: { | 1555 | case 1: { |
1554 | ChannelSquareParams cur_params = pat->ch2.params[cur_loc]; | 1556 | ChannelSquare2Params cur_params = pat->ch2.params[cur_loc]; |
1555 | TriggerNote cur_trig = pat->ch2.notes[cur_loc]; | 1557 | TriggerNote cur_trig = pat->ch2.notes[cur_loc]; |
1556 | pat->ch2.params[cur_loc] = pat->ch2.params[next_loc]; | 1558 | pat->ch2.params[cur_loc] = pat->ch2.params[next_loc]; |
1557 | pat->ch2.notes[cur_loc] = pat->ch2.notes[next_loc]; | 1559 | pat->ch2.notes[cur_loc] = pat->ch2.notes[next_loc]; |