- Pace dropdown REMOVED from Phrase setup — replaced by a 'Sync to
exercise' checkbox in the Metronome widget (analog to 'Auto' in
single-note modes). pace is derived from the checkbox (checked = tempo,
unchecked = step).
- Preview clicks now registered in PREVIEW_GROUP: stopping/abandoning a
preview cancels its scheduled clicks — no more parallel ghost
metronomes after preview->stop->next exercise.
- Chord pool replaces the chord dropdown entirely (single chord AND
sequences): togglable degree list, empty = all 7.
- Giuliani figures corrected to NOTE sequences (p always takes the bass/
root): p-i-m, p-i-m-a, p-a-m-i, a-i-m, p-i-m-a-m-i, p-m-a-m-i-m,
p-e-a-m-a-m (replaced the fingering-driven patterns that made no
musical sense).
- 'Limit notes' is now one bordered section like Tuner/Metronome, with a
header, Clear-all link, and Strings behind a toggle (row hidden until
restricted).
- 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.
- New shared PracticeFilter settings (keyTonic/keyMode/fretWindow), persisted
via AppSettings.practice, defaults off (behavior unchanged).
- music/targetPool.ts: single source for the effective target pool —
base playable range ∩ fret window ∩ key/mode pitch classes (9 modes incl.
pentatonic, same scale machinery as Phrase Mode).
- useGameLogic now builds validNotes via computeTargetPool.
- TargetNoteControls component (key on/off + tonic/mode, fret window on/off +
min/max) rendered in Controls for all game modes; key is independent of the
displayed key signature.
- Phrase Mode binds its key/fret-window setup to the same shared filter
(read/write mirror) and drops the duplicate controls in its setup panel.
- Tests: targetPool.test.ts (7 cases); suite 156/156 green, build ok.