Add whole-take time shifting

Ctrl+Shift+Left/Right move every note in the take by one grid cell, for
clips that landed off the beat.

Since the whole take moves together, notes cannot collide with each other;
the hazard is the item boundary. Notes pushed past either end stop sounding
but are not deleted, so the operation is reversible -- shifting back restores
them. The plain keys still refuse when that would happen and report the count,
because a clip that has silently lost its first bar is a bad thing to discover
later. Ctrl+Alt+Shift forces it and names the consequence.

Positions are converted through QN rather than offset in raw ticks, so shifts
stay musically correct across tempo changes.
This commit is contained in:
2026-08-14 18:46:33 +02:00
parent 542f59e0db
commit 51dff21e85
7 changed files with 130 additions and 2 deletions
+23
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 |
| `Ctrl+Shift+Left` / `Ctrl+Shift+Right` | Shift **all** notes one cell, refusing if any would leave the item | — |
| `Ctrl+Alt+Shift+Left` / `Ctrl+Alt+Shift+Right` | Same, but shift anyway | — |
| `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 | — |
@@ -147,6 +149,27 @@ 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.
## Shifting notes in time
If a whole clip landed a couple of cells off the beat, `Ctrl+Shift+Left` and
`Ctrl+Shift+Right` move **every note in the take** by one grid cell.
Because the entire take moves together, notes can never collide with each
other. What is at stake is the **item boundary**: notes pushed past either end
stop sounding. They are *not* deleted — shifting back the other way brings
them straight back — but a clip that has quietly lost its first bar is not
something you want to discover two hours later.
So the plain keys **refuse** the shift if any note would end up outside, and
say how many: *"Not shifted left, 3 notes would fall outside the item. Add Alt
to force."*
Adding **Alt** (`Ctrl+Alt+Shift+Left` / `Right`) does it anyway, reporting the
consequence: *"Shifted left, 3 notes now outside the item and silent."*
Positions are converted through quarter-notes rather than offset in raw ticks,
so a shift stays musically correct across tempo changes.
## Chords
`Alt+3` stamps a **diatonic triad** on the cursor pitch; `Alt+7` a seventh