Add note length editing for sustaining already-entered notes

Hold mode only governs entry, so sustaining existing notes previously meant
toggling hold on and re-entering them. That works but deletes and recreates
each note, silently resetting velocity to the default.

L and Shift+L resize the note under the cursor by whole grid cells, editing it
in place so velocity, channel and note identity survive. They are independent
of hold mode, so there is no state to set up or unset. Alt+J fuses a whole run
of repeated notes at one pitch in a single keystroke.

Lengthening absorbs same-pitch notes it runs into, taking their tail if longer,
so growing across a repeated run fuses it instead of creating overlaps.

Also makes noteEndingAt/noteStartingAt public and fixes their two call sites in
toggleCell, which would otherwise have been nil-call errors in hold mode.
This commit is contained in:
2026-08-14 18:27:14 +02:00
parent c9e927ca3d
commit 542f59e0db
6 changed files with 200 additions and 6 deletions
+32
View File
@@ -72,6 +72,8 @@ actions by hand in Actions → Show action list. That always works.
| `Left` / `Right` | Cursor back / forward one grid cell | OSARA previous / next chord |
| `Up` / `Down` | Pitch up / down one scale degree | OSARA higher / lower note in chord |
| `Enter` | Toggle note at cursor cell | Edit: Event properties |
| `L` / `Shift+L` | Lengthen / shorten note by one cell | Edit: Lengthen / shorten notes one grid unit |
| `Alt+J` | Join a run of repeated notes into one | — |
| `Alt+3` | Toggle diatonic triad on cursor pitch | — |
| `Alt+7` | Toggle diatonic seventh chord | — |
| `Alt+Shift+Up` / `Alt+Shift+Down` | Velocity up / down | — |
@@ -115,6 +117,36 @@ it into one sustained note. Toggling a cell off in the middle of a sustained
run splits it in two; at either end, it shortens it. So you can draw a long
note by arrowing right and pressing Enter across several cells.
Hold mode governs **entry only** — it never retroactively merges notes that
are already there. To sustain what you have already written, use the length
keys below.
## Note length — sustaining notes you already entered
- **`L`** — lengthen the note under the cursor by one grid cell.
- **`Shift+L`** — shorten it by one cell. It never shrinks below a single
cell; it says *"minimum"* rather than deleting the note.
- **`Alt+J`** — fuse an entire run of repeated notes at this pitch into one
sustained note, in a single keystroke.
Lengthening **swallows** any same-pitch note it runs into, taking that note's
tail if it reached further. So pressing `L` across a row of repeated notes
fuses them rather than producing overlaps.
Each press reports the resulting length — *"E5, 3 cells"*, or *"E5, 2 cells,
joined 1"* when it absorbed something.
### Why not re-toggle with hold on instead?
Turning hold on and re-entering existing notes does work. But toggling a note
off and on **deletes and recreates it, resetting its velocity to the default**
— if you have shaped dynamics, that quietly discards them.
The length keys edit the note in place, so velocity, channel and note identity
survive. They also need no mode: `L` behaves identically whether hold is on or
off, so there is no state to set up beforehand and none to remember to turn
off afterwards.
## Chords
`Alt+3` stamps a **diatonic triad** on the cursor pitch; `Alt+7` a seventh