aboutsummaryrefslogtreecommitdiffstats
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
parent804b7184744194dca5cab79726f31194b7f55b80 (diff)
downloadstepper-24f49419af67365907c1f072cb159719ff93fdbd.tar.gz
stepper-24f49419af67365907c1f072cb159719ff93fdbd.zip
Change ch3 wave behaviour to be fixed
-rw-r--r--src/assets.c50
-rw-r--r--src/drawing.c7
-rw-r--r--src/main.c1
-rw-r--r--src/patterns.c41
-rw-r--r--src/sequencer.c187
5 files changed, 106 insertions, 180 deletions
diff --git a/src/assets.c b/src/assets.c
index f685a05..66a6464 100644
--- a/src/assets.c
+++ b/src/assets.c
@@ -103,27 +103,49 @@ static const u32 ch_btn_sprite[] = {
103 0x505010f0, 0xf010d050, 103 0x505010f0, 0xf010d050,
104}; 104};
105 105
106static const u32 default_wave_buttons[] = {
107 0x493101ff, 0xff010185, 0x2820203f, 0x3f202324,
108 0x516101ff, 0xff01c549, 0x2a2c203f, 0x3f202829,
109 0x457d01ff, 0xff01c545, 0x2828203f, 0x3f202f28,
110 0x114901ff, 0xff012581, 0x2821203f, 0x3f202024,
111};
112
113// 106//
114// Wave data. 107// Wave data.
115// 108//
116 109
117static const u32 sine_wave[16] = { 110enum WAVES {
118 0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201, 111 WAVE_SIN,
112 WAVE_SAW,
113 WAVE_SQUARE,
114 WAVE_MAX,
119}; 115};
120 116
121static const u32 saw_wave[16] = { 117#define WAVE_VARS 4
122 0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89, 118
123}; 119typedef u32 Wave[WAVE_VARS];
124 120
125static const u32 square_wave[16] = { 121static const Wave waves[][WAVE_VARS] = {
126 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 122 {
123 {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
124 {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
125 {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
126 {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
127 // {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89},
128 // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
129 // {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89},
130 }, // Sine
131 {
132 {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89},
133 {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89},
134 {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89},
135 {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89},
136 // {0xffffffff, 0xffffffff, 0x00000000, 0x00000000},
137 // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
138 // {0xffffffff, 0xffffffff, 0x00000000, 0x00000000},
139 }, // Saw
140 {
141 {0xffffffff, 0xffffffff, 0x00000000, 0x00000000},
142 {0xffffffff, 0xffffffff, 0x00000000, 0x00000000},
143 {0xffffffff, 0xffffffff, 0x00000000, 0x00000000},
144 {0xffffffff, 0xffffffff, 0x00000000, 0x00000000},
145 // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
146 // {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89},
147 // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201},
148 }, // Square
127}; 149};
128 150
129#endif // STEPPER_ASSETS_C 151#endif // STEPPER_ASSETS_C
diff --git a/src/drawing.c b/src/drawing.c
index e9852e5..653351d 100644
--- a/src/drawing.c
+++ b/src/drawing.c
@@ -677,15 +677,12 @@ draw_parameters_wave(ChannelWaveParams *params, bool global) {
677 677
678 // Draw current wave data. 678 // Draw current wave data.
679 { 679 {
680 u8 *wave_a = params->wave_a;
681 u8 *wave_b = params->wave_b;
682
683 size_t x = PARAMS_START_X; 680 size_t x = PARAMS_START_X;
684 size_t y = PARAMS_START_Y; 681 size_t y = PARAMS_START_Y;
685 682
686 // Wave Patterns. 683 // Wave Patterns.
687 draw_wave_pattern(wave_a, x, y, COL_ACC_1); 684 draw_wave_pattern(waves[params->shape_a][params->phase_a], x, y, COL_ACC_1);
688 draw_wave_pattern(wave_b, x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2); 685 draw_wave_pattern(waves[params->shape_b][params->phase_b], x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2);
689 } 686 }
690 687
691 // TODO: Trig probability 688 // TODO: Trig probability
diff --git a/src/main.c b/src/main.c
index 410de56..09f0465 100644
--- a/src/main.c
+++ b/src/main.c
@@ -26,6 +26,7 @@ WITH REGARD TO THIS SOFTWARE.
26// This could get annoying, so maybe it should be a configuration option to 26// This could get annoying, so maybe it should be a configuration option to
27// enable it? 27// enable it?
28// - Undo/Redo. 28// - Undo/Redo.
29// - Make the channel parameters initialize to default
29// 30//
30// Advanced 31// Advanced
31// - Add tap tempo for BPM. 32// - Add tap tempo for BPM.
diff --git a/src/patterns.c b/src/patterns.c
index 6ce0878..6b68463 100644
--- a/src/patterns.c
+++ b/src/patterns.c
@@ -15,13 +15,17 @@ typedef struct ChannelSquareParams {
15 u8 sweep_number; 15 u8 sweep_number;
16 u8 sweep_time; 16 u8 sweep_time;
17 u8 sweep_direction; 17 u8 sweep_direction;
18 u8 prob;
18} ChannelSquareParams; 19} ChannelSquareParams;
19 20
20typedef struct ChannelWaveParams { 21typedef struct ChannelWaveParams {
21 u8 wave_volume; 22 u8 wave_volume;
22 u8 wave_mode; 23 u8 wave_mode;
23 u32 wave_a[4]; 24 u8 shape_a;
24 u32 wave_b[4]; 25 u8 phase_a;
26 u8 shape_b;
27 u8 phase_b;
28 u8 prob;
25} ChannelWaveParams; 29} ChannelWaveParams;
26 30
27typedef struct ChannelNoiseParams { 31typedef struct ChannelNoiseParams {
@@ -29,6 +33,7 @@ typedef struct ChannelNoiseParams {
29 u8 env_time; 33 u8 env_time;
30 u8 env_direction; 34 u8 env_direction;
31 u8 bit_mode; 35 u8 bit_mode;
36 u8 prob;
32} ChannelNoiseParams; 37} ChannelNoiseParams;
33 38
34typedef struct ChannelSquare { 39typedef struct ChannelSquare {
@@ -167,22 +172,22 @@ const ChannelWave default_ch3 = {
167 {true, NOTE_G_5}, 172 {true, NOTE_G_5},
168 }, 173 },
169 .params = { 174 .params = {
170 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 175 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
171 {3, 0, {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 176 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
172 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 177 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
173 {3, 0, {0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 178 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
174 {3, 0, {0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 179 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
175 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 180 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
176 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 181 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
177 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 182 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
178 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 183 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
179 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 184 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
180 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 185 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
181 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 186 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
182 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 187 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
183 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 188 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
184 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 189 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
185 {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, 190 {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0},
186 }, 191 },
187 .active = true, 192 .active = true,
188}; 193};
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;