diff --git a/Architecture.md b/Architecture.md index 4c218a2..ea5d36b 100644 --- a/Architecture.md +++ b/Architecture.md @@ -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) diff --git a/Development.md b/Development.md index 69f5c53..49d35bb 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 # 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 diff --git a/Instruments.md b/Instruments.md index ed92533..a72e4ee 100644 --- a/Instruments.md +++ b/Instruments.md @@ -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