- Fix frame counter running at 2× speed: clock_frame_counter now skips
odd CPU cycles (APU cycle = CPU/2), so envelope, sweep, and length
counters tick at the correct rate. Fixes sweep-driven whistle in Megaman II.
- Switch audio sampling to per-CPU-cycle granularity in
run_until_frame_complete_with_audio to eliminate square-wave harmonic
aliasing caused by sampling only once per instruction.
- Add IIR one-pole low-pass filter (~14 kHz) to AudioMixer to smooth
abrupt level transitions (crackling) introduced by correct envelope timing.
- Mute triangle channel when timer_period < 2 (≥27 kHz), which aliases
into the audible range at 48 kHz. Real NES RC circuit removes these
ultrasonics; emulator must suppress them explicitly.
- Update all APU bus tests to use correct (doubled) CPU cycle counts.
- CpalAudioSink writes to SPSC ring buffer, cpal callback reads
- Graceful fallback to silent operation on audio device errors
- Volume slider (0-100%) in header bar with speaker icon
- Ring buffer cleared on ROM load and reset