Describe the Delay node as a device with its echoes (#393)

- Sounds: the Delay row and a section on the device, its screen, the
  running light, the levers and the knobs.
- Architecture: DelayPanel, DelayFace and delayView.
- Development: 1968 editor checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-10 18:51:17 +02:00
1 parent 726422609f
commit 2a682acade
3 files changed
+34 -3

No files matched your search

+3 -1
@@ -438,7 +438,9 @@ src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Pla
(#388: the Envelope as a device, its curve over a note with squeezed time worked
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
the drawing), DelayPanel + DelayFace + delayView (#393: the Delay as a device,
its echoes as bars on a screen and the light that runs over them at their beat
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),
+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 # 1967 editor checks, screenshots in /tmp/gm-e2e-*.png
node tools/seed-e2e.mjs && node tools/e2e.mjs # 1968 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
+30 -1
@@ -430,7 +430,7 @@ response of a Reverb, and as what the Sound FX tab tries out. Its row means noth
| **Parametric EQ** | Up to 10 bands, each a filter of its own type, frequency, gain, Q and slope, drawn together as one curve. The node shows its editor right in the graph, and a **double-click on the node's title** opens the same in a tab. Both show the spectrum of what passes the node. A new node has no band and does nothing. See [below](#parametric-eq). |
| **Filter** | **Type** *Low-pass* (the default) takes away what is above `frequency` (Hz, 1000 by default), *High-pass* what is below it, *Band-pass* all but a band around it and *Notch* just that band. *Low shelf* and *High shelf* raise or lower everything below or above it by `gain` (dB), *Peaking* a band around it; only these three have the `gain` row. *All-pass* leaves every frequency as loud as it was and only turns its phase. `Q` (0.707 by default) says how sharp it is: at 0.707 a low- or high-pass has no bump, higher it rings at the frequency, and a band, a notch or a peak gets narrower. **Slope** makes a low-pass, high-pass, band-pass or notch steeper: *12 dB/oct* is one filter, *24* two and *48* four in a row, and only the last of them has the Q. In an [instrument](Instruments#envelopes) an Envelope can move all three numbers while a note plays. The node draws itself as a curve and is edited right in the graph, and a **double-click on the node's title** opens the same in a tab. See [below](#filter). |
| **Mix** | Blends the sounds at `a` and `b`: at 0 only `a` is heard, at 1 only `b` (0.5 is the default). **Curve** says what lies between: *Crossfade* (the default) gives half of each at 0.5, *Both at center* keeps each full up to the middle. See [below](#the-curve-of-a-mix). In the graph the node is drawn as a blue device of 180x200 graph units (#390): a lever for **Curve** on top, down for *Crossfade* and up, with its lamp lit, for *Both at center*, and below it one knob for `Mix` with *A* and *B* engraved at the ends of its turn. A flip of the lever is one undo step. A linked `Mix` greys the knob. |
| **Delay** | An echo: the sound comes back after `time`, again and again, each time `feedback` times as loud. **Sync** says what `time` counts: *Seconds*, or *Beats* in quarter notes at the tempo of the voice. `damping` makes every echo duller than the last. `wet` (0.5) is the sound alone at 0, the sound and its echoes in full at 0.5, the echoes alone at 1. **Ping-pong** sends the echoes left and right in turn. See [below](#delay-and-the-tail-of-a-voice). |
| **Delay** | An echo: the sound comes back after `time`, again and again, each time `feedback` times as loud. **Sync** says what `time` counts: *Seconds*, or *Beats* in quarter notes at the tempo of the voice. `damping` makes every echo duller than the last. `wet` (0.5) is the sound alone at 0, the sound and its echoes in full at 0.5, the echoes alone at 1. **Ping-pong** sends the echoes left and right in turn. The node is drawn as a device with its echoes on a screen (#393). See [below](#delay-and-the-tail-of-a-voice). |
| **Bitcrusher** | Makes the sound rough, like an old console. `bits` rounds it to fewer steps (8 by default), `rate` takes a sample only so many times a second and holds it until the next (8000 Hz by default), `wet` is how much of the crushed sound is heard instead of the sound itself (1 by default). See [below](#bitcrusher). |
| **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). |
@@ -599,6 +599,35 @@ Defaults: `time` 0.25 s, `feedback` 0.4, `damping` 0.3, `wet` 0.5, Ping-pong off
loop costs one render quantum each time round (measured in e2e 34: echoes 1 to 4 at 0, 128, 256
and 384 samples late). After ten echoes at 0.3 s that is 27 ms. It is left so, because a browser
without it would then hear the echoes early.
- **The device** (#393): in the graph the node is a plate of 680x280 graph units in the
Compressor's brushed aluminium, its inputs on the left and its output on the right.
- **The screen** (*Echoes over time*) draws the sound as a white bar at the left and every echo
after it as a bar, one step of `time` apart, with a faint line at each step. A bar is as tall
as the echo is loud, evenly in dB down to 60 dB below the sound. Its colour is how much of the
highs is left: warm white for the first rounds, rust once `damping` has taken them. Each round
goes through the low-pass once more, so each bar is a little more rust than the last.
- With **Ping-pong** the bars take turns above the middle line (*L*, the first) and below it
(*R*). Without it every bar stands both ways.
- It draws at most 24 echoes. Where more are heard it says how many more (`+59`).
- Under the screen it says the step (`EVERY 250 ms`, on beats `EVERY 1/8. · 375 ms AT 120 BPM`)
and when the last echo has faded (`ENDS 2 s`, the same count as the [tail](#delay-and-the-tail-of-a-voice)
below), above it where the first echo's highs end (`HIGHS 6.6 kHz`). At `wet` 0 it says
`NO ECHOES`.
- **A light runs over the screen** in real time, from the sound to the end and round again, so
it passes the bars at the very beat the echoes come at. A bar glows as it is passed, and the
green *Echo* lamp beside the name blinks with every echo, not with the sound. The node keeps
the editor drawing for that while it is in the picture.
- On beats the screen counts at **120 BPM**: the tempo of the voice is not known in the graph.
Everything else is drawn from the settings, nothing is listened to while the sound plays.
- **On the plate**: two levers, *Sync* (down *seconds*, up *beats*) and *Ping-pong* (down *off*,
up *L · R*), each one undo step, and four chrome knobs, `Time` under *Time*, `Feedback` and
`Damping` under *Echoes*, `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. A wired number locks its knob.
- `Time` gives its short end most of the turn: a quarter note, or a second, in the middle, a
quarter second at a third. On beats its number is the note (`1/4`, `1/8.` dotted, `1/8T`
triplet), else its beats. In seconds anything from 2 s up reads `2 s max`, the length of the line.
- At `wet` 0 the other knobs and the levers are drawn faint: they do nothing then. They still turn.
**A voice lasts until its echoes have faded** (#324). Without an echo a voice ends with its sound,
as it always did. With one, it rings on for its **tail**: until the last echo is 60 dB below the