From 6a5d29a1300f11a755329e8e4d28d23d05651714 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 31 Jul 2023 17:07:01 +0200 Subject: Add minor bugfixes --- src/main.c | 1 + src/sequencer.c | 91 +++++++++++++++++++++++++++++++++++++-------------------- src/settings.h | 6 ++-- 3 files changed, 63 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index aa559c7..a0832a2 100644 --- a/src/main.c +++ b/src/main.c @@ -176,6 +176,7 @@ update(void) { if (notif.time > 0) { notif.time--; } + rng_state++; } int diff --git a/src/sequencer.c b/src/sequencer.c index a3bdf3f..7f07845 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -98,7 +98,6 @@ 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) { @@ -129,6 +128,12 @@ play_step(void) { | SOUND_SWEEP_DIR(params->sweep_direction) | SOUND_SWEEP_TIME(params->sweep_time); } + SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET; + SOUND_SQUARE1_CTRL = 0; + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); SOUND_SQUARE1_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) | SOUND_SQUARE_ENV_TIME(params->env_time) | SOUND_SQUARE_ENV_DIR(params->env_direction) @@ -146,20 +151,27 @@ 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; - SOUND_SQUARE1_FREQ = 0; + SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET; SOUND_SQUARE1_CTRL = 0; } if (pat->ch2.active) { TriggerNote *trig = &pat->ch2.notes[step_counter]; ChannelSquareParams *params = &pat->ch2.params[step_counter]; if (trig->active && should_play(params->prob)) { + SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET; + SOUND_SQUARE2_CTRL = 0; + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); SOUND_SQUARE2_CTRL = SOUND_SQUARE_ENV_VOL(params->env_volume) | SOUND_SQUARE_ENV_TIME(params->env_time) | SOUND_SQUARE_ENV_DIR(params->env_direction) @@ -170,13 +182,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; + SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET; SOUND_SQUARE2_CTRL = 0; } if (pat->ch3.active) { @@ -216,19 +225,16 @@ 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 // mode? - SOUND_WAVE_FREQ = 0; + SOUND_WAVE_FREQ = SOUND_FREQ_RESET; SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; } } else { - SOUND_WAVE_FREQ = 0; + SOUND_WAVE_FREQ = SOUND_FREQ_RESET; SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; } if (pat->ch4.active) { @@ -263,12 +269,9 @@ 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_FREQ = SOUND_FREQ_RESET; SOUND_NOISE_CTRL = 0; } @@ -294,13 +297,11 @@ play_step(void) { 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]); - } + 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) { @@ -436,7 +437,15 @@ void stop_sound(void) { play_status = 0; TIMER_CTRL_2 = 0; - SOUND_SQUARE1_CTRL = 0; + SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET; + SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET; + SOUND_WAVE_FREQ = SOUND_FREQ_RESET; + SOUND_NOISE_FREQ = SOUND_FREQ_RESET; SOUND_SQUARE2_CTRL = 0; SOUND_WAVE_CTRL = 0; SOUND_NOISE_CTRL = 0; @@ -466,12 +475,21 @@ toggle_playing(void) { next_pattern = chain.chain[chain.current]; current_pattern = next_pattern; } - redraw_pattern_buttons = true; + SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET; + SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET; + SOUND_WAVE_FREQ = SOUND_FREQ_RESET; + SOUND_NOISE_FREQ = SOUND_FREQ_RESET; SOUND_SQUARE1_CTRL = 0; SOUND_SQUARE2_CTRL = 0; SOUND_WAVE_CTRL = 0; SOUND_NOISE_CTRL = 0; redraw_play_pause = true; + redraw_pattern_buttons = true; if (settings.sync == SYNC_IN_LINK) { return; } @@ -491,6 +509,15 @@ toggle_playing(void) { void pause_playing(void) { play_status ^= 1; + SOUND_SQUARE1_SWEEP = SOUND_SWEEP_DIR(1); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + asm("nop"); asm("nop"); + SOUND_SQUARE1_FREQ = SOUND_FREQ_RESET; + SOUND_SQUARE2_FREQ = SOUND_FREQ_RESET; + SOUND_WAVE_FREQ = SOUND_FREQ_RESET; + SOUND_NOISE_FREQ = SOUND_FREQ_RESET; SOUND_SQUARE1_CTRL = 0; SOUND_SQUARE2_CTRL = 0; SOUND_WAVE_CTRL = 0; @@ -853,7 +880,7 @@ set_param_selection_sq1(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 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break; 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; @@ -929,7 +956,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 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break; case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; } redraw_params = true; @@ -1002,7 +1029,7 @@ set_param_selection_wave(ChannelWaveParams *params, InputHandler return_handler) case 1: { params->type_a = CLAMP(params->type_a + inc, 0, WAVE_VARS - 1); } break; case 2: { params->shape_b = CLAMP(params->shape_b + inc, 0, WAVE_MAX - 1); } break; case 3: { params->type_b = CLAMP(params->type_b + inc, 0, WAVE_VARS - 1); } break; - case 4: { params->prob = CLAMP(params->prob + inc, 0, PROB_NUM - 1); } break; + case 4: { params->prob = CLAMP(params->prob + inc * -1, 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; @@ -1077,7 +1104,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 4: { params->prob = CLAMP(params->prob + inc * -1, 0, PROB_NUM - 1); } break; case 9: { params->pan = CLAMP(params->pan + inc, -1, 1); } break; } redraw_params = true; diff --git a/src/settings.h b/src/settings.h index c3e035e..332e6fd 100644 --- a/src/settings.h +++ b/src/settings.h @@ -52,14 +52,14 @@ char * theme_setting_str[] = { }; typedef enum CursorSetting { - CURSOR_LINE = 0, - CURSOR_THICK_LINE, + CURSOR_THICK_LINE = 0, + CURSOR_LINE, CURSOR_NUM, } CursorSetting; char * cursor_setting_str[] = { - "LINE", "THICK LINE", + "LINE", }; typedef enum HelpSetting { -- cgit v1.2.1