Skip to content

Fuzz, DeEsser and Tremolo: Mix 0, Range 0 and Depth 0 walk there and back - #18

Merged
bdbarnett merged 3 commits into
mainfrom
ramps-where-they-step
Nov 11, 2026
Merged

bdbarnett merged 3 commits into
mainfrom
ramps-where-they-step

Conversation

@bdbarnett

Copy link
Copy Markdown
Contributor

Three moves that still stepped now walk over 20 ms: Fuzz's Mix to 0 and back, DeEsser's Range to 0 and back, and Tremolo's Depth to 0 and back.

Fuzz cut to its source at Mix 0 and cut back in. It now walks to the dry before the port switches and walks back in from it. The germanium chain has no mixer, so it walks on its stages' own mix; at an off-centre Bias it still comes back at once, because a walk would let the shapers' answer to silence through (6847 LSB out of silence at patch 2, which TheBypassComesBackAsBuilt catches). DeEsser's Range 0 cut to its input adapter and played a 256-frame lump of the old graph on the way back; it now walks the same way, with its Splitters dropping what they held and its voices primed afresh. Tremolo needed no change of its own: AUDIODSP_PIN moves to ec82463, where audiomath.Multiply walks a mix move (audiodsp#411). The pin's own commit records what else moved beneath the effects.

How I checked: renders of a 110 Hz triangle through each move, plotted against an instance that never moved. The steepest step after the move, over the triangle's own, went from 20.95 to 1.07 (Tremolo Depth to 0, 48 kHz) and from 31.6 to 1.0 (22.05 kHz). Fuzz's and DeEsser's plots show a 20 ms walk where there was a cut; the step ratio there is dominated by the fuzz's own edges, so the plots are the evidence. In the lifecycle matrix, Fuzz's 36 Mix 0 step cells, DeEsser's two Range 0 steps at 22.05 kHz and RingMod's 176 Mix step cells are green. Fuzz's walk-in differs from a fresh instance while its output pole settles (a few hundred LSB just after the walk, under 20 within 100 ms), and DeEsser's by one LSB in the block after the walk; both are declared in lifecycle_known.py. tools/scoped_tests.py class:Fuzz and class:DeEsser, tests/test_level_ramp.py, validate_api.py and flake8 pass, and the lifecycle matrix for the four classes prints the same lines on CPython, MicroPython and CircuitPython. That last check caught a plain mix assignment that landed on the Python-level Waveshaper as an attribute, so on CPython the shapers stayed wet through the walk; the walk now goes through set() there too. The full suite is left to CI.

What still steps is in the roadmap bullet: filter corners, an effect built at Mix 0 coming in for the first time (it cuts in, as every effect that walks to its bypass does today), and crossfaded patch changes. docs/how-it-works/control-smoothing.md says the same.

Fuzz cut to its source at Mix 0 and cut back in, and DeEsser's Range 0 did the same, with a 256-frame lump of the old graph on the way back. Both now walk to the dry over 20 ms before the port switches, and walk back in from it. Fuzz's germanium chain has no mixer, so it walks on its stages' own mix; at an off-centre Bias it still comes back at once, since a walk would let the shapers' offset through. DeEsser lets its Splitters drop what they held and primes its voices afresh on the way back.

The lifecycle matrix: Fuzz's Mix 0 step cells (36) and DeEsser's two Range 0 steps at 22.05 kHz are green. Fuzz's walk-in differs from a fresh instance while its output pole settles, and DeEsser's by one LSB in the block after the walk; both are declared.
…th 0 walks

audiodsp#411 walks audiomath.Multiply's mix over 20 ms. Tremolo sets that mix to take Depth to 0 and back, which stepped the output 21 times the material's own steepest step at 48 kHz and 32 times at 22.05 kHz; it now steps 1.07 and 1.0 times. RingMod's Mix walks for the same reason: 176 of its step cells in the lifecycle matrix are green. The lifecycle matrix was rerun at the new pin for every class that uses Multiply; only RingMod's rows moved. The roadmap and control-smoothing.md now name what still steps.
A plain mix assignment landed on the Python-level Waveshaper as an
attribute, so on CPython the shapers stayed wet through the walk while
MicroPython walked them, and the two printed different lifecycle lines.
@bdbarnett
bdbarnett merged commit 1720753 into main Nov 11, 2026
8 checks passed
@bdbarnett
bdbarnett deleted the ramps-where-they-step branch November 11, 2026 00:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant