Describe the Reverb node as a device with its tail (#389)

- Sounds: the Reverb's row names the device, and the Reverb section
  says what the round screen draws and how the plate is worked.
- Architecture: ReverbPanel, ReverbFace, reverbView, and that
  nodeParamDrag writes several settings at once.
- Development: 1964 checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-10 16:36:10 +02:00
1 parent e7379d38a2
commit 55cdec92ec
3 files changed
+33 -4

No files matched your search

+5 -2
@@ -434,8 +434,11 @@ src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Pla
wave and its pitch over a note worked out apart from the drawing, the wave and its pitch over a note worked out apart from the drawing, the
Compressor's `Lever` for "follow note"), EnvelopePanel + EnvelopeFace + envelopeView Compressor's `Lever` for "follow note"), EnvelopePanel + EnvelopeFace + envelopeView
(#388: the Envelope as a device, its curve over a note with squeezed time worked (#388: the Envelope as a device, its curve over a note with squeezed time worked
out apart from the drawing), nodeParamDrag (a knob's drag as one undo out apart from the drawing), ReverbPanel + ReverbFace + reverbView (#389: the
step, for the tab and the node), nodeTabs (which nodes open a tab of their own) Reverb as a device, its tail as rings on a round screen worked out apart from
the drawing), nodeParamDrag (a knob's drag as one undo step, for the tab and the
node, several settings at once since #389), nodeTabs (which nodes open a tab of
their own)
src/editor/instrument/ InstrumentEditor (#331: the graph over the keys, Preset, Randomize, Mutate, Audition), 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) 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) src/editor/routing/ RoutingEditor (#351: the Master routing tab, one per project)
+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/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/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 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 # 1963 editor checks, screenshots in /tmp/gm-e2e-*.png node tools/seed-e2e.mjs && node tools/e2e.mjs # 1964 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 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 start [GM_STEPS] # the same run detached, see below
./e2e.sh status # live progress, or the last run's result ./e2e.sh status # live progress, or the last run's result
+27 -1
@@ -440,7 +440,7 @@ response of a Reverb, and as what the Sound FX tab tries out. Its row means noth
| **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). | | **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). | | **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). |
| **Vibrato** | Makes the pitch swing `rate` times a second (5 Hz), `depth` semitones up and as far down (0.5). **Shape** as on the Tremolo; a *Square* jumps between two pitches. See [below](#tremolo-and-vibrato). | | **Vibrato** | Makes the pitch swing `rate` times a second (5 Hz), `depth` semitones up and as far down (0.5). **Shape** as on the Tremolo; a *Square* jumps between two pitches. See [below](#tremolo-and-vibrato). |
| **Reverb** | The sound in a space. **Type**: *Room* (the default), *Hall*, *Cave*, *Plate*, *Custom* or *Sound*. Custom shows the rows `decay` (s, 1.5 by default), `damping` (0.4) and `pre-delay` (s, 0.01); Sound picks a sound asset as the impulse response of a real space, with `pre-delay`. `wet` (0.3) is how much of the reverb is heard instead of the sound itself. See [below](#reverb). | | **Reverb** | The sound in a space. **Type**: *Room* (the default), *Hall*, *Cave*, *Plate*, *Custom* or *Sound*. Custom shows the rows `decay` (s, 1.5 by default), `damping` (0.4) and `pre-delay` (s, 0.01); Sound picks a sound asset as the impulse response of a real space, with `pre-delay`. `wet` (0.3) is how much of the reverb is heard instead of the sound itself. The node is drawn as a device with a round screen of its tail (#389). See [below](#reverb). |
Every number of these nodes is an **input**: typed in while nothing is connected, or fed from a Every number of these nodes is an **input**: typed in while nothing is connected, or fed from a
parameter of the Input. Each is held to its range (Gain -120 to +24 dB, Pitch -64 to +64, the EQ parameter of the Input. Each is held to its range (Gain -120 to +24 dB, Pitch -64 to +64, the EQ
@@ -922,6 +922,32 @@ share of a sound there).
sound. sound.
- **Cost**: every voice with a Reverb folds its sound with the whole impulse response. Many short - **Cost**: every voice with a Reverb folds its sound with the whole impulse response. Many short
sounds at once, each with a long decay, are better sent through one bus. sounds at once, each with a long decay, are better sent through one bus.
- **The device** (#389): in the graph the node is a plate of 640x280 graph units in pale lavender,
its inputs on the left and its output on the right.
- **The round screen** draws the tail as rings out from the sound, the white dot in the middle.
How far out a ring sits is its time, as the root of its seconds, the same scale for every
Reverb with faint rings at 0.1, 0.5, 1, 2, 5 and 10 s. So a Room is a small disc and a Cave
fills two thirds. The dark gap round the dot is the pre-delay, the dashed ring is where the
tail has fallen by 60 dB.
- A ring is as bright as the tail is loud there, evenly in dB. Its colour is how much of the
highs is left: ice while they are there, violet once `damping` has closed them towards 500 Hz.
Dots scattered over it stand for the reflections and grow thicker further out.
- The lower `wet` is, the fainter the tail and the brighter the dot.
- Under the screen it says the pre-delay and when the tail has died (`ENDS 2.52 s`), above it
where the highs end up (`HIGHS 5.5 kHz`).
- A *Sound* draws the peaks of its sound as the rings, each against its loudest. The screen knows
nothing of the highs there, so the rings are a neutral blue. It says `LOADING` until the sound
is there, and `NO SOUND` without one.
- **On the plate**: a button for each type, the sound for *Sound* and four chrome knobs, `Decay`,
`Damping` and `Pre-delay` under *Space*, `Wet` under *Mix*.
- The knobs work as the Compressor's do: drag up or down, a double-click resets one, each turn
one undo step, the wheel zooms the graph. The decay gives its first seconds most of the turn,
the pre-delay its first tens of milliseconds.
- A knob the type does not take is greyed but still turns: it goes over to *Custom* with the
numbers the type had and the one turned, as one undo step. So turning the damping of a Hall
gives a Hall with that damping.
- Picking a sound from the list under the buttons makes the type *Sound*, also one undo step.
- A linked input greys its knob.
- **Measured** (2026-10-07, e2e 34, Chrome offline): an impulse through a *Custom* reverb of 1 s with - **Measured** (2026-10-07, e2e 34, Chrome offline): an impulse through a *Custom* reverb of 1 s with
50 ms pre-delay was silent up to 50 ms after it, and fell by 35.9 dB from 0.2-0.3 s to 0.8-0.9 s 50 ms pre-delay was silent up to 50 ms after it, and fell by 35.9 dB from 0.2-0.3 s to 0.8-0.9 s
after it (36 dB to be expected). At `wet` 0.5 the impulse itself came through at half. With a sound after it (36 dB to be expected). At `wet` 0.5 the impulse itself came through at half. With a sound