From ba28706092fbb7c9255b456a040d8fcfcfbb7b9d Mon Sep 17 00:00:00 2001 From: Nathaniel Walizer Date: Tue, 7 Jan 2025 02:51:00 -0800 Subject: [PATCH] Clean up sweep and envelope restarts - SMB3 pipe/shrink sound still a little off --- src/apu.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/apu.c b/src/apu.c index 98e630b..1039f58 100644 --- a/src/apu.c +++ b/src/apu.c @@ -81,8 +81,6 @@ static void nes_apu_write_square(nes_apu_Channel* channel, ((val & apu_Square_Period) >> 4) ); channel->flags |= apu_Channel_Reload; - //channel->sweep_delay = 0; - //channel->step = 0; } else if (2 <= reg) { channel->reg[reg] = val; @@ -90,14 +88,11 @@ static void nes_apu_write_square(nes_apu_Channel* channel, (apu_channel_raw_timer_value(channel) /*+ 1*/) * 2 ) * nes_clock_cpu_div; if (3 == reg) { - //channel->flags |= apu_Channel_Reload; // TODO: No? -// channel->sweep_delay = 0; // TODO: No? -// channel->step = 7; -// channel->envelope = 15; - //channel->envelope = (channel->reg[0] & apu_Envelope_Volume); +// channel->flags |= apu_Channel_Reload; + channel->delay = 0; + // Envelope and step are already restarted } } - // TODO? } static void nes_apu_write_triangle(nes_apu_Channel* channel, @@ -235,12 +230,15 @@ static inline void nes_apu_clock_length(nes_apu_Channel* channel, static inline void nes_apu_clock_sweep(nes_apu_Channel* channel, int adjust) { + int decrement = 1; + if (channel->flags & apu_Channel_Reload) { channel->flags &= ~apu_Channel_Reload; - channel->sweep_delay = channel->sweep_period; + decrement = 0; + } - } else if (channel->sweep_delay == 0) { - channel->sweep_delay = channel->sweep_period; + if (channel->sweep_delay == 0) { + decrement = 0; if ( (channel->reg[1] & apu_Square_Enable) && 0 != (channel->reg[1] & apu_Square_Shift)) { int delta = ( @@ -255,9 +253,12 @@ static inline void nes_apu_clock_sweep(nes_apu_Channel* channel, channel->period = 0; } } + } - } else { + if (decrement) { channel->sweep_delay--; + } else { + channel->sweep_delay = channel->sweep_period; } } @@ -317,13 +318,8 @@ void nes_apu_write(nes_apu* apu, uint16_t addr, uint8_t val) { if ( chan != apu_Channel_DMC && (apu->status & (1 << chan))) { channel->length = apu_length_lut[val >> 3]; -// channel->step = (uint8_t)-1; - /*if (chan != apu_Channel_Triangle)*/ { - channel->flags |= apu_Channel_Start; -// channel->envelope = 15; - // TODO -// channel->env_delay = channel->env_period; - } + channel->step = (uint8_t)-1; + channel->flags |= apu_Channel_Start; } } channel->write(channel, reg, val);