diff options
author | Bad Diode <bd@badd10de.dev> | 2023-07-22 08:09:22 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-07-22 08:09:22 +0200 |
commit | 24f49419af67365907c1f072cb159719ff93fdbd (patch) | |
tree | 1b1de622eaff8bd522bce3ed185d302726a465f2 /src/sequencer.c | |
parent | 804b7184744194dca5cab79726f31194b7f55b80 (diff) | |
download | stepper-24f49419af67365907c1f072cb159719ff93fdbd.tar.gz stepper-24f49419af67365907c1f072cb159719ff93fdbd.zip |
Change ch3 wave behaviour to be fixed
Diffstat (limited to 'src/sequencer.c')
-rw-r--r-- | src/sequencer.c | 187 |
1 files changed, 44 insertions, 143 deletions
diff --git a/src/sequencer.c b/src/sequencer.c index 7a3ccb4..04153aa 100644 --- a/src/sequencer.c +++ b/src/sequencer.c | |||
@@ -106,23 +106,18 @@ play_step(void) { | |||
106 | | SOUND_SQUARE_ENV_TIME(params->env_time) | 106 | | SOUND_SQUARE_ENV_TIME(params->env_time) |
107 | | SOUND_SQUARE_ENV_DIR(params->env_direction) | 107 | | SOUND_SQUARE_ENV_DIR(params->env_direction) |
108 | | SOUND_SQUARE_DUTY(params->duty_cycle); | 108 | | SOUND_SQUARE_DUTY(params->duty_cycle); |
109 | SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | 109 | SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; |
110 | | sound_rates[trig->note]; | 110 | SOUND_SQUARE1_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) |
111 | | SOUND_SQUARE_ENV_TIME(params->env_time) | ||
112 | | SOUND_SQUARE_ENV_DIR(params->env_direction) | ||
113 | | SOUND_SQUARE_DUTY(params->duty_cycle); | ||
111 | // Re-initialize the sound after 8 cycles if using sweeps. | 114 | // Re-initialize the sound after 8 cycles if using sweeps. |
112 | if (params->sweep_time != 0) { | 115 | if (params->sweep_time != 0) { |
113 | asm("nop"); asm("nop"); | 116 | asm("nop"); asm("nop"); |
114 | asm("nop"); asm("nop"); | 117 | asm("nop"); asm("nop"); |
115 | asm("nop"); asm("nop"); | 118 | asm("nop"); asm("nop"); |
116 | asm("nop"); asm("nop"); | 119 | asm("nop"); asm("nop"); |
117 | SOUND_SQUARE1_SWEEP = SOUND_SWEEP_NUMBER(params->sweep_number) | 120 | SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; |
118 | | SOUND_SWEEP_DIR(params->sweep_direction) | ||
119 | | SOUND_SWEEP_TIME(params->sweep_time); | ||
120 | SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | ||
121 | | sound_rates[trig->note]; | ||
122 | SOUND_SQUARE1_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) | ||
123 | | SOUND_SQUARE_ENV_TIME(params->env_time) | ||
124 | | SOUND_SQUARE_ENV_DIR(params->env_direction) | ||
125 | | SOUND_SQUARE_DUTY(params->duty_cycle); | ||
126 | } | 121 | } |
127 | } | 122 | } |
128 | } else { | 123 | } else { |
@@ -134,6 +129,10 @@ play_step(void) { | |||
134 | TriggerNote *trig = &pat->ch2.notes[step_counter]; | 129 | TriggerNote *trig = &pat->ch2.notes[step_counter]; |
135 | ChannelSquareParams *params = &pat->ch2.params[step_counter]; | 130 | ChannelSquareParams *params = &pat->ch2.params[step_counter]; |
136 | if (trig->active) { | 131 | if (trig->active) { |
132 | SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) | ||
133 | | SOUND_SQUARE_ENV_TIME(params->env_time) | ||
134 | | SOUND_SQUARE_ENV_DIR(params->env_direction) | ||
135 | | SOUND_SQUARE_DUTY(params->duty_cycle); | ||
137 | SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET | 136 | SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET |
138 | | sound_rates[trig->note]; | 137 | | sound_rates[trig->note]; |
139 | SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) | 138 | SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) |
@@ -149,25 +148,24 @@ play_step(void) { | |||
149 | TriggerNote *trig = &pat->ch3.notes[step_counter]; | 148 | TriggerNote *trig = &pat->ch3.notes[step_counter]; |
150 | ChannelWaveParams *params = &pat->ch3.params[step_counter]; | 149 | ChannelWaveParams *params = &pat->ch3.params[step_counter]; |
151 | if (trig->active) { | 150 | if (trig->active) { |
152 | // TODO: If we find an empty trigger stop the sound. | ||
153 | switch (params->wave_mode) { | 151 | switch (params->wave_mode) { |
154 | case 0: { | 152 | case 0: { |
155 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); | 153 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); |
156 | memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); | 154 | memcpy32(SOUND_WAVE_RAM, waves[params->shape_a][params->phase_a], 16); |
157 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) | 155 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) |
158 | | SOUND_WAVE_BANK_SELECT(0); | 156 | | SOUND_WAVE_BANK_SELECT(0); |
159 | } break; | 157 | } break; |
160 | case 1: { | 158 | case 1: { |
161 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); | 159 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); |
162 | memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); | 160 | memcpy32(SOUND_WAVE_RAM, waves[params->shape_b][params->phase_b], 16); |
163 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) | 161 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) |
164 | | SOUND_WAVE_BANK_SELECT(1); | 162 | | SOUND_WAVE_BANK_SELECT(1); |
165 | } break; | 163 | } break; |
166 | case 2: { | 164 | case 2: { |
167 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); | 165 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); |
168 | memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); | 166 | memcpy32(SOUND_WAVE_RAM, waves[params->shape_b][params->phase_b], 16); |
169 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); | 167 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); |
170 | memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); | 168 | memcpy32(SOUND_WAVE_RAM, waves[params->shape_a][params->phase_a], 16); |
171 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(1) | 169 | SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(1) |
172 | | SOUND_WAVE_BANK_SELECT(0); | 170 | | SOUND_WAVE_BANK_SELECT(0); |
173 | } break; | 171 | } break; |
@@ -214,6 +212,9 @@ play_step(void) { | |||
214 | 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | 212 | 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, |
215 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 213 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
216 | }; | 214 | }; |
215 | SOUND_NOISE_CTRL = SOUND_NOISE_ENV_VOL(params->env_volume) | ||
216 | | SOUND_NOISE_ENV_TIME(params->env_time) | ||
217 | | SOUND_NOISE_ENV_DIR(params->env_direction); | ||
217 | SOUND_NOISE_FREQ = SOUND_FREQ_RESET | 218 | SOUND_NOISE_FREQ = SOUND_FREQ_RESET |
218 | | SOUND_NOISE_PRESTEP_FREQ(pre_freq[trig->note]) | 219 | | SOUND_NOISE_PRESTEP_FREQ(pre_freq[trig->note]) |
219 | | SOUND_NOISE_DIV_FREQ(div_freq[trig->note]) | 220 | | SOUND_NOISE_DIV_FREQ(div_freq[trig->note]) |
@@ -862,153 +863,53 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) | |||
862 | 863 | ||
863 | // Cursor movement. | 864 | // Cursor movement. |
864 | if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { | 865 | if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { |
865 | int inc = 0; | ||
866 | int loc = param_selection_loc; | ||
867 | if (key_tap(KEY_RIGHT)) { | 866 | if (key_tap(KEY_RIGHT)) { |
868 | if (loc == 15 || loc == 31) { | 867 | if (param_selection_loc == 4) { |
869 | inc = 17; | 868 | param_selection_loc = 0; |
870 | } else if (loc == 47) { | 869 | } else if (param_selection_loc == 6) { |
871 | inc = 26; | 870 | param_selection_loc = 5; |
872 | } else if (loc == 63) { | 871 | } else if (param_selection_loc < 6) { |
873 | inc = 9; | 872 | param_selection_loc++; |
874 | } else if (loc != 47 && loc != 63 && loc < 72) { | ||
875 | inc = 1; | ||
876 | } | 873 | } |
877 | } else { | 874 | } else { |
878 | if (loc == 32 || loc == 48) { | 875 | if (param_selection_loc == 0) { |
879 | inc = -17; | 876 | param_selection_loc = 4; |
880 | } else if (loc == 73) { | 877 | } else if (param_selection_loc == 5) { |
881 | inc = -26; | 878 | param_selection_loc = 6; |
882 | } else if (loc != 16 && loc != 64) { | 879 | } else if (param_selection_loc > 0) { |
883 | inc = -1; | 880 | param_selection_loc--; |
884 | } | 881 | } |
885 | } | 882 | } |
886 | param_selection_loc = CLAMP(loc + inc, 0, 73); | ||
887 | redraw_params = true; | 883 | redraw_params = true; |
888 | return false; | 884 | return false; |
889 | } | 885 | } |
890 | 886 | ||
891 | if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { | 887 | if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { |
892 | int inc = 0; | 888 | if (param_selection_loc < 2) { |
893 | int loc = param_selection_loc; | 889 | param_selection_loc += 5; |
894 | if (key_tap(KEY_UP)) { | 890 | } else if (param_selection_loc > 4) { |
895 | if ((loc >= 16 && loc < 32) || (loc >= 48 && loc < 64)) { | 891 | param_selection_loc -= 5; |
896 | inc = -16; | ||
897 | } else if (loc == 64) { | ||
898 | inc = -48; | ||
899 | } else if (loc == 65) { | ||
900 | inc = -45; | ||
901 | } else if (loc == 66) { | ||
902 | inc = -42; | ||
903 | } else if (loc == 67) { | ||
904 | inc = -39; | ||
905 | } else if (loc == 68) { | ||
906 | inc = -20; | ||
907 | } else if (loc == 69) { | ||
908 | inc = -17; | ||
909 | } else if (loc == 70) { | ||
910 | inc = -14; | ||
911 | } else if (loc == 71) { | ||
912 | inc = -11; | ||
913 | } else if (loc == 72) { | ||
914 | inc = 1; | ||
915 | } else if (loc == 73) { | ||
916 | inc = -1; | ||
917 | } | ||
918 | } else { | ||
919 | if (loc < 16 || (loc >= 32 && loc < 48)) { | ||
920 | inc = 16; | ||
921 | } else if (loc >= 16 && loc <= 19) { | ||
922 | inc = 48 - (loc - 16); | ||
923 | } else if (loc >= 20 && loc <= 23) { | ||
924 | inc = 45 - (loc - 20); | ||
925 | } else if (loc >= 24 && loc <= 27) { | ||
926 | inc = 42 - (loc - 24); | ||
927 | } else if (loc >= 28 && loc <= 31) { | ||
928 | inc = 39 - (loc - 28); | ||
929 | } else if (loc >= 48 && loc <= 51) { | ||
930 | inc = 20 - (loc - 48); | ||
931 | } else if (loc >= 52 && loc <= 55) { | ||
932 | inc = 17 - (loc - 52); | ||
933 | } else if (loc >= 56 && loc <= 59) { | ||
934 | inc = 14 - (loc - 56); | ||
935 | } else if (loc >= 60 && loc <= 63) { | ||
936 | inc = 11 - (loc - 60); | ||
937 | } else if (loc == 72) { | ||
938 | inc = 1; | ||
939 | } else if (loc == 73) { | ||
940 | inc = -1; | ||
941 | } | ||
942 | } | 892 | } |
943 | param_selection_loc = CLAMP(loc + inc, 0, 73); | ||
944 | redraw_params = true; | 893 | redraw_params = true; |
945 | return false; | 894 | return false; |
946 | } | 895 | } |
947 | 896 | ||
948 | // Adjust parameter. | 897 | // Adjust parameter. |
949 | if (key_tap(KEY_R) || key_tap(KEY_L)) { | 898 | if (key_tap(KEY_R) || key_tap(KEY_L)) { |
950 | int odd = param_selection_loc & 0x1; | ||
951 | int inc; | 899 | int inc; |
952 | if (key_tap(KEY_R)) { | 900 | if (key_tap(KEY_L)) { |
953 | inc = 1; | ||
954 | } else { | ||
955 | inc = -1; | 901 | inc = -1; |
902 | } else { | ||
903 | inc = 1; | ||
956 | } | 904 | } |
957 | 905 | switch (param_selection_loc) { | |
958 | // Wave: AA BB CC DD ... | 906 | case 0: { params->shape_a = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break; |
959 | // ^^ | 907 | case 1: { params->phase_a = CLAMP(params->phase_a + inc, 0, WAVE_VARS - 1); } break; |
960 | // |`- odd | 908 | case 2: { params->shape_b = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break; |
961 | // `-- even | 909 | case 3: { params->phase_b = CLAMP(params->phase_b + inc, 0, WAVE_VARS - 1); } break; |
962 | if (param_selection_loc < 32) { | 910 | case 4: { /* TODO: probability */ } break; |
963 | // Draw on wave a. | 911 | case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; |
964 | u8 byte_number = param_selection_loc / 2; | 912 | case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; |
965 | u8 *byte = ¶ms->wave_a; | ||
966 | byte += byte_number; | ||
967 | if (odd) { | ||
968 | *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); | ||
969 | } else { | ||
970 | *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4; | ||
971 | } | ||
972 | } else if (param_selection_loc < 64){ | ||
973 | // Draw on wave b. | ||
974 | u8 byte_number = (param_selection_loc - 32) / 2; | ||
975 | u8 *byte = ¶ms->wave_b; | ||
976 | byte += byte_number; | ||
977 | if (odd) { | ||
978 | *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); | ||
979 | } else { | ||
980 | *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4; | ||
981 | } | ||
982 | } else if (param_selection_loc < 72) { | ||
983 | // Copy default waves. | ||
984 | u32 *wave_a = ¶ms->wave_a; | ||
985 | u32 *wave_b = ¶ms->wave_b; | ||
986 | switch (param_selection_loc) { | ||
987 | case 64: { memcpy32(wave_a, sine_wave, 16); } break; | ||
988 | case 65: { memcpy32(wave_a, saw_wave, 16); } break; | ||
989 | case 66: { memcpy32(wave_a, square_wave, 16); } break; | ||
990 | case 67: { | ||
991 | u32 rand_wave[4] = { | ||
992 | rng32(), rng32(), rng32(), rng32(), | ||
993 | }; | ||
994 | memcpy32(wave_a, rand_wave, 16); | ||
995 | } break; | ||
996 | case 68: { memcpy32(wave_b, sine_wave, 16); } break; | ||
997 | case 69: { memcpy32(wave_b, saw_wave, 16); } break; | ||
998 | case 70: { memcpy32(wave_b, square_wave, 16); } break; | ||
999 | case 71: { | ||
1000 | u32 rand_wave[4] = { | ||
1001 | rng32(), rng32(), rng32(), rng32(), | ||
1002 | }; | ||
1003 | memcpy32(wave_b, rand_wave, 16); | ||
1004 | } break; | ||
1005 | } | ||
1006 | } else if (param_selection_loc == 72) { | ||
1007 | u8 *wave_mode = ¶ms->wave_mode; | ||
1008 | *wave_mode = CLAMP(*wave_mode + inc, 0, 2); | ||
1009 | } else if (param_selection_loc == 73) { | ||
1010 | u8 *wave_volume = ¶ms->wave_volume; | ||
1011 | *wave_volume = CLAMP(*wave_volume + inc, 0, 4); | ||
1012 | } | 913 | } |
1013 | redraw_params = true; | 914 | redraw_params = true; |
1014 | return true; | 915 | return true; |