From ea2c7552dd414422bfe23117dc8440f4183611c7 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 29 Jul 2023 20:56:09 +0200 Subject: Add per-trig panning support --- src/sequencer.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 5 deletions(-) (limited to 'src/sequencer.c') diff --git a/src/sequencer.c b/src/sequencer.c index 1b9787f..a3bdf3f 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -98,6 +98,8 @@ should_play(u8 prob) { void play_step(void) { + bool update_sound = false; + static s8 pan[4] = {0}; Pattern *pat = &patterns[current_pattern]; if (current_pattern != next_pattern && step_counter == 15) { current_pattern = next_pattern; @@ -144,6 +146,10 @@ play_step(void) { asm("nop"); asm("nop"); SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; } + if (pan[0] != params->pan) { + update_sound = true; + } + pan[0] = params->pan; } } else { SOUND_SQUARE1_SWEEP = 0; @@ -164,6 +170,10 @@ play_step(void) { | SOUND_SQUARE_ENV_TIME(params->env_time) | SOUND_SQUARE_ENV_DIR(params->env_direction) | SOUND_SQUARE_DUTY(params->duty_cycle); + if (pan[1] != params->pan) { + update_sound = true; + } + pan[1] = params->pan; } } else { SOUND_SQUARE2_FREQ = 0; @@ -206,6 +216,10 @@ play_step(void) { case 3: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_75; } break; case 4: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_100; } break; } + if (pan[2] != params->pan) { + update_sound = true; + } + pan[2] = params->pan; } else { // NOTE: Maybe in the future we want an AD, but for now this is // probably better than holding the notes. Or perhaps add a hold @@ -249,6 +263,10 @@ play_step(void) { | SOUND_NOISE_ENV_TIME(params->env_time) | SOUND_NOISE_ENV_DIR(params->env_direction); } + if (pan[3] != params->pan) { + update_sound = true; + } + pan[3] = params->pan; } else { SOUND_NOISE_FREQ = 0; SOUND_NOISE_CTRL = 0; @@ -266,6 +284,25 @@ play_step(void) { case SYNC_OUT_LINK_AUDIO_4: { if (step_counter % 4 == 0) { gate_on(); audio_sync_click = true; } } break; default: break; } + + // Adjust per-channel panning. + switch (settings.sync) { + case SYNC_OUT_LINK_AUDIO_4: + case SYNC_OUT_LINK_AUDIO_8: + case SYNC_OUT_LINK_AUDIO_16: + case SYNC_OUT_AUDIO_4: + case SYNC_OUT_AUDIO_8: + case SYNC_OUT_AUDIO_16: break; + default: { + if (update_sound) { + SOUND_DMG_MASTER = dmg_stereo_vol(3) + | channel_vol(SOUND_SQUARE1, pan[0]) + | channel_vol(SOUND_SQUARE2, pan[1]) + | channel_vol(SOUND_WAVE, pan[2]) + | channel_vol(SOUND_NOISE, pan[3]); + } + } break; + } if (step_counter == 15) { bar_counter++; } @@ -759,8 +796,10 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler if (key_tap(KEY_RIGHT)) { if (param_selection_loc == 4) { param_selection_loc = 0; - } else if (param_selection_loc == 7) { + } else if (param_selection_loc == 9) { param_selection_loc = 5; + } else if (param_selection_loc == 7) { + param_selection_loc = 9; } else if (param_selection_loc < 7) { param_selection_loc++; } @@ -768,6 +807,8 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler if (param_selection_loc == 0) { param_selection_loc = 4; } else if (param_selection_loc == 5) { + param_selection_loc = 9; + } else if (param_selection_loc == 9) { param_selection_loc = 7; } else if (param_selection_loc > 0) { param_selection_loc--; @@ -778,7 +819,11 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler } if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { - if (param_selection_loc < 3) { + if (param_selection_loc == 4) { + param_selection_loc = 9; + } else if (param_selection_loc == 9) { + param_selection_loc = 4; + } else if (param_selection_loc < 3) { param_selection_loc += 5; } else if (param_selection_loc > 4) { param_selection_loc -= 5; @@ -812,6 +857,7 @@ set_param_selection_sq1(ChannelSquareParams *params, InputHandler return_handler case 5: { params->sweep_number = CLAMP(params->sweep_number + inc, 0, 7); } break; case 6: { params->sweep_time = CLAMP(params->sweep_time + inc, 0, 7); } break; case 7: { params->sweep_direction ^= 1; } break; + case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; } redraw_params = true; return true; @@ -844,7 +890,7 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler param_selection_loc = 4; } else if (param_selection_loc == 5) { param_selection_loc = 7; - } else if (param_selection_loc > 0) { + } else if (param_selection_loc > 0 && param_selection_loc != 9) { param_selection_loc--; } } @@ -852,6 +898,16 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler return false; } + if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { + if (param_selection_loc == 4) { + param_selection_loc = 9; + } else if (param_selection_loc == 9) { + param_selection_loc = 4; + } + redraw_params = true; + return false; + } + // Adjust parameter. if (key_tap(KEY_R) || key_tap(KEY_L)) { int inc; @@ -874,6 +930,7 @@ set_param_selection_sq2(ChannelSquareParams *params, InputHandler return_handler } break; case 3: { params->env_direction ^= 1; } break; case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; + case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; } redraw_params = true; return true; @@ -897,6 +954,8 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) if (param_selection_loc == 4) { param_selection_loc = 0; } else if (param_selection_loc == 6) { + param_selection_loc = 9; + } else if (param_selection_loc == 9) { param_selection_loc = 5; } else if (param_selection_loc < 6) { param_selection_loc++; @@ -905,6 +964,8 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) if (param_selection_loc == 0) { param_selection_loc = 4; } else if (param_selection_loc == 5) { + param_selection_loc = 9; + } else if (param_selection_loc == 9) { param_selection_loc = 6; } else if (param_selection_loc > 0) { param_selection_loc--; @@ -915,7 +976,11 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) } if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { - if (param_selection_loc < 2) { + if (param_selection_loc == 4) { + param_selection_loc = 9; + } else if (param_selection_loc == 9) { + param_selection_loc = 4; + } else if (param_selection_loc < 2) { param_selection_loc += 5; } else if (param_selection_loc > 4) { param_selection_loc -= 5; @@ -940,6 +1005,7 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } 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; + case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; } redraw_params = true; return true; @@ -972,7 +1038,7 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle param_selection_loc = 4; } else if (param_selection_loc == 5) { param_selection_loc = 7; - } else if (param_selection_loc > 0) { + } else if (param_selection_loc > 0 && param_selection_loc != 9) { param_selection_loc--; } } @@ -980,6 +1046,16 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle return false; } + if (key_tap(KEY_UP) || key_tap(KEY_DOWN)) { + if (param_selection_loc == 4) { + param_selection_loc = 9; + } else if (param_selection_loc == 9) { + param_selection_loc = 4; + } + redraw_params = true; + return false; + } + // Adjust parameter. if (key_tap(KEY_R) || key_tap(KEY_L)) { int inc; @@ -1002,6 +1078,7 @@ set_param_selection_noise(ChannelNoiseParams *params, InputHandler return_handle } break; case 3: { params->env_direction ^= 1; } break; case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; + case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; } redraw_params = true; return true; -- cgit v1.2.1