Describe the Compressor's hardware look (#379)

- Sounds: the Hardware look setting in the table, and a section on
  the panel, its window of one size, knobs, meter, lever and LEDs.
- Concepts: a Compressor in its hardware look has a window only.
- Architecture: CompressorPanel + hardwareView, the chrome Knob.
- Development and README: 1953 checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-10 02:06:57 +02:00
1 parent a51884fafb
commit 5ef7b8e2b4
4 files changed
+27 -5

No files matched your search

+5 -3
@@ -214,7 +214,7 @@ src/runtime/physics/ engine (loads Rapier once, reports its state, converts be
src/ui/ widget toolkit (generic, knows nothing about assets); fonts (the faces the editor ships:
Source Sans 3 in 400, 500 and 600, Source Code Pro 400, Latin only, #202/#214/#273), icons +
Icon (the menu's tick boxes and current-entry dot as SVG files, and a widget that shows one file
on its own: a symbol the Latin subset lacks is never written as a character, #214); SortableList + sortable (the layer list of every editor that has one: rows dragged into order, eye, duplicate, cross, rename in place; the index arithmetic of a list shown upside down, of a drop in the tile strip and of blocks of rows of any height, kept apart so it is measured without a canvas); blockDrag (`sortBlocks`: the inspector's own rows dragged into order by a `Grip` (the row's mark, wrapped: dots once it drags, lit under the pointer while the block is washed), a block being every row it covers, #310); Knob + knob (#378: a slider bent into a circle, its name above and a number field below; where a value sits on the turn and what a drag or the wheel makes of it, kept apart so it is measured without a canvas)
on its own: a symbol the Latin subset lacks is never written as a character, #214); SortableList + sortable (the layer list of every editor that has one: rows dragged into order, eye, duplicate, cross, rename in place; the index arithmetic of a list shown upside down, of a drop in the tile strip and of blocks of rows of any height, kept apart so it is measured without a canvas); blockDrag (`sortBlocks`: the inspector's own rows dragged into order by a `Grip` (the row's mark, wrapped: dots once it drags, lit under the pointer while the block is washed), a block being every row it covers, #310); Knob + knob (#378: a slider bent into a circle, its name above and a number field below, or a chrome dial of any size, #379; where a value sits on the turn and what a drag or the wheel makes of it, kept apart so it is measured without a canvas)
src/viewport/ WorldViewport (the drawing of a world or a holder, the base of every view; it draws from
a `ViewSource` — the project and word of a change — so a released game draws without the
editor, #266; a view through a camera keeps only what that camera `Sees` and lays one
@@ -421,8 +421,10 @@ src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Pla
EqEditor + eqView (#367/#370: the Parametric EQ in a tab of its own, its handles on
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), nodeTabs (which
nodes open a tab of their own)
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)
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,6 +361,9 @@ 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.
+1 -1
@@ -19,7 +19,7 @@ php tests/php/accounts.test.php # the API's accoun
php tests/php/snapshots.test.php # the snapshot store (#231), the same way
php tests/php/releases.test.php # the release store (#266), the same way
php tests/php/files.test.php # uploaded files in a folder per account (#344), the same way
node tools/seed-e2e.mjs && node tools/e2e.mjs # 1949 editor checks, screenshots in /tmp/gm-e2e-*.png
node tools/seed-e2e.mjs && node tools/e2e.mjs # 1953 editor checks, screenshots in /tmp/gm-e2e-*.png
GM_STEPS=20 node tools/e2e.mjs # or 1-12, or 6,20 — a subset while working on one step
./e2e.sh start [GM_STEPS] # the same run detached, see below
./e2e.sh status # live progress, or the last run's result
+18 -1
@@ -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. A double-click on the node opens its tab: 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. **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). |
| **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,6 +759,23 @@ 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.
- **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.
- **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
300 ms. The LCD above shows the asset's name and the same reading as a number.
- **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.
- **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