Skip to content

Keyboard shortcuts

A single cheat sheet for every key binding in the app.

These work regardless of which child widget has focus. Registered through QAction.setShortcut on the File menu items.

Key Action
Ctrl+O Open… (*.mid, *.MID, *.json — the .json path loads anchors and their referenced MIDI)
Ctrl+S Save Anchors… (disabled until a MIDI is loaded)
Ctrl+Q Quit (prompts Save / Discard / Cancel if there are unsaved anchor edits — see Main window → Unsaved changes guard)

Window shortcuts

Registered with Qt.WindowShortcut scope on the main window. They fire regardless of which child widget has focus, except when an editable widget (the anchor table's label editor) is intercepting key events — see the note at the bottom.

Key Action
Left Step playhead by -1 MIDI tick
Right Step playhead by +1 MIDI tick
Shift+Left Step playhead by -100 ticks
Shift+Right Step playhead by +100 ticks
A Add anchor at current playhead time

A "tick" is 1 / sample_rate seconds, derived from the MIDI file's tempo and ticks-per-beat. Typical values:

  • 120 BPM, 480 ticks/beat → ≈ 1.04 ms per tick
  • 120 BPM, 1920 ticks/beat (Disklavier) → ≈ 0.26 ms per tick

At those resolutions, single-tick stepping is only visible at the highest zoom levels (≤ 1 s per viewport).

Anchor table shortcuts

Scoped to the anchor table widget (Qt.WidgetShortcut) — they only fire when the table has keyboard focus.

Key Action
Del Delete the currently-selected anchor
F2 Open the inline editor on the selected row's Label cell
Enter Commit a label edit
Esc Cancel a label edit

F2 is the standard Qt edit-key for EditKeyPressed. Single-clicking a Label cell to select it, then pressing F2, opens the editor without needing a double-click.

Mouse interactions

Mouse details live on each widget's reference page:

  • MIDI canvas — drag to scrub (vertical), wheel to zoom, double-click a note to snap, hover for white outline.
  • Timeline slider — drag the thumb, click the trough to jump directly.
  • Anchor table — double-click Time (s) to jump the playhead, double-click Label to edit, click any cell to select the row.

Behaviour during a label edit

When the Label cell of the anchor table is being edited (its inline editor is focused), some letter keys are absorbed by the editor before reaching the main window:

  • A does not add an anchor — it types an "a" into the label.
  • Arrow keys move the cursor inside the editor — they do not step the playhead.

Press Enter (commit) or Esc (cancel), or click outside the cell, to release the editor focus and re-enable the window shortcuts.

The menu shortcuts (Ctrl+O, Ctrl+S, Ctrl+Q) are not affected by this — they fire regardless of edit state because Qt routes them at the action level rather than as raw key events.

What is not bound

There is no shortcut for:

  • Reset zoom (use Ctrl+O to re-open the file — that resets viewport to 5 s).
  • Jump to start / jump to end (use the timeline slider's trough click, or drag the slider thumb to either end).
  • Undo / redo. The anchor table has no undo stack; deletion is immediate.
  • Open Recent / re-open last file. The app keeps no recent-files list.
  • Toggle the anchor dock. Use the dock's [X] button to close it, but note there is no menu item to reopen it once closed — restart the app.