diff options
author | Bad Diode <bd@badd10de.dev> | 2023-07-31 17:07:01 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-07-31 17:07:01 +0200 |
commit | 6a5d29a1300f11a755329e8e4d28d23d05651714 (patch) | |
tree | 47e2bf78975ecbbab6bb9d2395abbd65093bc2e0 | |
parent | ea2c7552dd414422bfe23117dc8440f4183611c7 (diff) | |
download | stepper-6a5d29a1300f11a755329e8e4d28d23d05651714.tar.gz stepper-6a5d29a1300f11a755329e8e4d28d23d05651714.zip |
Add minor bugfixes
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | src/main.c | 1 | ||||
-rw-r--r-- | src/sequencer.c | 91 | ||||
-rw-r--r-- | src/settings.h | 6 |
4 files changed, 65 insertions, 37 deletions
@@ -27,7 +27,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS)) | |||
27 | INC_FLAGS += -I$(LIBGBA_SRC) | 27 | INC_FLAGS += -I$(LIBGBA_SRC) |
28 | 28 | ||
29 | # Output library names and executables. | 29 | # Output library names and executables. |
30 | TARGET := STEPPER-v1.6-dev | 30 | TARGET := STEPPER-v1.6-dev-v3 |
31 | ELF := $(BUILD_DIR)/$(TARGET).elf | 31 | ELF := $(BUILD_DIR)/$(TARGET).elf |
32 | BIN := $(BUILD_DIR)/$(TARGET).gba | 32 | BIN := $(BUILD_DIR)/$(TARGET).gba |
33 | 33 | ||
@@ -82,7 +82,7 @@ run: main | |||
82 | mgba-qt $(BIN) | 82 | mgba-qt $(BIN) |
83 | 83 | ||
84 | deploy: | 84 | deploy: |
85 | mount /dev/sdf1 /mnt | 85 | mount /dev/sdg1 /mnt |
86 | cp $(BIN) /mnt | 86 | cp $(BIN) /mnt |
87 | umount /mnt | 87 | umount /mnt |
88 | 88 | ||
@@ -176,6 +176,7 @@ update(void) { | |||
176 | if (notif.time > 0) { | 176 | if (notif.time > 0) { |
177 | notif.time--; | 177 | notif.time--; |
178 | } | 178 | } |
179 | rng_state++; | ||
179 | } | 180 | } |
180 | 181 | ||
181 | int | 182 | int |
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 | ||
99 | void | 99 | void |
100 | play_step(void) { | 100 | play_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 | |||
436 | stop_sound(void) { | 437 | stop_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) { | |||
491 | void | 509 | void |
492 | pause_playing(void) { | 510 | pause_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; |
diff --git a/src/settings.h b/src/settings.h index c3e035e..332e6fd 100644 --- a/src/settings.h +++ b/src/settings.h | |||
@@ -52,14 +52,14 @@ char * theme_setting_str[] = { | |||
52 | }; | 52 | }; |
53 | 53 | ||
54 | typedef enum CursorSetting { | 54 | typedef enum CursorSetting { |
55 | CURSOR_LINE = 0, | 55 | CURSOR_THICK_LINE = 0, |
56 | CURSOR_THICK_LINE, | 56 | CURSOR_LINE, |
57 | CURSOR_NUM, | 57 | CURSOR_NUM, |
58 | } CursorSetting; | 58 | } CursorSetting; |
59 | 59 | ||
60 | char * cursor_setting_str[] = { | 60 | char * cursor_setting_str[] = { |
61 | "LINE", | ||
62 | "THICK LINE", | 61 | "THICK LINE", |
62 | "LINE", | ||
63 | }; | 63 | }; |
64 | 64 | ||
65 | typedef enum HelpSetting { | 65 | typedef enum HelpSetting { |