aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-07-29 20:56:09 +0200
committerBad Diode <bd@badd10de.dev>2023-07-29 20:56:09 +0200
commitea2c7552dd414422bfe23117dc8440f4183611c7 (patch)
tree033c289efaddd9ea24fd5b8470e60dd986340ebd
parentbf2c48deb075133ca063c4f64099b159ff9422f6 (diff)
downloadstepper-ea2c7552dd414422bfe23117dc8440f4183611c7.tar.gz
stepper-ea2c7552dd414422bfe23117dc8440f4183611c7.zip
Add per-trig panning support
-rw-r--r--src/drawing.c72
-rw-r--r--src/gba/gba.h17
-rw-r--r--src/main.c4
-rw-r--r--src/sequencer.c87
4 files changed, 171 insertions, 9 deletions
diff --git a/src/drawing.c b/src/drawing.c
index a48a1ea..3ed294e 100644
--- a/src/drawing.c
+++ b/src/drawing.c
@@ -515,6 +515,11 @@ draw_params_cursor_wave(size_t i, u8 clr) {
515 y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; 515 y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y;
516 txt_drawf_small("vol", x, y, COL_BG); 516 txt_drawf_small("vol", x, y, COL_BG);
517 } break; 517 } break;
518 case 9: {
519 x += 8 + PARAMS_BOX_OFFSET_X * 4;
520 y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y;
521 txt_drawf_small("pan", x, y, COL_BG);
522 } break;
518 default: break; 523 default: break;
519 } 524 }
520 } 525 }
@@ -563,6 +568,11 @@ draw_params_cursor_noise(size_t i, u8 clr) {
563 y += PARAMS_BOX_H - 7; 568 y += PARAMS_BOX_H - 7;
564 txt_drawf_small("prob", x, y, COL_BG); 569 txt_drawf_small("prob", x, y, COL_BG);
565 } break; 570 } break;
571 case 9: {
572 x += 8 + PARAMS_BOX_OFFSET_X * 4;
573 y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y;
574 txt_drawf_small("pan", x, y, COL_BG);
575 } break;
566 default: break; 576 default: break;
567 } 577 }
568 } 578 }
@@ -626,6 +636,11 @@ draw_params_cursor_square(size_t i, u8 clr) {
626 y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y; 636 y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y;
627 txt_drawf_small("dir", x, y, COL_BG); 637 txt_drawf_small("dir", x, y, COL_BG);
628 } break; 638 } break;
639 case 9: {
640 x += 8 + PARAMS_BOX_OFFSET_X * 4;
641 y += PARAMS_BOX_H - 7 + PARAMS_BOX_OFFSET_Y;
642 txt_drawf_small("pan", x, y, COL_BG);
643 } break;
629 default: break; 644 default: break;
630 } 645 }
631 } 646 }
@@ -710,6 +725,33 @@ draw_prob(u8 prob, u8 clr) {
710 } 725 }
711} 726}
712 727
728void
729draw_panning(s8 pan, u8 clr) {
730 switch (settings.sync) {
731 case SYNC_OUT_LINK_AUDIO_4:
732 case SYNC_OUT_LINK_AUDIO_8:
733 case SYNC_OUT_LINK_AUDIO_16:
734 case SYNC_OUT_AUDIO_4:
735 case SYNC_OUT_AUDIO_8:
736 case SYNC_OUT_AUDIO_16: { clr = COL_OFF; } break;
737 default: break;
738 }
739 size_t x = PARAMS_START_X + PARAMS_BOX_OFFSET_X * 4 + 3;
740 size_t y = PARAMS_START_Y + PARAMS_BOX_OFFSET_Y + 5;
741 switch (pan) {
742 case -1: {
743 txt_drawf("L", x + 9, y, clr);
744 } break;
745 case 0: {
746 txt_drawf("MID", x + 3, y, clr);
747 } break;
748 case 1: {
749 txt_drawf("R", x + 9, y, clr);
750 } break;
751 default: break;
752 }
753}
754
713IWRAM_CODE 755IWRAM_CODE
714void 756void
715draw_parameters_wave(ChannelWaveParams *params, bool global) { 757draw_parameters_wave(ChannelWaveParams *params, bool global) {
@@ -731,6 +773,9 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
731 // Trig probability. 773 // Trig probability.
732 draw_prob(params->prob, col_fg); 774 draw_prob(params->prob, col_fg);
733 775
776 // Trig pannning.
777 draw_panning(params->pan, col_fg);
778
734 // Mode selection. 779 // Mode selection.
735 { 780 {
736 size_t x = PARAMS_START_X; 781 size_t x = PARAMS_START_X;
@@ -782,13 +827,13 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
782 y += PARAMS_BOX_OFFSET_Y; 827 y += PARAMS_BOX_OFFSET_Y;
783 txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg); 828 txt_drawf_small("mode", x + 6 + PARAMS_BOX_OFFSET_X * 0, y + PARAMS_BOX_H - 7, col_fg);
784 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); 829 txt_drawf_small("vol", x + 8 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg);
830 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg);
785 } 831 }
786 832
787 // Empty spacers. 833 // Empty spacers.
788 { 834 {
789 draw_param_stub(7, COL_OFF); 835 draw_param_stub(7, COL_OFF);
790 draw_param_stub(8, COL_OFF); 836 draw_param_stub(8, COL_OFF);
791 draw_param_stub(9, COL_OFF);
792 } 837 }
793} 838}
794 839
@@ -877,6 +922,9 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
877 // Trig probability. 922 // Trig probability.
878 draw_prob(params->prob, col_fg); 923 draw_prob(params->prob, col_fg);
879 924
925 // Trig pannning.
926 draw_panning(params->pan, col_fg);
927
880 // Sweep. 928 // Sweep.
881 if (sweep) { 929 if (sweep) {
882 size_t x = PARAMS_START_X; 930 size_t x = PARAMS_START_X;
@@ -942,6 +990,7 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
942 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg); 990 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 1, y + PARAMS_BOX_H - 7, col_fg);
943 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); 991 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg);
944 } 992 }
993 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg);
945 } 994 }
946 995
947 // Empty spacers. 996 // Empty spacers.
@@ -952,7 +1001,6 @@ draw_parameters_square(ChannelSquareParams *params, bool sweep, bool global) {
952 draw_param_stub(7, COL_OFF); 1001 draw_param_stub(7, COL_OFF);
953 } 1002 }
954 draw_param_stub(8, COL_OFF); 1003 draw_param_stub(8, COL_OFF);
955 draw_param_stub(9, COL_OFF);
956 } 1004 }
957} 1005}
958 1006
@@ -996,6 +1044,9 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
996 // Trig probability. 1044 // Trig probability.
997 draw_prob(params->prob, col_fg); 1045 draw_prob(params->prob, col_fg);
998 1046
1047 // Trig pannning.
1048 draw_panning(params->pan, col_fg);
1049
999 // Labels. 1050 // Labels.
1000 { 1051 {
1001 size_t x = PARAMS_START_X; 1052 size_t x = PARAMS_START_X;
@@ -1005,6 +1056,8 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
1005 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg); 1056 txt_drawf_small("time", x + 6 + PARAMS_BOX_OFFSET_X * 2, y + PARAMS_BOX_H - 7, col_fg);
1006 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg); 1057 txt_drawf_small("dir", x + 8 + PARAMS_BOX_OFFSET_X * 3, y + PARAMS_BOX_H - 7, col_fg);
1007 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg); 1058 txt_drawf_small("prob", x + 6 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg);
1059 y += PARAMS_BOX_OFFSET_Y;
1060 txt_drawf_small("pan", x + 8 + PARAMS_BOX_OFFSET_X * 4, y + PARAMS_BOX_H - 7, col_fg);
1008 } 1061 }
1009 1062
1010 // Empty spacers. 1063 // Empty spacers.
@@ -1013,7 +1066,6 @@ draw_parameters_noise(ChannelNoiseParams* params, bool global) {
1013 draw_param_stub(6, COL_OFF); 1066 draw_param_stub(6, COL_OFF);
1014 draw_param_stub(7, COL_OFF); 1067 draw_param_stub(7, COL_OFF);
1015 draw_param_stub(8, COL_OFF); 1068 draw_param_stub(8, COL_OFF);
1016 draw_param_stub(9, COL_OFF);
1017 } 1069 }
1018} 1070}
1019 1071
@@ -1199,6 +1251,16 @@ draw_notif_param_edit_prob(u8 prob, u8 x, u8 y, u8 color) {
1199} 1251}
1200 1252
1201void 1253void
1254draw_notif_param_edit_pan(s8 pan, u8 x, u8 y, u8 color) {
1255 txt_drawf_small("panning: ", x + 2, y + 1, color);
1256 switch (pan) {
1257 case -1: { txt_drawf_small("left", x + 2 + 9 * 4, y + 1, color); } break;
1258 case 0: { txt_drawf_small("middle", x + 2 + 9 * 4, y + 1, color); } break;
1259 case 1: { txt_drawf_small("right", x + 2 + 9 * 4, y + 1, color); } break;
1260 }
1261}
1262
1263void
1202draw_notif_param_env_vol(u8 vol, u8 x, u8 y, u8 color) { 1264draw_notif_param_env_vol(u8 vol, u8 x, u8 y, u8 color) {
1203 txt_drawf_small("VOL: ", x + 2, y + 1, color); 1265 txt_drawf_small("VOL: ", x + 2, y + 1, color);
1204 switch (vol) { 1266 switch (vol) {
@@ -1324,6 +1386,7 @@ draw_notif_bar() {
1324 case 1: { txt_drawf_small("down", x0 + 2 + 17 * 4, y0 + 1, color); } break; 1386 case 1: { txt_drawf_small("down", x0 + 2 + 17 * 4, y0 + 1, color); } break;
1325 } 1387 }
1326 } break; 1388 } break;
1389 case 9: { draw_notif_param_edit_pan(params->pan, x0, y0, color); } break;
1327 } 1390 }
1328 return; 1391 return;
1329 } 1392 }
@@ -1351,6 +1414,7 @@ draw_notif_bar() {
1351 case 2: { draw_notif_param_env_time(params->env_time, x0, y0, color); } break; 1414 case 2: { draw_notif_param_env_time(params->env_time, x0, y0, color); } break;
1352 case 3: { draw_notif_param_env_dir(params->env_direction, x0, y0, color); } break; 1415 case 3: { draw_notif_param_env_dir(params->env_direction, x0, y0, color); } break;
1353 case 4: { draw_notif_param_edit_prob(params->prob, x0, y0, color); } break; 1416 case 4: { draw_notif_param_edit_prob(params->prob, x0, y0, color); } break;
1417 case 9: { draw_notif_param_edit_pan(params->pan, x0, y0, color); } break;
1354 } 1418 }
1355 return; 1419 return;
1356 } 1420 }
@@ -1425,6 +1489,7 @@ draw_notif_bar() {
1425 case 4: { txt_drawf_small("100", x0 + 2 + 8 * 4, y0 + 1, color); txt_drawc_small('%', x0 + 2 + 11 * 4, y0 + 1, color); } break; 1489 case 4: { txt_drawf_small("100", x0 + 2 + 8 * 4, y0 + 1, color); txt_drawc_small('%', x0 + 2 + 11 * 4, y0 + 1, color); } break;
1426 } 1490 }
1427 } break; 1491 } break;
1492 case 9: { draw_notif_param_edit_pan(params->pan, x0, y0, color); } break;
1428 } 1493 }
1429 return; 1494 return;
1430 } 1495 }
@@ -1449,6 +1514,7 @@ draw_notif_bar() {
1449 case 2: { draw_notif_param_env_time(params->env_time, x0, y0, color); } break; 1514 case 2: { draw_notif_param_env_time(params->env_time, x0, y0, color); } break;
1450 case 3: { draw_notif_param_env_dir(params->env_direction, x0, y0, color); } break; 1515 case 3: { draw_notif_param_env_dir(params->env_direction, x0, y0, color); } break;
1451 case 4: { draw_notif_param_edit_prob(params->prob, x0, y0, color); } break; 1516 case 4: { draw_notif_param_edit_prob(params->prob, x0, y0, color); } break;
1517 case 9: { draw_notif_param_edit_pan(params->pan, x0, y0, color); } break;
1452 } 1518 }
1453 return; 1519 return;
1454 } 1520 }
diff --git a/src/gba/gba.h b/src/gba/gba.h
index 74b6942..8ba3de5 100644
--- a/src/gba/gba.h
+++ b/src/gba/gba.h
@@ -524,6 +524,23 @@ sound_volume(SoundChannel channels, u8 volume, u8 pan) {
524 return left | right; 524 return left | right;
525} 525}
526 526
527inline u16 dmg_stereo_vol(u8 vol) {
528 return vol | (vol << 0x4);
529}
530
531inline u16
532channel_vol(SoundChannel channel, s8 pan) {
533 u16 left = (channel << 0xc);
534 u16 right = (channel << 0x8);
535 if (pan == -1) {
536 return left;
537 }
538 if (pan == +1) {
539 return right;
540 }
541 return left | right;
542}
543
527// Sound Direct Sound master bits. 544// Sound Direct Sound master bits.
528#define SOUND_DMG25 0x0 545#define SOUND_DMG25 0x0
529#define SOUND_DMG50 0x1 546#define SOUND_DMG50 0x1
diff --git a/src/main.c b/src/main.c
index 28e5e6b..aa559c7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -17,7 +17,7 @@ WITH REGARD TO THIS SOFTWARE.
17// + Change cursor behaviour for new parameter pages 17// + Change cursor behaviour for new parameter pages
18// + Allow prob control (% based or 1:2, etc.) 18// + Allow prob control (% based or 1:2, etc.)
19// + Display notification when editing a parameter with the highest priority 19// + Display notification when editing a parameter with the highest priority
20// - Add panning support. 20// + Add panning support.
21// - Add custom user themes 21// - Add custom user themes
22// - Animations for cursor movement/current step highlight. (A fade out maybe?) 22// - Animations for cursor movement/current step highlight. (A fade out maybe?)
23// 23//
@@ -132,6 +132,8 @@ render(void) {
132 render_sequencer(); 132 render_sequencer();
133 } break; 133 } break;
134 } 134 }
135 // DEBUG: Ensuring the saved data don't exceed SRAM size (32k).
136 // txt_drawf("SIZE: %lu", 0, 0, COL_ACC_1, sizeof(Metadata) + sizeof(patterns) * 4 + sizeof(chain) * 4);
135} 137}
136 138
137void 139void
diff --git a/src/sequencer.c b/src/sequencer.c
index 1b9787f..a3bdf3f 100644
--- a/src/sequencer.c
+++ b/src/sequencer.c
@@ -98,6 +98,8 @@ 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 Pattern *pat = &patterns[current_pattern]; 103 Pattern *pat = &patterns[current_pattern];
102 if (current_pattern != next_pattern && step_counter == 15) { 104 if (current_pattern != next_pattern && step_counter == 15) {
103 current_pattern = next_pattern; 105 current_pattern = next_pattern;
@@ -144,6 +146,10 @@ play_step(void) {
144 asm("nop"); asm("nop"); 146 asm("nop"); asm("nop");
145 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; 147 SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note];
146 } 148 }
149 if (pan[0] != params->pan) {
150 update_sound = true;
151 }
152 pan[0] = params->pan;
147 } 153 }
148 } else { 154 } else {
149 SOUND_SQUARE1_SWEEP = 0; 155 SOUND_SQUARE1_SWEEP = 0;
@@ -164,6 +170,10 @@ play_step(void) {
164 | SOUND_SQUARE_ENV_TIME(params->env_time) 170 | SOUND_SQUARE_ENV_TIME(params->env_time)
165 | SOUND_SQUARE_ENV_DIR(params->env_direction) 171 | SOUND_SQUARE_ENV_DIR(params->env_direction)
166 | SOUND_SQUARE_DUTY(params->duty_cycle); 172 | SOUND_SQUARE_DUTY(params->duty_cycle);
173 if (pan[1] != params->pan) {
174 update_sound = true;
175 }
176 pan[1] = params->pan;
167 } 177 }
168 } else { 178 } else {
169 SOUND_SQUARE2_FREQ = 0; 179 SOUND_SQUARE2_FREQ = 0;
@@ -206,6 +216,10 @@ play_step(void) {
206 case 3: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_75; } break; 216 case 3: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_75; } break;
207 case 4: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_100; } break; 217 case 4: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_100; } break;
208 } 218 }
219 if (pan[2] != params->pan) {
220 update_sound = true;
221 }
222 pan[2] = params->pan;
209 } else { 223 } else {
210 // NOTE: Maybe in the future we want an AD, but for now this is 224 // NOTE: Maybe in the future we want an AD, but for now this is
211 // probably better than holding the notes. Or perhaps add a hold 225 // probably better than holding the notes. Or perhaps add a hold
@@ -249,6 +263,10 @@ play_step(void) {
249 | SOUND_NOISE_ENV_TIME(params->env_time) 263 | SOUND_NOISE_ENV_TIME(params->env_time)
250 | SOUND_NOISE_ENV_DIR(params->env_direction); 264 | SOUND_NOISE_ENV_DIR(params->env_direction);
251 } 265 }
266 if (pan[3] != params->pan) {
267 update_sound = true;
268 }
269 pan[3] = params->pan;
252 } else { 270 } else {
253 SOUND_NOISE_FREQ = 0; 271 SOUND_NOISE_FREQ = 0;
254 SOUND_NOISE_CTRL = 0; 272 SOUND_NOISE_CTRL = 0;
@@ -266,6 +284,25 @@ play_step(void) {
266 case SYNC_OUT_LINK_AUDIO_4: { if (step_counter % 4 == 0) { gate_on(); audio_sync_click = true; } } break; 284 case SYNC_OUT_LINK_AUDIO_4: { if (step_counter % 4 == 0) { gate_on(); audio_sync_click = true; } } break;
267 default: break; 285 default: break;
268 } 286 }
287
288 // Adjust per-channel panning.
289 switch (settings.sync) {
290 case SYNC_OUT_LINK_AUDIO_4:
291 case SYNC_OUT_LINK_AUDIO_8:
292 case SYNC_OUT_LINK_AUDIO_16:
293 case SYNC_OUT_AUDIO_4:
294 case SYNC_OUT_AUDIO_8:
295 case SYNC_OUT_AUDIO_16: break;
296 default: {
297 if (update_sound) {
298 SOUND_DMG_MASTER = dmg_stereo_vol(3)
299 | channel_vol(SOUND_SQUARE1, pan[0])
300 | channel_vol(SOUND_SQUARE2, pan[1])
301 | channel_vol(SOUND_WAVE, pan[2])
302 | channel_vol(SOUND_NOISE, pan[3]);
303 }
304 } break;
305 }
269 if (step_counter == 15) { 306 if (step_counter == 15) {
270 bar_counter++; 307 bar_counter++;
271 } 308 }
@@ -759,8 +796,10 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler
759 if (key_tap(KEY_RIGHT)) { 796 if (key_tap(KEY_RIGHT)) {
760 if (param_selection_loc == 4) { 797 if (param_selection_loc == 4) {
761 param_selection_loc = 0; 798 param_selection_loc = 0;
762 } else if (param_selection_loc == 7) { 799 } else if (param_selection_loc == 9) {
763 param_selection_loc = 5; 800 param_selection_loc = 5;
801 } else if (param_selection_loc == 7) {
802 param_selection_loc = 9;
764 } else if (param_selection_loc < 7) { 803 } else if (param_selection_loc < 7) {
765 param_selection_loc++; 804 param_selection_loc++;
766 } 805 }
@@ -768,6 +807,8 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler
768 if (param_selection_loc == 0) { 807 if (param_selection_loc == 0) {
769 param_selection_loc = 4; 808 param_selection_loc = 4;
770 } else if (param_selection_loc == 5) { 809 } else if (param_selection_loc == 5) {
810 param_selection_loc = 9;
811 } else if (param_selection_loc == 9) {
771 param_selection_loc = 7; 812 param_selection_loc = 7;
772 } else if (param_selection_loc > 0) { 813 } else if (param_selection_loc > 0) {
773 param_selection_loc--; 814 param_selection_loc--;
@@ -778,7 +819,11 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler
778 } 819 }
779 820
780 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { 821 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) {
781 if (param_selection_loc < 3) { 822 if (param_selection_loc == 4) {
823 param_selection_loc = 9;
824 } else if (param_selection_loc == 9) {
825 param_selection_loc = 4;
826 } else if (param_selection_loc < 3) {
782 param_selection_loc += 5; 827 param_selection_loc += 5;
783 } else if (param_selection_loc > 4) { 828 } else if (param_selection_loc > 4) {
784 param_selection_loc -= 5; 829 param_selection_loc -= 5;
@@ -812,6 +857,7 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler
812 case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break; 857 case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break;
813 case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break; 858 case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break;
814 case 7: { params->sweep_direction ^= 1; } break; 859 case 7: { params->sweep_direction ^= 1; } break;
860 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break;
815 } 861 }
816 redraw_params = true; 862 redraw_params = true;
817 return true; 863 return true;
@@ -844,7 +890,7 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler
844 param_selection_loc = 4; 890 param_selection_loc = 4;
845 } else if (param_selection_loc == 5) { 891 } else if (param_selection_loc == 5) {
846 param_selection_loc = 7; 892 param_selection_loc = 7;
847 } else if (param_selection_loc > 0) { 893 } else if (param_selection_loc > 0 && param_selection_loc != 9) {
848 param_selection_loc--; 894 param_selection_loc--;
849 } 895 }
850 } 896 }
@@ -852,6 +898,16 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler
852 return false; 898 return false;
853 } 899 }
854 900
901 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) {
902 if (param_selection_loc == 4) {
903 param_selection_loc = 9;
904 } else if (param_selection_loc == 9) {
905 param_selection_loc = 4;
906 }
907 redraw_params = true;
908 return false;
909 }
910
855 // Adjust parameter. 911 // Adjust parameter.
856 if (key_tap(KEY_R) || key_tap(KEY_L)) { 912 if (key_tap(KEY_R) || key_tap(KEY_L)) {
857 int inc; 913 int inc;
@@ -874,6 +930,7 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler
874 } break; 930 } break;
875 case 3: { params->env_direction ^= 1; } break; 931 case 3: { params->env_direction ^= 1; } break;
876 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; 932 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break;
933 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break;
877 } 934 }
878 redraw_params = true; 935 redraw_params = true;
879 return true; 936 return true;
@@ -897,6 +954,8 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler)
897 if (param_selection_loc == 4) { 954 if (param_selection_loc == 4) {
898 param_selection_loc = 0; 955 param_selection_loc = 0;
899 } else if (param_selection_loc == 6) { 956 } else if (param_selection_loc == 6) {
957 param_selection_loc = 9;
958 } else if (param_selection_loc == 9) {
900 param_selection_loc = 5; 959 param_selection_loc = 5;
901 } else if (param_selection_loc < 6) { 960 } else if (param_selection_loc < 6) {
902 param_selection_loc++; 961 param_selection_loc++;
@@ -905,6 +964,8 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler)
905 if (param_selection_loc == 0) { 964 if (param_selection_loc == 0) {
906 param_selection_loc = 4; 965 param_selection_loc = 4;
907 } else if (param_selection_loc == 5) { 966 } else if (param_selection_loc == 5) {
967 param_selection_loc = 9;
968 } else if (param_selection_loc == 9) {
908 param_selection_loc = 6; 969 param_selection_loc = 6;
909 } else if (param_selection_loc > 0) { 970 } else if (param_selection_loc > 0) {
910 param_selection_loc--; 971 param_selection_loc--;
@@ -915,7 +976,11 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler)
915 } 976 }
916 977
917 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { 978 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) {
918 if (param_selection_loc < 2) { 979 if (param_selection_loc == 4) {
980 param_selection_loc = 9;
981 } else if (param_selection_loc == 9) {
982 param_selection_loc = 4;
983 } else if (param_selection_loc < 2) {
919 param_selection_loc += 5; 984 param_selection_loc += 5;
920 } else if (param_selection_loc > 4) { 985 } else if (param_selection_loc > 4) {
921 param_selection_loc -= 5; 986 param_selection_loc -= 5;
@@ -940,6 +1005,7 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler)
940 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; 1005 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break;
941 case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; 1006 case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break;
942 case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; 1007 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;
943 } 1009 }
944 redraw_params = true; 1010 redraw_params = true;
945 return true; 1011 return true;
@@ -972,7 +1038,7 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle
972 param_selection_loc = 4; 1038 param_selection_loc = 4;
973 } else if (param_selection_loc == 5) { 1039 } else if (param_selection_loc == 5) {
974 param_selection_loc = 7; 1040 param_selection_loc = 7;
975 } else if (param_selection_loc > 0) { 1041 } else if (param_selection_loc > 0 && param_selection_loc != 9) {
976 param_selection_loc--; 1042 param_selection_loc--;
977 } 1043 }
978 } 1044 }
@@ -980,6 +1046,16 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle
980 return false; 1046 return false;
981 } 1047 }
982 1048
1049 if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) {
1050 if (param_selection_loc == 4) {
1051 param_selection_loc = 9;
1052 } else if (param_selection_loc == 9) {
1053 param_selection_loc = 4;
1054 }
1055 redraw_params = true;
1056 return false;
1057 }
1058
983 // Adjust parameter. 1059 // Adjust parameter.
984 if (key_tap(KEY_R) || key_tap(KEY_L)) { 1060 if (key_tap(KEY_R) || key_tap(KEY_L)) {
985 int inc; 1061 int inc;
@@ -1002,6 +1078,7 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle
1002 } break; 1078 } break;
1003 case 3: { params->env_direction ^= 1; } break; 1079 case 3: { params->env_direction ^= 1; } break;
1004 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; 1080 case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break;
1081 case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break;
1005 } 1082 }
1006 redraw_params = true; 1083 redraw_params = true;
1007 return true; 1084 return true;