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/sequencer.c | 187 +++++++++++++------------------------------------------- 1 file changed, 44 insertions(+), 143 deletions(-) (limited to 'src/sequencer.c') 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