- Transport restructured like a music player: Start/Pause, step
back/forward buttons (while previewing), Preview, Retry, Next.
- Virtual instrument and Hint moved out of the transport row into a
separate display-toggles row using switch-style toggles (same visual
language as tuner/metronome switches) — pure show/hide, no run state.
- Preview now tracks a cursor: the current preview event is marked in
the notation (caret + color via existing currentIdx pipeline).
- Preview stepping: pause-free stepping forward/backward one event at
a time; each step replays from the cursor position so notes can be
located on the fretboard. Arrow keys ←/→ work while previewing.
- With Hint active, the fretboard/piano marks the preview cursor note
(displayIdx follows the preview cursor).
- previewIdx resets on structural changes and when the preview ends.
- nextAction: giuliani and single-chord arpeggios now roll a new seed
too (they consume melodySeed); previously the handler silently did
nothing for them. Scale drills keep no Next (deterministic).
- New/Next button visibility matches the same condition, and the label
is 'Next' for fixed material only.
- Keyboard shortcuts: HTMLButtonElement removed from the interactive
gate — after any mouse click the button keeps focus and previously
swallowed N/R/P/H/L/V/M. Space/Enter on a focused button still
activate it natively and no longer double-fire the global
pauseToggle/skip handlers.
New game mode 'assist' — no trainer, no scoring:
- Large display of the currently mic-detected note
- Live notation staff (same pipeline as the pitch monitor)
- Live fretboard showing alternative positions for the played note
(respects the fret-window practice filter)
- Tuner and Metronome remain the shared footer tools, identical in
all modes; user can practice own-pace from paper with a free
metronome
Header mode toggle gains 'Assist'; 'm' shortcut cycles back to sight
reading from assist/phrase. Export PitchData type.
- Strings filter: per-string toggle buttons (replaces fret-window-only
semantics as a third 'limits notes' control); combines with fret window
and key filter in targetPool (fretted instruments).
- Key sync checkbox: display key signature can follow the target key
(major/minor mapping), default off — both remain independently settable.
- LiveNoteStaff: optional fixed clef — guitar/bass now keep their usual
clef instead of flipping at middle C; octave markers handle range.
- Unified metronome widget (MetronomeWidget) with animated linear pendulum
synced to the audible click; shown in ALL modes next to the tuner.
Phrase BPM now reads from settings.rhythm.bpm (single source); the
phrase-local BPM control was removed from the setup panel.
- Tests: 160/160; tsc + eslint clean; build ok.
- Settings: reference note duration slider (0.5-4s, default 1.5s) applies to
ear-training auto-play, sight-reading auto-play and the manual Play Note
button/keys alike.
- Settings: 'Wait for Silence' toggle holds the next reference note until the
mic detects the instrument has gone quiet (a still-ringing string masking
the next note was easy to miss). Safety cap of 8s so continuously
detectable room noise can't stall the app; without a mic it plays
immediately. The quiet state is a boolean dep (not the per-frame pitch
object) so the play timer isn't reset 60x/sec.
- Gate all live feedback (staff preview, readout, tuner) during speaker
playback: the mic inevitably hears the reference note and would briefly
leak the target in ear training. Virtual fretboard taps (explicit user
input) still display instantly.