Skip to content

v0.6.6: true duck-around-swap kills A/B/preset pop; spectral 4-band Imager#24

Merged
skyRolly merged 1 commit into
mainfrom
claude/beautiful-sagan-JAUFI
Jun 16, 2026
Merged

v0.6.6: true duck-around-swap kills A/B/preset pop; spectral 4-band Imager#24
skyRolly merged 1 commit into
mainfrom
claude/beautiful-sagan-JAUFI

Conversation

@skyRolly

Copy link
Copy Markdown
Owner

Anamorph 0.6.5 feedback — the A/B/preset pop (re-fix) and the deferred spectral Imager.

1. A/B / preset pop — properly fixed this time (true duck-around-swap)

The v0.6.5 duck still popped. Two real causes, both found by reading the duck machine end-to-end:

  • The Level-Match re-injection (matchInject) jumped matchGainSmooth at the top of the block — while switchPhase was still ≈1 (full level) — so the gain discontinuity was never under the duck. (This is the A/B click specifically.)
  • Continuous params applied immediately during the fade-out, so the ~4 ms duck only attenuated the start of a big change and left a swell.

Now a forced swap (A/B / preset / undo) is a real duck-around-swap: the OLD state stays live through the fade-out, and the entire new state — continuous included — is applied at the silent bottom, where the smoothers are snapped to their new targets and the match injection is consumed. Nothing changes at an audible level, so it cannot click, regardless of how large the jump is or whether a given control is smoothed. The normal discrete-switch duck (algorithm changes etc.) is unchanged.

2. Spectral Imager (replaces the rotary Multiband)

A FabFilter Pro-Q 4 / Ozone-Imager-style band editor, Advanced-mode only:

  • DSPMultibandWidth extended from 3 to 4 phase-coherent bands (three cascaded Linkwitz-Riley crossovers), each with its own MS width; recombination stays mono-compatible. Linear, so it stays outside oversampling.
  • Params — three crossovers (mbFreqLow/Mid/High) + four widths (mbWidthLow/Mid/HiMid/High). Two new params added; existing IDs kept so old automation/state still map.
  • GUI — new SpectrumImager: a live FFT analyser fed by the existing lock-free ScopeBuffer (no new audio-thread tap), with three draggable crossover handles splitting the spectrum into four bands. Drag up/down inside a band to set its width — no knobs. Double-click a crossover or band to reset. It drives the parameters directly via begin/set/endChangeGesture, so host automation and undo work. Replaces the five rotary knobs in the Advanced bottom strip; the On enable toggle stays.

Gates: 14/14 DSP self-tests (incl. the 4-band engine in the NaN/feature matrix) · no new compiler warnings · pluginval strictness 10 PASSED (editor open/close exercises the new FFT/timer component under xvfb).

Note: the Imager currently lives in the Advanced strip where the multiband was (~module-sized). If you want it larger/more prominent (closer to Pro-Q's full-width display), that's an easy follow-up — say the word.

https://claude.ai/code/session_01Y38PtwPxh2geBLta6yuUwv


Generated by Claude Code

…mager

#1 (pop, re-fix): the v0.6.5 duck still popped because (a) the Level-Match
re-injection jumped the gain at the TOP of the block while the duck was still at
full level, and (b) continuous params applied immediately during the fade-out,
leaving a swell for big changes. A forced (A/B / preset / undo) swap is now a
TRUE duck-around-swap: the OLD state stays live through the fade-out and the
ENTIRE new state -- continuous included -- is applied at the silent bottom, where
the smoothers are snapped to their targets and the match injection is consumed.
Nothing (smoothed or not) changes at audible level, so it can't click. The
normal discrete duck is unchanged.

Deferred feature: the rotary Multiband is replaced by a Pro-Q 4 / Ozone-style
spectral IMAGER (Advanced mode):
- DSP: MultibandWidth extended to FOUR phase-coherent bands (three cascaded
  Linkwitz-Riley crossovers), each with its own MS width; mono-compatible.
- Params: three crossovers (mbFreqLow/Mid/High) + four widths
  (mbWidthLow/Mid/HiMid/High); two new params added, IDs otherwise stable.
- GUI: new SpectrumImager component -- a live FFT analyser (fed by the existing
  lock-free ScopeBuffer, no new tap) with three draggable crossover handles
  splitting it into four bands; drag UP/DOWN inside a band sets its width, no
  knobs. Double-click a crossover or band to reset. Drives the parameters
  directly (automation + undo aware). Shown only in Advanced mode.

https://claude.ai/code/session_01Y38PtwPxh2geBLta6yuUwv
@skyRolly skyRolly marked this pull request as ready for review June 16, 2026 13:57
@skyRolly skyRolly merged commit d55e768 into main Jun 16, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants