A Compressor had only its number rows in the node. Its numbers are
easier to set by feel on a dial, and what it does is easier to judge
when the level going in and the level going out are seen side by side.
- Knob is a new widget in the toolkit: a slider bent into a circle,
its name above and a number field below. A drag up or down turns
it, Shift a tenth as far, a notch of the wheel a fiftieth of the
turn, a double-click sets the default, the number takes a typed
value. A taper gives the low end more of the turn.
- The Compressor's tab opens on a double-click, one per node, like
the Parametric EQ's. It has a knob for each of the seven numbers,
greyed while its input is linked.
- Its curve shows level in to level out from -60 to 0 dB. The point
where it bends sets the threshold, the end of the curve sets the
ratio that ends there.
- Its levels show the last 4 s on both sides of the node. Where it
takes more than 0.5 dB away, the stretch below the level coming in
is tinted. The makeup is left out of that.
- The Compressor is tapped like the EQ. SpectrumTaps listens to more
than one node at once and reads the loudest sample of the last
25 ms on each side.
- The node tabs share one map in the editor (nodeTabs), so a third
kind needs no new plumbing.
Findings:
- CI task 614 for 23922ee was red on the memory check of the stream:
the tab's renderer grew by 94 MB with nothing decoded. Play mode
made garbage of its own and was read before a collection. Both
readings in play now come after one, and the check compares the
growth streamed with the growth decoded (3.7 MB against 59.8 MB).
- The ratio handle sat on the right edge of the picture, where a
widget's hit area ends. The curve is inset by the grab radius.
Tests:
- Gate (melektaus-atx): 282 files, 4338 tests (17 new)
- e2e 34 (melektaus-atx): ALL PASSED, 116 checks (6 new)
- Counter-checks: an inverted ratio search, stop() letting go of
every node and a drag without its least step each fail exactly
their test.
- Looked at the tab in a screenshot: a blip at -4.4 dB came out at
-16.7 dB, the gap tinted, the threshold line at -24.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both were asked for in #367 "for later". The node of a Parametric EQ
now shows its curve in small, and its tab shows what passes the node
while it is seen.
#375, the curve in the node:
- NodeDef has an optional `picture`: a height, and shapes made from
the settings as plain point lists (guide, area, line). It is
general, the Parametric EQ is its first user.
- NodeView draws it in a box below the rows, again only when the box
or the settings change. A drag in the EQ tab changes them, so the
node follows it live.
- Without a band the box stays, flat on its 0 dB line, so the node
does not grow at the first band.
- The axes of the curve, `eqCurvePoints` and `fillShapes` move from
editor/soundfx/eqView to core/soundfx/parametricEq. Tab and node
draw the sum from the same function.
#374, the spectrum:
- A node marked `tapped` gets a `tap` stage in front of its own
stages and one behind them when compiled, in a sound FX and in an
instrument alike. Its id is asset and node, since a copied asset
keeps its node ids.
- A tap is a gain of 1. SpectrumTaps (new, viewport/spectrum.ts)
holds the tap of every voice and bus while it plays.
- While the EQ tab is seen, in the tab row or in a window, the taps
of that node feed one analyser per side (8192 points). Nothing is
made before a tap of the node plays, so no AudioContext is opened
early.
- The tab draws both behind the curve, on a scale of 0 to -96 dBFS:
the sound coming in faint and grey, the sound going on in the
colour of a sound port. The analyser smooths it, and once the
sound has gone the sum still hands it silence, so it falls away.
- Once the tab is not seen, Editor.tick lets the analysers go, like
the meters of the Song tab.
- A tap does nothing to the sound, so `stats().last.stages` leaves it
out, and a bypassed EQ keeps its taps.
Decided on my own:
- Every sound passing the node counts: Play of the sound FX tab, an
instrument's keys, a song, a run. The issue proposed that.
- The spectrum has no labels of its own. Its scale is in the wiki.
Tests:
Gate (melektaus-atx) 275 files, 4247 tests (11 new), EXIT 0
e2e 34 (melektaus-atx) ALL PASSED, 98 checks (2 new), twice
Counter-checks, each put back by copy and compared with cmp:
- The node's curve drawn without its bands: 2 unit tests fail.
- The spectrum without the loudest bin between two points: 1 fails.
- SpectrumTaps.stop leaving the taps linked: 1 fails.
- Taps that never feed the analyser: e2e 34 fails in exactly the
spectrum check (frames 0). Run in the container only.
The screenshots of the second run were looked at: the blip as one
peak behind the curve, and the dip at 4 kHz in the node.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>