aboutsummaryrefslogtreecommitdiffstats
path: root/src/sequencer.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-07-22 08:09:22 +0200
committerBad Diode <bd@badd10de.dev>2023-07-22 08:09:22 +0200
commit24f49419af67365907c1f072cb159719ff93fdbd (patch)
tree1b1de622eaff8bd522bce3ed185d302726a465f2 /src/sequencer.c
parent804b7184744194dca5cab79726f31194b7f55b80 (diff)
downloadstepper-24f49419af67365907c1f072cb159719ff93fdbd.tar.gz
stepper-24f49419af67365907c1f072cb159719ff93fdbd.zip
Change ch3 wave behaviour to be fixed
Diffstat (limited to 'src/sequencer.c')
-rw-r--r--src/sequencer.c187
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 = &params->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 = &params->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 = &params->wave_a;
985 u32 *wave_b = &params->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 = &params->wave_mode;
1008 *wave_mode = CLAMP(*wave_mode + inc, 0, 2);
1009 } else if (param_selection_loc == 73) {
1010 u8 *wave_volume = &params->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;