diff --git a/Architecture.md b/Architecture.md index c3aca2e..e1c125d 100644 --- a/Architecture.md +++ b/Architecture.md @@ -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) diff --git a/Concepts.md b/Concepts.md index 075618c..5e62450 100644 --- a/Concepts.md +++ b/Concepts.md @@ -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. diff --git a/Development.md b/Development.md index 1efd0af..26ece2b 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 # 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 diff --git a/Sounds.md b/Sounds.md index b266a95..1ff63d8 100644 --- a/Sounds.md +++ b/Sounds.md @@ -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