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 | |
parent | 804b7184744194dca5cab79726f31194b7f55b80 (diff) | |
download | stepper-24f49419af67365907c1f072cb159719ff93fdbd.tar.gz stepper-24f49419af67365907c1f072cb159719ff93fdbd.zip |
Change ch3 wave behaviour to be fixed
-rw-r--r-- | src/assets.c | 50 | ||||
-rw-r--r-- | src/drawing.c | 7 | ||||
-rw-r--r-- | src/main.c | 1 | ||||
-rw-r--r-- | src/patterns.c | 41 | ||||
-rw-r--r-- | src/sequencer.c | 187 |
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 | ||
106 | static 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 | ||
117 | static const u32 sine_wave[16] = { | 110 | enum WAVES { |
118 | 0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201, | 111 | WAVE_SIN, |
112 | WAVE_SAW, | ||
113 | WAVE_SQUARE, | ||
114 | WAVE_MAX, | ||
119 | }; | 115 | }; |
120 | 116 | ||
121 | static const u32 saw_wave[16] = { | 117 | #define WAVE_VARS 4 |
122 | 0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89, | 118 | |
123 | }; | 119 | typedef u32 Wave[WAVE_VARS]; |
124 | 120 | ||
125 | static const u32 square_wave[16] = { | 121 | static 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 |
@@ -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 | ||
20 | typedef struct ChannelWaveParams { | 21 | typedef 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 | ||
27 | typedef struct ChannelNoiseParams { | 31 | typedef 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 | ||
34 | typedef struct ChannelSquare { | 39 | typedef 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 = ¶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; |