Describe the Compressor's panel in its node (#380)

The panel of #379 is what a Compressor node shows in the graph now, and
a double-click opens the tab of #378 again.

- Sounds: the node's row in the table, and the section on the device in
  the node. Its ports sit beside it, its knobs and lever work there,
  typing stays in the tab, and the meter runs while the node is seen.
- Concepts: the window of one size for a Compressor is gone.
- Architecture: CompressorFace, nodeFaces, nodeParamDrag, and a face
  instead of the rows in NodeView.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-10 11:42:00 +02:00
1 parent 5ef7b8e2b4
commit 694aca4b07
3 files changed
+21 -17

No files matched your search

+5 -4
@@ -371,7 +371,7 @@ src/editor/graph/ GraphEditor (header, breadcrumb), GraphCanvas and what it
empty space opens, a transition armed from a state's menu), graphDrags (nodes, groups and
comments moved or resized, each gesture one undo step), annotationLayer (the boxes behind
the edges); graphView (zoom limits, grid, panAndZoom — shared with NodeBoard and the Tile tab's TileCanvas — and `inView`, which nodes are in the picture, #292), EdgeLayer (curves and fold marks), graphMenus,
NodeView (and the picture below the rows, drawn again only when the settings change, #375) + portRow (how an input and an output share one row, #306), NodePalette + paletteEntries (which also ranks a search), folding (hidden links, collapsed nodes), Breadcrumb + trail (the path into nested behaviors), beads (the run's pulses and the clock that launches them),
NodeView (and the picture below the rows, drawn again only when the settings change, #375, or a face instead of the rows, a widget between the inputs and the outputs, #380: `nodeFace.ts`) + portRow (how an input and an output share one row, #306), NodePalette + paletteEntries (which also ranks a search), folding (hidden links, collapsed nodes), Breadcrumb + trail (the path into nested behaviors), beads (the run's pulses and the clock that launches them),
AnnotationView + annotationDrag (groups and comments: what a drag carries, each thing moved once),
SnapToggle (the magnet every tab that snaps carries, the vector art tab included, #194)
src/editor/container/ ContainerEditor (header), ContainerCanvas (a SceneViewport on a template)
@@ -422,9 +422,10 @@ src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Pla
the picture, and the spectrum behind the curve, #374), CompressorEditor +
compressorView (#378: the Compressor's tab, its knobs, its curve with threshold and
ratio to drag, and the levels in and out tinted where it squeezes), CompressorPanel +
hardwareView (#379: the Compressor as a device in a window of one size, its meter,
LEDs and plate worked out apart from the drawing), nodeTabs (which nodes open a tab
of their own)
hardwareView (#379: the Compressor as a device, its meter, LEDs and plate worked
out apart from the drawing), CompressorFace + nodeFaces (#380: the panel as what a
Compressor node shows in the graph), nodeParamDrag (a knob's drag as one undo
step, for the tab and the node), nodeTabs (which nodes open a tab of their own)
src/editor/instrument/ InstrumentEditor (#331: the graph over the keys, Preset, Randomize, Mutate, Audition),
PianoKeyboard + keys (the keys drawn, played by the pointer and the computer keyboard)
src/editor/routing/ RoutingEditor (#351: the Master routing tab, one per project)
-3
@@ -361,9 +361,6 @@ one kind can be open at once — two textures, three behaviors — each with its
sizes it, *Dock* puts the document back into the row, showing, and the `×` closes it. Only
documents float, never Scene or Game. A window is at least 320 × 200 px. A tab that needs more,
like a Compressor's with its knobs (#378), holds its window at that size.
- **A Compressor in its hardware look** (#379) has a window only: a double-click opens it there
at one size, with no corner to size it and no *Dock*. Switched to that look while its tab is
in the row, it leaves the row for the window.
- Every kind has one editor, so it has **one window**: with a texture in a window, opening
another texture shows it there and closes the one it had. Windows of different kinds can be
open side by side, a sound FX beside its Parametric EQ for instance.
+16 -10
@@ -435,7 +435,7 @@ response of a Reverb, and as what the Sound FX tab tries out. Its row means noth
| **Phaser** | Sweeps notches through the sound, the swirl of a phaser pedal. **Stages** (2, 4, 6, 8 or 12, 4 by default) is how many allpass stages it has, every two make one notch. They sit around `frequency` (800 Hz by default), and an LFO moves them `depth` octaves wide (2), `rate` times a second (0.5 Hz). `feedback` (0.4) sharpens the notches, `wet` (1) is how much is heard. See [below](#phaser-and-flanger). |
| **Flanger** | Blends the sound with a copy a few ms late: the jet sound of a flanger, and what sfxr calls its phaser. `offset` is how late the copy is (1 ms by default), `sweep` moves that on by so many ms a second from the start of the sound (0), an LFO adds up to `depth` ms (2) `rate` times a second (0.25 Hz). `feedback` (0.5) and `wet` (1) as on the Phaser. See [below](#phaser-and-flanger). |
| **Pan** | Moves the sound left or right: `pan` -1 is all left, 1 all right, 0 (the default) leaves it in the middle. A mono sound is spread on both sides and then moved (each side 0.707 at 0). A stereo sound keeps the side it goes to and the other side moves over into it, as Web Audio's `StereoPannerNode` does: at 1 both sides are heard on the right. In an [instrument](Instruments#envelopes) an Envelope can move it. Measured (e2e 34, Chrome offline): a mono sine at 0.5 came out 0.5 / 0 at -1 and 0.354 / 0.354 at 0, a stereo one at 0.5 came out 0.354 / 0.854. |
| **Compressor** | Squeezes the loudness together: what goes above `threshold` (-24 dB by default) comes out only 1/`ratio` (4) as much louder. `knee` (6 dB) eases into it, `attack` (0.003 s) and `release` (0.25 s) say how fast it turns down and lets go. `makeup` (0 dB) raises it afterwards. **Auto-gain** (off) gives back what it takes from a sound at -18 dB, with the makeup on top. **Hardware look** (on) is how its editor looks: a double-click on the node opens a panel like a device in a window, with a meter of what it takes away; off, a tab with a knob for each number, its curve, and the level going in and out. See [below](#compressor-and-limiter). |
| **Compressor** | Squeezes the loudness together: what goes above `threshold` (-24 dB by default) comes out only 1/`ratio` (4) as much louder. `knee` (6 dB) eases into it, `attack` (0.003 s) and `release` (0.25 s) say how fast it turns down and lets go. `makeup` (0 dB) raises it afterwards. **Auto-gain** (off) gives back what it takes from a sound at -18 dB, with the makeup on top. The node is drawn as a device with a meter of what it takes away, and a double-click opens a tab with its curve and the level going in and out. See [below](#compressor-and-limiter). |
| **Limiter** | Keeps every peak below `threshold` (-6 dB): it looks 5 ms ahead, so even a sudden peak never gets through, and comes back up in `release` (0.1 s). **Auto-gain** (on) raises the limited sound to `ceiling` (-1 dB). Nothing ever goes above the ceiling. See [below](#compressor-and-limiter). |
| **Saturation** | Bends the sound, from warmth to a hard distortion. **Type**: *Soft (tanh)* (the default), *Cubic*, *Hard clip*, *Tube*, *Fuzz*, *Foldback*, *Sine fold* or *Rectify*. `drive` (12 dB) is how hard the sound is pushed into it, `tone` (1) a low-pass after it from 1 kHz (0) to wide open (1). **Auto-gain** (on) keeps the bent sound about as loud as it came in, `output` (0 dB) is added on top. `wet` (1) how much of it is heard instead of the sound itself. See [below](#saturation). |
| **Tremolo** | Makes the volume swing `rate` times a second (5 Hz by default), from full down by `depth` percent (50) and back. **Shape**: *Sine* (the default), *Triangle*, *Square* or *Saw*. See [below](#tremolo-and-vibrato). |
@@ -759,14 +759,16 @@ Both (#326) work on the whole sound passing them: on a voice that is one sound,
is a square at their right, centred up and down. It grows with the tab from 180 to 360 px, but
takes no more than 40 % of its width. A floated Compressor's window cannot be made smaller than
what shows every knob and the smallest pictures (560 × 414 px in the test browser).
- **The hardware look** (#379), on by default and switched under *Settings* in the inspector, is
the Compressor as a device on a brushed aluminium plate, 820x280 px. A double-click opens it
straight in a [window](Concepts) of that size: no corner sizes it and *Dock* is gone, so it
never sits in the tab row. Switched off, the node has the tab above again, and its window can
be sized and docked. All of the panel is drawn by the editor, there are no pictures.
- **The node is the device** (#379, #380): in the graph a Compressor is drawn as a brushed
aluminium plate, 820x280 graph units, with its inputs on the left of it and its output on the
right. The node is that large on purpose: the graph's zoom makes it smaller. Its settings and
numbers are not listed as rows, the panel shows them. All of the panel is drawn by the editor,
there are no pictures.
- **Chrome knobs**: threshold large on the left, makeup large on the right, ratio and knee small
beside the meter on the left, attack and release on its right. They turn, notch, reset and
take a typed number as the tab's knobs do, and the orange arc is the value.
beside the meter on the left, attack and release on its right. They turn, notch and reset as
the tab's knobs do, each one undo step, and the orange arc is the value. The number below a
knob is only shown: typing goes in the tab and in the inspector. A press on a knob or the
lever neither picks nor moves the node, and the wheel over a knob does not zoom the graph.
- **The meter** in the middle shows what the Compressor takes away, 0 dB at the right to 24 dB
at the left, red from 10 dB on. The scale runs by the square root, so the first dB is about
as wide as the last nine. The needle moves like a VU's: most of the way to a reading in
@@ -774,8 +776,12 @@ Both (#326) work on the whole sound passing them: on a voice that is one sound,
- **Auto-gain** is a lever with a lamp at the top right. Beside it stands what it gives.
- **The LEDs** at the right edge show the level going out, one every 3 dB from -39 to 0 dB:
the top two red, the next three amber. They light at once and go out by 20 dB a second.
- The pictures of the tab, curve and levels, are not on the panel. Switch the look off for
them.
- The meter and the LEDs run while the node is in the picture of a sound FX or instrument
graph that is seen, from the same taps as the tab. Out of the picture, folded or with the
graph hidden, the node lets go of them. A tab that is open but not seen lets go of them once,
so the node keeps hearing.
- The pictures of the tab, curve and levels, are not on the panel. A double-click on the node
opens the tab for them.
- **Measured** (2026-10-07, e2e 34, Chrome offline): an impulse came out of the Compressor 288
samples late and out of the Limiter 240. A 1 kHz sine at -18 dB through a hard-knee
Compressor at -24 dB and 4:1 came out at -17.92 dB with auto-gain on and at -22.42 dB with it