Describe the Sample device and its waveform (#400)

- Instruments: what the gold device shows and how its parts are set.
- Architecture: SamplePanel, SampleFace and sampleView.
- Development: 1976 editor checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
adminandClaude Opus 5.5 committed 2026-10-10 22:54:28 +02:00
1 parent 0ea28c52be
commit 5c47555710
3 files changed
+29 -1

No files matched your search

+4
@@ -453,6 +453,10 @@ src/editor/soundfx/ SoundFxEditor (#311: the graph, a sound to try it on, Pla
CrusherPanel + CrusherFace + crusherView (#399: the Bitcrusher as a device,
a sine sent through the node's own `Crusher` and drawn in cells of its steps
and holds, and the bits it keeps, worked out apart from the drawing),
SamplePanel + SampleFace + sampleView (#400: the Sample as a device, the
waveform of its sound or clip from the library's peaks, cut into what is
played once, looped, played after the note and never heard, 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)
+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 # 1975 editor checks, screenshots in /tmp/gm-e2e-*.png
node tools/seed-e2e.mjs && node tools/e2e.mjs # 1976 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
+24
@@ -44,6 +44,30 @@ stopped any more: a drone in a game is a *Loop* played by `Play note` with `dura
it until a `Stop sound`. A Sample saved with the former **Mode** and **Loop** is loaded as one of
these: *Gate* or *One-shot* without Loop stays what it was, either with Loop becomes *Loop*.
**The Sample is a device** (#400), a compact 480x280 graph units, a plate in polished gold.
`trigger` is on the left, `out` on the right, and everything is set right in the graph:
- the **sound** is picked from the button beside the name, sounds and their [clips](Sounds#clips)
alike, as in the inspector;
- a screen, **Waveform**, draws the sound or clip across its whole length, mirrored about the
middle, as loud as its volume plays it. Seconds run along the bottom, the length (and the volume,
where it is not 1) stands on the bezel. What becomes of each part has a colour of its own: gold
is played once, the **loop** is pale gold on a lit band between two lines, what *Loop, then
release* plays once the note is let go is amber (*After the note*), and what a *Loop* never gets
to is dark. Under the glass it says how it plays (`LOOPS 500 ms TO 900 ms WHILE HELD`) and at
what pitch (`AS IT IS AT C4`, or `AS IT IS ON EVERY NOTE` without *Follow note*). The loop is
drawn as both ways of playing hold it: an end of 0 or past the sound is the end of the sound, a
start not before the end loops all of it. Without a sound the screen says why: *No sound
picked*, *That sound is gone*, *The sound has no file*, *Loading* or *Cannot load*;
- a button for each **Play**, *Gate*, *One-shot*, *Loop* and *Loop+rel*, two by two;
- **Root** as a chrome knob that reads as a note (C4), and **Follow note** as a lever beside it
(*Follow*). A drag is one undo step, a double-click goes back to C4;
- **Start** above **End** of the loop as fields in seconds, typed in or scrubbed sideways.
Settings that do nothing as things stand are grey, as in the rows they replace: the root without
*Follow note*, the loop's ends without a loop. Nothing on it moves by itself. A new instrument
places its Output past the device.
**Triggers.** The outputs of a Notes node that say "this note" are of their own kind, a
**trigger**, drawn in lime. A trigger goes only into the `trigger` input of a source — nothing of a
behavior can get in, and it fits nothing else. A `trigger` input takes any number of edges, and