aboutsummaryrefslogtreecommitdiffstats
path: root/src/sequencer.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-07-31 17:07:01 +0200
committerBad Diode <bd@badd10de.dev>2023-07-31 17:07:01 +0200
commit6a5d29a1300f11a755329e8e4d28d23d05651714 (patch)
tree47e2bf78975ecbbab6bb9d2395abbd65093bc2e0 /src/sequencer.c
parentea2c7552dd414422bfe23117dc8440f4183611c7 (diff)
downloadstepper-6a5d29a1300f11a755329e8e4d28d23d05651714.tar.gz
stepper-6a5d29a1300f11a755329e8e4d28d23d05651714.zip
Add minor bugfixes
Diffstat (limited to 'src/sequencer.c')
-rw-r--r--src/sequencer.c91
1 files changed, 59 insertions, 32 deletions
diff --git a/src/sequencer.c b/src/sequencer.c
index a3bdf3f..7f07845 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -98,7 +98,6 @@ should_play(u8 prob) {
98 98
99void 99void
100play_step(void) { 100play_step(void) {
101 bool update_sound = false;
102 static s8 pan[4] = {0}; 101 static s8 pan[4] = {0};
103 Pattern *pat = &patterns[current_pattern]; 102 Pattern *pat = &patterns[current_pattern];
104 if (current_pattern != next_pattern && step_counter == 15) { 103 if (current_pattern != next_pattern && step_counter == 15) {
@@ -129,6 +128,12 @@ play_step(void) {
129 | SOUND_SWEEP_DIR(params->sweep_direction) 128 | SOUND_SWEEP_DIR(params->sweep_direction)
130 | SOUND_SWEEP_TIME(params->sweep_time); 129 | SOUND_SWEEP_TIME(params->sweep_time);
131 } 130 }
131 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET;
132 SOUND_SQUARE1_CTRL = 0;
133 asm("nop"); asm("nop");
134 asm("nop"); asm("nop");
135 asm("nop"); asm("nop");
136 asm("nop"); asm("nop");
132 SOUND_SQUARE1_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) 137 SOUND_SQUARE1_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)
@@ -146,20 +151,27 @@ play_step(void) {
146 asm("nop"); asm("nop"); 151 asm("nop"); asm("nop");
147 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; 152 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note];
148 } 153 }
149 if (pan[0] != params->pan) {
150 update_sound = true;
151 }
152 pan[0] = params->pan; 154 pan[0] = params->pan;
153 } 155 }
154 } else { 156 } else {
155 SOUND_SQUARE1_SWEEP = 0; 157 SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1);
156 SOUND_SQUARE1_FREQ = 0; 158 asm("nop"); asm("nop");
159 asm("nop"); asm("nop");
160 asm("nop"); asm("nop");
161 asm("nop"); asm("nop");
162 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET;
157 SOUND_SQUARE1_CTRL = 0; 163 SOUND_SQUARE1_CTRL = 0;
158 } 164 }
159 if (pat->ch2.active) { 165 if (pat->ch2.active) {
160 TriggerNote *trig = &pat->ch2.notes[step_counter]; 166 TriggerNote *trig = &pat->ch2.notes[step_counter];
161 ChannelSquareParams *params = &pat->ch2.params[step_counter]; 167 ChannelSquareParams *params = &pat->ch2.params[step_counter];
162 if (trig->active && should_play(params->prob)) { 168 if (trig->active && should_play(params->prob)) {
169 SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET;
170 SOUND_SQUARE2_CTRL = 0;
171 asm("nop"); asm("nop");
172 asm("nop"); asm("nop");
173 asm("nop"); asm("nop");
174 asm("nop"); asm("nop");
163 SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) 175 SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume)
164 | SOUND_SQUARE_ENV_TIME(params->env_time) 176 | SOUND_SQUARE_ENV_TIME(params->env_time)
165 | SOUND_SQUARE_ENV_DIR(params->env_direction) 177 | SOUND_SQUARE_ENV_DIR(params->env_direction)
@@ -170,13 +182,10 @@ play_step(void) {
170 | SOUND_SQUARE_ENV_TIME(params->env_time) 182 | SOUND_SQUARE_ENV_TIME(params->env_time)
171 | SOUND_SQUARE_ENV_DIR(params->env_direction) 183 | SOUND_SQUARE_ENV_DIR(params->env_direction)
172 | SOUND_SQUARE_DUTY(params->duty_cycle); 184 | SOUND_SQUARE_DUTY(params->duty_cycle);
173 if (pan[1] != params->pan) {
174 update_sound = true;
175 }
176 pan[1] = params->pan; 185 pan[1] = params->pan;
177 } 186 }
178 } else { 187 } else {
179 SOUND_SQUARE2_FREQ = 0; 188 SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET;
180 SOUND_SQUARE2_CTRL = 0; 189 SOUND_SQUARE2_CTRL = 0;
181 } 190 }
182 if (pat->ch3.active) { 191 if (pat->ch3.active) {
@@ -216,19 +225,16 @@ play_step(void) {
216 case 3: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_75; } break; 225 case 3: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_75; } break;
217 case 4: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_100; } break; 226 case 4: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_100; } break;
218 } 227 }
219 if (pan[2] != params->pan) {
220 update_sound = true;
221 }
222 pan[2] = params->pan; 228 pan[2] = params->pan;
223 } else { 229 } else {
224 // NOTE: Maybe in the future we want an AD, but for now this is 230 // NOTE: Maybe in the future we want an AD, but for now this is
225 // probably better than holding the notes. Or perhaps add a hold 231 // probably better than holding the notes. Or perhaps add a hold
226 // mode? 232 // mode?
227 SOUND_WAVE_FREQ = 0; 233 SOUND_WAVE_FREQ = SOUND_FREQ_RESET;
228 SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; 234 SOUND_WAVE_CTRL = SOUND_WAVE_MUTE;
229 } 235 }
230 } else { 236 } else {
231 SOUND_WAVE_FREQ = 0; 237 SOUND_WAVE_FREQ = SOUND_FREQ_RESET;
232 SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; 238 SOUND_WAVE_CTRL = SOUND_WAVE_MUTE;
233 } 239 }
234 if (pat->ch4.active) { 240 if (pat->ch4.active) {
@@ -263,12 +269,9 @@ play_step(void) {
263 | SOUND_NOISE_ENV_TIME(params->env_time) 269 | SOUND_NOISE_ENV_TIME(params->env_time)
264 | SOUND_NOISE_ENV_DIR(params->env_direction); 270 | SOUND_NOISE_ENV_DIR(params->env_direction);
265 } 271 }
266 if (pan[3] != params->pan) {
267 update_sound = true;
268 }
269 pan[3] = params->pan; 272 pan[3] = params->pan;
270 } else { 273 } else {
271 SOUND_NOISE_FREQ = 0; 274 SOUND_NOISE_FREQ = SOUND_FREQ_RESET;
272 SOUND_NOISE_CTRL = 0; 275 SOUND_NOISE_CTRL = 0;
273 } 276 }
274 277
@@ -294,13 +297,11 @@ play_step(void) {
294 case SYNC_OUT_AUDIO_8: 297 case SYNC_OUT_AUDIO_8:
295 case SYNC_OUT_AUDIO_16: break; 298 case SYNC_OUT_AUDIO_16: break;
296 default: { 299 default: {
297 if (update_sound) { 300 SOUND_DMG_MASTER = dmg_stereo_vol(3)
298 SOUND_DMG_MASTER = dmg_stereo_vol(3) 301 | channel_vol(SOUND_SQUARE1, pan[0])
299 | channel_vol(SOUND_SQUARE1, pan[0]) 302 | channel_vol(SOUND_SQUARE2, pan[1])
300 | channel_vol(SOUND_SQUARE2, pan[1]) 303 | channel_vol(SOUND_WAVE, pan[2])
301 | channel_vol(SOUND_WAVE, pan[2]) 304 | channel_vol(SOUND_NOISE, pan[3]);
302 | channel_vol(SOUND_NOISE, pan[3]);
303 }
304 } break; 305 } break;
305 } 306 }
306 if (step_counter == 15) { 307 if (step_counter == 15) {
@@ -436,7 +437,15 @@ void
436stop_sound(void) { 437stop_sound(void) {
437 play_status = 0; 438 play_status = 0;
438 TIMER_CTRL_2 = 0; 439 TIMER_CTRL_2 = 0;
439 SOUND_SQUARE1_CTRL = 0; 440 SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1);
441 asm("nop"); asm("nop");
442 asm("nop"); asm("nop");
443 asm("nop"); asm("nop");
444 asm("nop"); asm("nop");
445 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET;
446 SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET;
447 SOUND_WAVE_FREQ = SOUND_FREQ_RESET;
448 SOUND_NOISE_FREQ = SOUND_FREQ_RESET;
440 SOUND_SQUARE2_CTRL = 0; 449 SOUND_SQUARE2_CTRL = 0;
441 SOUND_WAVE_CTRL = 0; 450 SOUND_WAVE_CTRL = 0;
442 SOUND_NOISE_CTRL = 0; 451 SOUND_NOISE_CTRL = 0;
@@ -466,12 +475,21 @@ toggle_playing(void) {
466 next_pattern = chain.chain[chain.current]; 475 next_pattern = chain.chain[chain.current];
467 current_pattern = next_pattern; 476 current_pattern = next_pattern;
468 } 477 }
469 redraw_pattern_buttons = true; 478 SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1);
479 asm("nop"); asm("nop");
480 asm("nop"); asm("nop");
481 asm("nop"); asm("nop");
482 asm("nop"); asm("nop");
483 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET;
484 SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET;
485 SOUND_WAVE_FREQ = SOUND_FREQ_RESET;
486 SOUND_NOISE_FREQ = SOUND_FREQ_RESET;
470 SOUND_SQUARE1_CTRL = 0; 487 SOUND_SQUARE1_CTRL = 0;
471 SOUND_SQUARE2_CTRL = 0; 488 SOUND_SQUARE2_CTRL = 0;
472 SOUND_WAVE_CTRL = 0; 489 SOUND_WAVE_CTRL = 0;
473 SOUND_NOISE_CTRL = 0; 490 SOUND_NOISE_CTRL = 0;
474 redraw_play_pause = true; 491 redraw_play_pause = true;
492 redraw_pattern_buttons = true;
475 if (settings.sync == SYNC_IN_LINK) { 493 if (settings.sync == SYNC_IN_LINK) {
476 return; 494 return;
477 } 495 }
@@ -491,6 +509,15 @@ toggle_playing(void) {
491void 509void
492pause_playing(void) { 510pause_playing(void) {
493 play_status ^= 1; 511 play_status ^= 1;
512 SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1);
513 asm("nop"); asm("nop");
514 asm("nop"); asm("nop");
515 asm("nop"); asm("nop");
516 asm("nop"); asm("nop");
517 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET;
518 SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET;
519 SOUND_WAVE_FREQ = SOUND_FREQ_RESET;
520 SOUND_NOISE_FREQ = SOUND_FREQ_RESET;
494 SOUND_SQUARE1_CTRL = 0; 521 SOUND_SQUARE1_CTRL = 0;
495 SOUND_SQUARE2_CTRL = 0; 522 SOUND_SQUARE2_CTRL = 0;
496 SOUND_WAVE_CTRL = 0; 523 SOUND_WAVE_CTRL = 0;
@@ -853,7 +880,7 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler
853 } 880 }
854 } break; 881 } break;
855 case 3: { params->env_direction ^= 1; } break; 882 case 3: { params->env_direction ^= 1; } break;
856 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; 883 case 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break;
857 case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break; 884 case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break;
858 case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break; 885 case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break;
859 case 7: { params->sweep_direction ^= 1; } break; 886 case 7: { params->sweep_direction ^= 1; } break;
@@ -929,7 +956,7 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler
929 } 956 }
930 } break; 957 } break;
931 case 3: { params->env_direction ^= 1; } break; 958 case 3: { params->env_direction ^= 1; } break;
932 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; 959 case 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break;
933 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; 960 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break;
934 } 961 }
935 redraw_params = true; 962 redraw_params = true;
@@ -1002,7 +1029,7 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler)
1002 case 1: { params->type_a = CLAMP(params->type_a + inc, 0, WAVE_VARS - 1); } break; 1029 case 1: { params->type_a = CLAMP(params->type_a + inc, 0, WAVE_VARS - 1); } break;
1003 case 2: { params->shape_b = CLAMP(params->shape_b + inc, 0, WAVE_MAX - 1); } break; 1030 case 2: { params->shape_b = CLAMP(params->shape_b + inc, 0, WAVE_MAX - 1); } break;
1004 case 3: { params->type_b = CLAMP(params->type_b + inc, 0, WAVE_VARS - 1); } break; 1031 case 3: { params->type_b = CLAMP(params->type_b + inc, 0, WAVE_VARS - 1); } break;
1005 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; 1032 case 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break;
1006 case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; 1033 case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break;
1007 case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; 1034 case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break;
1008 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; 1035 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break;
@@ -1077,7 +1104,7 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle
1077 } 1104 }
1078 } break; 1105 } break;
1079 case 3: { params->env_direction ^= 1; } break; 1106 case 3: { params->env_direction ^= 1; } break;
1080 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; 1107 case 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break;
1081 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; 1108 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break;
1082 } 1109 }
1083 redraw_params = true; 1110 redraw_params = true;