From 2a682acade5a1def40fa50a360747c77d903cbce Mon Sep 17 00:00:00 2001 From: MelekTaus Date: Sat, 10 Oct 2026 18:51:17 +0200 Subject: [PATCH] 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 --- Architecture.md | 4 +++- Development.md | 2 +- Sounds.md | 31 ++++++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Architecture.md b/Architecture.md index 119e50b..a4e8ad9 100644 --- a/Architecture.md +++ b/Architecture.md @@ -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), diff --git a/Development.md b/Development.md index 4f74ebd..bc662bf 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 # 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 diff --git a/Sounds.md b/Sounds.md index 3382553..61abc44 100644 --- a/Sounds.md +++ b/Sounds.md @@ -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