diff options
author | Bad Diode <bd@badd10de.dev> | 2023-07-29 20:56:09 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-07-29 20:56:09 +0200 |
commit | ea2c7552dd414422bfe23117dc8440f4183611c7 (patch) | |
tree | 033c289efaddd9ea24fd5b8470e60dd986340ebd | |
parent | bf2c48deb075133ca063c4f64099b159ff9422f6 (diff) | |
download | stepper-ea2c7552dd414422bfe23117dc8440f4183611c7.tar.gz stepper-ea2c7552dd414422bfe23117dc8440f4183611c7.zip |
Add per-trig panning support
-rw-r--r-- | src/drawing.c | 72 | ||||
-rw-r--r-- | src/gba/gba.h | 17 | ||||
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/sequencer.c | 87 |
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 | ||
728 | void | ||
729 | draw_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 | |||
713 | IWRAM_CODE | 755 | IWRAM_CODE |
714 | void | 756 | void |
715 | draw_parameters_wave(ChannelWaveParams *params, bool global) { | 757 | draw_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 | ||
1201 | void | 1253 | void |
1254 | draw_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 | |||
1263 | void | ||
1202 | draw_notif_param_env_vol(u8 vol, u8 x, u8 y, u8 color) { | 1264 | draw_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 | ||
527 | inline u16 dmg_stereo_vol(u8 vol) { | ||
528 | return vol | (vol << 0x4); | ||
529 | } | ||
530 | |||
531 | inline u16 | ||
532 | channel_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 |
@@ -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 | ||
137 | void | 139 | void |
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 | ||
99 | void | 99 | void |
100 | play_step(void) { | 100 | play_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; |