aboutsummaryrefslogtreecommitdiffstats
path: root/src/sequencer.c
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 /src/sequencer.c
parentbf2c48deb075133ca063c4f64099b159ff9422f6 (diff)
downloadstepper-ea2c7552dd414422bfe23117dc8440f4183611c7.tar.gz
stepper-ea2c7552dd414422bfe23117dc8440f4183611c7.zip
Add per-trig panning support
Diffstat (limited to 'src/sequencer.c')
-rw-r--r--src/sequencer.c87
1 files changed, 82 insertions, 5 deletions
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;