From 24f49419af67365907c1f072cb159719ff93fdbd Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 22 Jul 2023 08:09:22 +0200 Subject: Change ch3 wave behaviour to be fixed --- src/assets.c | 50 ++++++++++----- src/drawing.c | 7 +-- src/main.c | 1 + src/patterns.c | 41 +++++++------ src/sequencer.c | 187 +++++++++++++------------------------------------------- 5 files changed, 106 insertions(+), 180 deletions(-) (limited to 'src') 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[] = { 0x505010f0, 0xf010d050, }; -static const u32 default_wave_buttons[] = { - 0x493101ff, 0xff010185, 0x2820203f, 0x3f202324, - 0x516101ff, 0xff01c549, 0x2a2c203f, 0x3f202829, - 0x457d01ff, 0xff01c545, 0x2828203f, 0x3f202f28, - 0x114901ff, 0xff012581, 0x2821203f, 0x3f202024, -}; - // // Wave data. // -static const u32 sine_wave[16] = { - 0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201, +enum WAVES { + WAVE_SIN, + WAVE_SAW, + WAVE_SQUARE, + WAVE_MAX, }; -static const u32 saw_wave[16] = { - 0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89, -}; +#define WAVE_VARS 4 + +typedef u32 Wave[WAVE_VARS]; -static const u32 square_wave[16] = { - 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, +static const Wave waves[][WAVE_VARS] = { + { + {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + // {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89}, + // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + // {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89}, + }, // Sine + { + {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89}, + {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89}, + {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89}, + {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89}, + // {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, + // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + // {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, + }, // Saw + { + {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, + {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, + {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, + {0xffffffff, 0xffffffff, 0x00000000, 0x00000000}, + // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + // {0x67452301, 0xefcdab89, 0x67452301, 0xefcdab89}, + // {0xefdebc89, 0x98cbedfe, 0x10214376, 0x67341201}, + }, // Square }; #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) { // Draw current wave data. { - u8 *wave_a = params->wave_a; - u8 *wave_b = params->wave_b; - size_t x = PARAMS_START_X; size_t y = PARAMS_START_Y; // Wave Patterns. - draw_wave_pattern(wave_a, x, y, COL_ACC_1); - draw_wave_pattern(wave_b, x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2); + draw_wave_pattern(waves[params->shape_a][params->phase_a], x, y, COL_ACC_1); + draw_wave_pattern(waves[params->shape_b][params->phase_b], x + PARAMS_BOX_OFFSET_X * 2, y, COL_ACC_2); } // 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. // This could get annoying, so maybe it should be a configuration option to // enable it? // - Undo/Redo. +// - Make the channel parameters initialize to default // // Advanced // - 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 { u8 sweep_number; u8 sweep_time; u8 sweep_direction; + u8 prob; } ChannelSquareParams; typedef struct ChannelWaveParams { u8 wave_volume; u8 wave_mode; - u32 wave_a[4]; - u32 wave_b[4]; + u8 shape_a; + u8 phase_a; + u8 shape_b; + u8 phase_b; + u8 prob; } ChannelWaveParams; typedef struct ChannelNoiseParams { @@ -29,6 +33,7 @@ typedef struct ChannelNoiseParams { u8 env_time; u8 env_direction; u8 bit_mode; + u8 prob; } ChannelNoiseParams; typedef struct ChannelSquare { @@ -167,22 +172,22 @@ const ChannelWave default_ch3 = { {true, NOTE_G_5}, }, .params = { - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, - {3, 0, {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000},{0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000}}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, + {3, 0, WAVE_SIN, 0, WAVE_SAW, 0, 0}, }, .active = true, }; 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) { | SOUND_SQUARE_ENV_TIME(params->env_time) | SOUND_SQUARE_ENV_DIR(params->env_direction) | SOUND_SQUARE_DUTY(params->duty_cycle); - SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET - | sound_rates[trig->note]; + SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; + SOUND_SQUARE1_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) + | SOUND_SQUARE_ENV_TIME(params->env_time) + | SOUND_SQUARE_ENV_DIR(params->env_direction) + | SOUND_SQUARE_DUTY(params->duty_cycle); // Re-initialize the sound after 8 cycles if using sweeps. if (params->sweep_time != 0) { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); - SOUND_SQUARE1_SWEEP = SOUND_SWEEP_NUMBER(params->sweep_number) - | SOUND_SWEEP_DIR(params->sweep_direction) - | SOUND_SWEEP_TIME(params->sweep_time); - SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET - | sound_rates[trig->note]; - SOUND_SQUARE1_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) - | SOUND_SQUARE_ENV_TIME(params->env_time) - | SOUND_SQUARE_ENV_DIR(params->env_direction) - | SOUND_SQUARE_DUTY(params->duty_cycle); + SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; } } } else { @@ -134,6 +129,10 @@ play_step(void) { TriggerNote *trig = &pat->ch2.notes[step_counter]; ChannelSquareParams *params = &pat->ch2.params[step_counter]; if (trig->active) { + SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) + | SOUND_SQUARE_ENV_TIME(params->env_time) + | SOUND_SQUARE_ENV_DIR(params->env_direction) + | SOUND_SQUARE_DUTY(params->duty_cycle); SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) @@ -149,25 +148,24 @@ play_step(void) { TriggerNote *trig = &pat->ch3.notes[step_counter]; ChannelWaveParams *params = &pat->ch3.params[step_counter]; if (trig->active) { - // TODO: If we find an empty trigger stop the sound. switch (params->wave_mode) { case 0: { SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); - memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); + memcpy32(SOUND_WAVE_RAM, waves[params->shape_a][params->phase_a], 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) | SOUND_WAVE_BANK_SELECT(0); } break; case 1: { SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); - memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); + memcpy32(SOUND_WAVE_RAM, waves[params->shape_b][params->phase_b], 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(0) | SOUND_WAVE_BANK_SELECT(1); } break; case 2: { SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(0); - memcpy32(SOUND_WAVE_RAM, params->wave_b, 16); + memcpy32(SOUND_WAVE_RAM, waves[params->shape_b][params->phase_b], 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_SELECT(1); - memcpy32(SOUND_WAVE_RAM, params->wave_a, 16); + memcpy32(SOUND_WAVE_RAM, waves[params->shape_a][params->phase_a], 16); SOUND_WAVE_MODE = SOUND_WAVE_BANK_MODE(1) | SOUND_WAVE_BANK_SELECT(0); } break; @@ -214,6 +212,9 @@ play_step(void) { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + SOUND_NOISE_CTRL = SOUND_NOISE_ENV_VOL(params->env_volume) + | SOUND_NOISE_ENV_TIME(params->env_time) + | SOUND_NOISE_ENV_DIR(params->env_direction); SOUND_NOISE_FREQ = SOUND_FREQ_RESET | SOUND_NOISE_PRESTEP_FREQ(pre_freq[trig->note]) | SOUND_NOISE_DIV_FREQ(div_freq[trig->note]) @@ -862,153 +863,53 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) // Cursor movement. if (key_tap(KEY_LEFT) || key_tap(KEY_RIGHT)) { - int inc = 0; - int loc = param_selection_loc; if (key_tap(KEY_RIGHT)) { - if (loc == 15 || loc == 31) { - inc = 17; - } else if (loc == 47) { - inc = 26; - } else if (loc == 63) { - inc = 9; - } else if (loc != 47 && loc != 63 && loc < 72) { - inc = 1; + if (param_selection_loc == 4) { + param_selection_loc = 0; + } else if (param_selection_loc == 6) { + param_selection_loc = 5; + } else if (param_selection_loc < 6) { + param_selection_loc++; } } else { - if (loc == 32 || loc == 48) { - inc = -17; - } else if (loc == 73) { - inc = -26; - } else if (loc != 16 && loc != 64) { - inc = -1; + if (param_selection_loc == 0) { + param_selection_loc = 4; + } else if (param_selection_loc == 5) { + param_selection_loc = 6; + } else if (param_selection_loc > 0) { + param_selection_loc--; } } - param_selection_loc = CLAMP(loc + inc, 0, 73); redraw_params = true; return false; } if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { - int inc = 0; - int loc = param_selection_loc; - if (key_tap(KEY_UP)) { - if ((loc >= 16 && loc < 32) || (loc >= 48 && loc < 64)) { - inc = -16; - } else if (loc == 64) { - inc = -48; - } else if (loc == 65) { - inc = -45; - } else if (loc == 66) { - inc = -42; - } else if (loc == 67) { - inc = -39; - } else if (loc == 68) { - inc = -20; - } else if (loc == 69) { - inc = -17; - } else if (loc == 70) { - inc = -14; - } else if (loc == 71) { - inc = -11; - } else if (loc == 72) { - inc = 1; - } else if (loc == 73) { - inc = -1; - } - } else { - if (loc < 16 || (loc >= 32 && loc < 48)) { - inc = 16; - } else if (loc >= 16 && loc <= 19) { - inc = 48 - (loc - 16); - } else if (loc >= 20 && loc <= 23) { - inc = 45 - (loc - 20); - } else if (loc >= 24 && loc <= 27) { - inc = 42 - (loc - 24); - } else if (loc >= 28 && loc <= 31) { - inc = 39 - (loc - 28); - } else if (loc >= 48 && loc <= 51) { - inc = 20 - (loc - 48); - } else if (loc >= 52 && loc <= 55) { - inc = 17 - (loc - 52); - } else if (loc >= 56 && loc <= 59) { - inc = 14 - (loc - 56); - } else if (loc >= 60 && loc <= 63) { - inc = 11 - (loc - 60); - } else if (loc == 72) { - inc = 1; - } else if (loc == 73) { - inc = -1; - } + if (param_selection_loc < 2) { + param_selection_loc += 5; + } else if (param_selection_loc > 4) { + param_selection_loc -= 5; } - param_selection_loc = CLAMP(loc + inc, 0, 73); redraw_params = true; return false; } // Adjust parameter. if (key_tap(KEY_R) || key_tap(KEY_L)) { - int odd = param_selection_loc & 0x1; int inc; - if (key_tap(KEY_R)) { - inc = 1; - } else { + if (key_tap(KEY_L)) { inc = -1; + } else { + inc = 1; } - - // Wave: AA BB CC DD ... - // ^^ - // |`- odd - // `-- even - if (param_selection_loc < 32) { - // Draw on wave a. - u8 byte_number = param_selection_loc / 2; - u8 *byte = ¶ms->wave_a; - byte += byte_number; - if (odd) { - *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); - } else { - *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4; - } - } else if (param_selection_loc < 64){ - // Draw on wave b. - u8 byte_number = (param_selection_loc - 32) / 2; - u8 *byte = ¶ms->wave_b; - byte += byte_number; - if (odd) { - *byte = (~0xF & *byte) | ((*byte + inc) & 0xF); - } else { - *byte = (0xF & *byte) | (((*byte >> 4) + inc) & 0xF) << 4; - } - } else if (param_selection_loc < 72) { - // Copy default waves. - u32 *wave_a = ¶ms->wave_a; - u32 *wave_b = ¶ms->wave_b; - switch (param_selection_loc) { - case 64: { memcpy32(wave_a, sine_wave, 16); } break; - case 65: { memcpy32(wave_a, saw_wave, 16); } break; - case 66: { memcpy32(wave_a, square_wave, 16); } break; - case 67: { - u32 rand_wave[4] = { - rng32(), rng32(), rng32(), rng32(), - }; - memcpy32(wave_a, rand_wave, 16); - } break; - case 68: { memcpy32(wave_b, sine_wave, 16); } break; - case 69: { memcpy32(wave_b, saw_wave, 16); } break; - case 70: { memcpy32(wave_b, square_wave, 16); } break; - case 71: { - u32 rand_wave[4] = { - rng32(), rng32(), rng32(), rng32(), - }; - memcpy32(wave_b, rand_wave, 16); - } break; - } - } else if (param_selection_loc == 72) { - u8 *wave_mode = ¶ms->wave_mode; - *wave_mode = CLAMP(*wave_mode + inc, 0, 2); - } else if (param_selection_loc == 73) { - u8 *wave_volume = ¶ms->wave_volume; - *wave_volume = CLAMP(*wave_volume + inc, 0, 4); + switch (param_selection_loc) { + case 0: { params->shape_a = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break; + case 1: { params->phase_a = CLAMP(params->phase_a + inc, 0, WAVE_VARS - 1); } break; + case 2: { params->shape_b = CLAMP(params->shape_a + inc, 0, WAVE_MAX - 1); } break; + case 3: { params->phase_b = CLAMP(params->phase_b + inc, 0, WAVE_VARS - 1); } break; + case 4: { /* TODO: probability */ } break; + case 5: { params->wave_mode = CLAMP(params->wave_mode + inc, 0, 2); } break; + case 6: { params->wave_volume = CLAMP(params->wave_volume + inc, 0, 4); } break; } redraw_params = true; return true; -- cgit v1.2.1