aboutsummaryrefslogtreecommitdiffstats
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
parentea2c7552dd414422bfe23117dc8440f4183611c7 (diff)
downloadstepper-6a5d29a1300f11a755329e8e4d28d23d05651714.tar.gz
stepper-6a5d29a1300f11a755329e8e4d28d23d05651714.zip
Add minor bugfixes
-rw-r--r--Makefile4
-rw-r--r--src/main.c1
-rw-r--r--src/sequencer.c91
-rw-r--r--src/settings.h6
4 files changed, 65 insertions, 37 deletions
diff --git a/Makefile b/Makefile
index dd719cb..149494f 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ INC_FLAGS := $(addprefix -I,$(INC_DIRS))
27INC_FLAGS += -I$(LIBGBA_SRC) 27INC_FLAGS += -I$(LIBGBA_SRC)
28 28
29# Output library names and executables. 29# Output library names and executables.
30TARGET := STEPPER-v1.6-dev 30TARGET := STEPPER-v1.6-dev-v3
31ELF := $(BUILD_DIR)/$(TARGET).elf 31ELF := $(BUILD_DIR)/$(TARGET).elf
32BIN := $(BUILD_DIR)/$(TARGET).gba 32BIN := $(BUILD_DIR)/$(TARGET).gba
33 33
@@ -82,7 +82,7 @@ run: main
82 mgba-qt $(BIN) 82 mgba-qt $(BIN)
83 83
84deploy: 84deploy:
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
diff --git a/src/main.c b/src/main.c
index aa559c7..a0832a2 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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
181int 182int
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;
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
54typedef enum CursorSetting { 54typedef 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
60char * cursor_setting_str[] = { 60char * cursor_setting_str[] = {
61 "LINE",
62 "THICK LINE", 61 "THICK LINE",
62 "LINE",
63}; 63};
64 64
65typedef enum HelpSetting { 65typedef enum HelpSetting {