aboutsummaryrefslogtreecommitdiffstats
path: root/src/sequencer.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-01-15 16:06:05 +0100
committerBad Diode <bd@badd10de.dev>2024-01-15 16:06:05 +0100
commitf6efcdd98b32f1cd0d5a4a52abb333437c04b44f (patch)
treef4542a21ceb080af21b684250650368de7fc9e3e /src/sequencer.c
parent65089bc6ca9e31878afd583e133cb376ef03f268 (diff)
downloadstepper-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.c42
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
1077bool 1079bool
1078set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler) { 1080set_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
1161bool 1163bool
1162set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler) { 1164set_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
1517void 1519void
1518handle_param_selection_sq1() { 1520handle_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
1523void 1525void
1524handle_param_selection_sq2() { 1526handle_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];