diff --git a/Development.md b/Development.md index 6aafb4c..4ba1bae 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 # 1857 editor checks, screenshots in /tmp/gm-e2e-*.png +node tools/seed-e2e.mjs && node tools/e2e.mjs # 1860 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/Patterns.md b/Patterns.md index fcd4a26..e1c1364 100644 --- a/Patterns.md +++ b/Patterns.md @@ -34,8 +34,9 @@ the pointer turns into a resize arrow, as on an item of the [Song tab](Songs#the can be dragged. Below them is the **velocity lane**: a stem at the start of every note, as high as its velocity. -The header has **Play** (it turns into **Stop**), the **Grid**, **Audition**, **Fit** and on the -right the number of notes and the instrument. **Audition** is off when the tab opens; switched on, a +The header has **Play** (it turns into **Stop**), the **Grid**, **Audition**, **Ghosts** with where +the [ghost notes](#ghost-notes-from-the-song) come from, **Fit** and on the right the number of notes +and the instrument. **Audition** is off when the tab opens; switched on, a note sounds for a moment when it is drawn, grabbed or moved to another key. The keys down the left sound either way. **Fit** shows the whole pattern across and its notes (or, with none, what the instrument plays) down the middle, the rows zoomed so they fill the height (up to 64 px a row). @@ -44,7 +45,7 @@ instrument plays) down the middle, the rows zoomed so they fill the height (up t | Do this | And this happens | |---|---| -| Click into the grid | A note at the grid line before the pointer, as long as the last note drawn or lengthened (a grid step at first), with the last velocity set (0.8 at first). It is picked and, with **Audition** on, sounds for a moment. | +| Click into the grid | A note at the grid line before the pointer, as long as the last note drawn or lengthened (a grid step at first), with the last velocity set (0.8 at first). It is picked and, with **Audition** on, sounds for a moment. Only inside the pattern: left of bar 1 and from its end on a click draws nothing. | | Drag a note by its body | It moves along the grid and to the key under the pointer, the other picked notes with it. With **Audition** on it sounds when grabbed and again on every new key. | | Drag a note by its right end | It takes the length to the grid line nearest the pointer, the other picked notes lengthen by as much. | | Drag a note by its left end | Its start goes to the grid line nearest the pointer and its end stays put; the other picked notes' starts move by as much. Never before tick 0. | @@ -60,7 +61,7 @@ Every drag is one undo step, and so is every key below that changes notes. |---|---| | `Space` | Play or stop. | | `Delete`, `Backspace` | Delete the picked notes. With none picked the key does nothing, so a second press never asks about the pattern itself. | -| `Ctrl+C`, `Ctrl+V` | Copy the picked notes; paste them under the pointer: the earliest on the grid line before it, the highest on its row, as far as the keyboard goes. With the pointer off the grid (or left of bar 1) the earliest lands where playing starts, on the keys they came from. The copy works for every pattern of the project. | +| `Ctrl+C`, `Ctrl+V` | Copy the picked notes; paste them under the pointer: the earliest on the grid line before it, the highest on its row, as far as the keyboard goes. With the pointer off the grid (or outside the pattern) the earliest lands where playing starts, on the keys they came from. The copy works for every pattern of the project. | | `Ctrl+D` | A copy of the picked notes right behind them, moved by whole grid steps, picked in their place. | | `Ctrl+A` | Pick every note. | | `↑` / `↓` | The picked notes a semitone up or down, with `Shift` an octave. | @@ -89,11 +90,43 @@ and below it the bars and beats, which hold where playing starts. The wheel zooms and does nothing else: over the grid, the ruler or the velocity lane it zooms the time about the pointer, over the keys it zooms the rows (6 to 64 px). `Alt` and `Shift` do not change it. A middle-drag pans both ways. Bar 1 need not stay at the left edge: a pan takes it up to half the -grid in. The time before it is drawn dark, only to look at; a click there draws no note. Down the +grid in, and with [ghost notes](#ghost-notes-from-the-song) back to the start of the song. The time +before it and from the end of the pattern on is drawn dark, only to look at; a click there draws no +note. Down the grid the same: the highest note can come up to half the height down from the top, the lowest up to half the height up from the bottom, the room past them dark and with nothing to draw. `Ctrl`+wheel is left to the browser, which zooms the page with it. Only what is on screen is drawn, so a pattern of some hundred notes stays quick. +### Ghost notes from the song + +A pattern opened by a **double-click on its item** in the [Song tab](Songs#the-song-tab) shows +what else the song plays around that item, faint: grey boxes without an edge, under the pattern's +own notes. They cannot be clicked or picked; resting the pointer on one tells its track and its +pattern. The header names where they come from, for example *Tune · Bass · bar 5*. **Ghosts** +switches them off and on, and is on when the tab opens. + +- **Which round:** an item plays its pattern round and round for as long as it is. The round + double-clicked into is the one edited; it starts at bar 1 of the roll. +- **What counts:** every pattern item of the other tracks, all along the song. On the item's own + track the items before and after it and its other rounds. The round edited itself does not + count, so ghost notes of the own track only ever show outside the pattern. Sound items have no + notes and do not show. +- **Which row:** a ghost note is drawn where it sounds, with the transpose of its own item, less + the transpose of the item the pattern was opened from. So a note drawn on the row of a ghost note + sounds together with it in the song. +- **How long it holds:** the item is remembered for the pattern while the project is open. The + pattern opened again from the Assets panel shows the same item; moving the item in the song moves + its ghost notes along. Without a double-click, a pattern that lies in exactly one item of all the + songs shows that one, its first round. A pattern used several times shows none until one of its + items is double-clicked. The item gone or set to another pattern, they are gone too. Nothing of + this is saved with the project. +- **Play** still plays only the pattern. **Fit** frames only the pattern. + +Measured (2026-10-07, e2e 65): a pattern item on the third track, double-clicked into its second +round, with the same pattern a tone up on the second track from bar 1: all 8 notes of the second +track were drawn a tone up, each at its tick of the song less where the round starts; the header +said *Song · Track 3 · bar 4*, and resting on a ghost note showed *Track 2 · Riff 65*. + ## Playing **Space** or **Play** plays the pattern round its loop from where playing starts, through the @@ -146,6 +179,6 @@ once it was gone by itself after its bar. ## Not yet -No notes of other patterns in the background (ghost notes, #339), no lanes for +No ghost notes from another pattern without a song, no lanes for pitch bend or an instrument's parameters (automation, #337), no swing. The computer keyboard does not play notes in this tab as it does in the Instrument tab, and there is no step input. diff --git a/Songs.md b/Songs.md index 1a7a4a1..b484b86 100644 --- a/Songs.md +++ b/Songs.md @@ -83,7 +83,7 @@ right-click menu, not from the inspector. | Click a head | Picks its track. | | `Shift`-click an item | Adds it to the pick or takes it out. Dragged on with `Shift`, it is added and moved or sized off the grid instead. | | Right-click an item | Opens its menu: *Delete* deletes it, or every picked item where it is one of them. | -| Double-click a pattern item | Opens the pattern in the Pattern tab. | +| Double-click a pattern item | Opens the pattern in the Pattern tab, with what the song plays around the round clicked into as [ghost notes](Patterns#ghost-notes-from-the-song). | | Click **M** or **S** in a head | Mutes or solos the track. | | Click **FX** in a head | A menu of the project's sound FX: one of them for the track, or *No sound FX*. | | Drag along a head's volume or pan | Sets it; while the song plays it is heard as it moves. |