Add octave jumps and jumping to notes that exist
Arrowing cell by cell is right inside a dense bar and tedious across an empty one. Three pairs of keys now jump straight to a note that is really there, one pair for each axis: Alt+Up/Down the column -- next pitch sounding in this cell Alt+Left/Right the row -- next note at the cursor's pitch Ctrl+Alt+Left/Right anywhere -- next note in the take, any pitch plus Ctrl+Alt+Up/Down for whole-octave movement, which needs no scale awareness because an octave preserves the pitch class. All the jumps ignore muted notes, which are not audible content, and the row and any-note jumps anchor on note starts, so a note held across eight cells is one stop rather than eight. Landing in a chord takes whichever note is nearest the pitch you came from rather than always the bottom one. They sit on Ctrl+Alt rather than plain Ctrl because REAPER already uses Ctrl+arrows to move between items. The logic lives in the lib as usual, with four run* drivers following the runShift pattern, so the eight new action scripts are seven lines each. test_lib.lua previously dofile'd an absolute D:\ path and so could not run outside one machine; it now resolves the lib relative to itself. Stubbing MIDI_GetNote and the PPQ conversions reaches further than the old "pure logic only" boundary, so the new tests cover the search functions and the drivers' speech and cursor movement too.
This commit is contained in:
@@ -5,6 +5,8 @@ keyboard-and-speech use with [OSARA](https://osara.reaperaccessibility.com/).
|
||||
|
||||
Left and right walk the timeline one grid cell at a time. Up and down walk the
|
||||
pitch axis **by scale degree**. Enter toggles a note in the current cell.
|
||||
With a modifier the same arrows jump an octave, or straight to the next note
|
||||
that actually exists — up the cell, along the pitch, or anywhere in the take.
|
||||
Everything you land on is spoken and sounded, so you can hear what is already
|
||||
there as you move.
|
||||
|
||||
@@ -145,6 +147,10 @@ above. Binding by hand in the action list 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 |
|
||||
| `Ctrl+Alt+Up` / `Ctrl+Alt+Down` | Pitch up / down one **octave** | OSARA higher / lower note in chord |
|
||||
| `Alt+Up` / `Alt+Down` | Jump to the next note above / below **in this cell** | OSARA higher / lower note in chord |
|
||||
| `Alt+Left` / `Alt+Right` | Jump to the previous / next note **at this pitch** | OSARA previous / next chord |
|
||||
| `Ctrl+Alt+Left` / `Ctrl+Alt+Right` | Jump to the previous / next note **anywhere** | OSARA previous / next 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 | — |
|
||||
@@ -186,6 +192,59 @@ the editor to toggle back off.
|
||||
pitch: `"E5, on"`.
|
||||
- **Enter** — `"E5 on, added"` or `"E5 off, removed"`.
|
||||
|
||||
## Octaves
|
||||
|
||||
`Ctrl+Alt+Up` and `Ctrl+Alt+Down` move a whole octave, keeping the pitch class.
|
||||
|
||||
This needs no scale awareness, because an octave is transpositionally neutral:
|
||||
a scale tone stays a scale tone, and a note you deliberately put outside the
|
||||
key stays outside it. It is also the quick way to cover distance — seven
|
||||
presses of `Up` to cross an octave in a major scale, one press of
|
||||
`Ctrl+Alt+Up`.
|
||||
|
||||
At either end of the MIDI range it says *"top"* or *"bottom"* and stays put,
|
||||
rather than clamping to a partial jump.
|
||||
|
||||
## Jumping to notes that exist
|
||||
|
||||
Arrowing cell by cell is right inside a dense bar and tedious across an empty
|
||||
one. Three pairs of keys jump straight to a note that is really there, one
|
||||
pair for each axis you might be looking along.
|
||||
|
||||
- **`Alt+Up` / `Alt+Down` — the column.** The next note above or below *in the
|
||||
cell you are already on*; time does not move. This is how you walk a chord
|
||||
you have stacked up — it stops only where notes are, so you never count
|
||||
scale degrees through the gaps. Speaks the note, as `Up` and `Down` do:
|
||||
*"E5, on"*.
|
||||
- **`Alt+Left` / `Alt+Right` — the row.** The next note *at the pitch you are
|
||||
on*, backwards or forwards in time; the pitch cursor stays put. Use it to
|
||||
follow one line — a bass note, a hi-hat — through a bar with plenty else
|
||||
going on. Speaks the cell it landed in, as `Left` and `Right` do:
|
||||
*"2.1.00, C5"*.
|
||||
- **`Ctrl+Alt+Left` / `Ctrl+Alt+Right` — anywhere.** The next note in the take
|
||||
whatever its pitch; both cursors move. This is the one for crossing empty
|
||||
space. When it lands in a chord it takes whichever note is nearest the pitch
|
||||
you came from, rather than always the bottom one, and names it when the cell
|
||||
holds more than one: *"1.1.00, C5, E5, G5, cursor G5"*.
|
||||
|
||||
Two rules they all share.
|
||||
|
||||
**Muted notes are invisible to them.** A muted note makes no sound, so stopping
|
||||
on one and announcing it would be a lie.
|
||||
|
||||
**A sustained note is one stop, not one per cell it covers.** The row and
|
||||
any-note jumps anchor on note *starts*, so a note held across eight cells is a
|
||||
single destination. Jumping backwards from inside a held note therefore takes
|
||||
you to its beginning, which is usually where you wanted to go.
|
||||
|
||||
When there is nothing that way they say so and stay where they are — *"No note
|
||||
above in this cell"*, *"No later E5"*, *"No later notes"* — so a key that does
|
||||
not move you still tells you why.
|
||||
|
||||
These four and the octave keys sit on `Ctrl+Alt` rather than plain `Ctrl`
|
||||
because REAPER already uses `Ctrl`+arrows to move between items, which is
|
||||
worth keeping.
|
||||
|
||||
## Hold mode
|
||||
|
||||
With hold **off**, toggling adjacent cells at the same pitch gives separate
|
||||
|
||||
Reference in New Issue
Block a user