From 55cdec92ecfaf482da5014f3723b69b3901d4d7d Mon Sep 17 00:00:00 2001 From: MelekTaus Date: Sat, 10 Oct 2026 16:36:10 +0200 Subject: [PATCH] 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 --- Architecture.md | 7 +++++-- Development.md | 2 +- Sounds.md | 28 +++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Architecture.md b/Architecture.md index f010e09..919d236 100644 --- a/Architecture.md +++ b/Architecture.md @@ -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 Compressor's `Lever` for "follow note"), EnvelopePanel + EnvelopeFace + envelopeView (#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 - step, for the tab and the node), nodeTabs (which nodes open a tab of their own) + out apart from the drawing), ReverbPanel + ReverbFace + reverbView (#389: the + 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), 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) diff --git a/Development.md b/Development.md index f8b7dfe..356db44 100644 --- a/Development.md +++ b/Development.md @@ -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 # 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 ./e2e.sh start [GM_STEPS] # the same run detached, see below ./e2e.sh status # live progress, or the last run's result diff --git a/Sounds.md b/Sounds.md index d7e35d6..228b502 100644 --- a/Sounds.md +++ b/Sounds.md @@ -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). | | **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). | -| **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 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. - **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. +- **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 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