Feedback round 2: strings filter, key sync, fixed clef, unified metronome

- 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.
This commit is contained in:
OpenClaw
2026-09-14 12:38:22 +00:00
parent 15b8705907
commit b214c209f9
11 changed files with 445 additions and 194 deletions

View File

@@ -44,13 +44,12 @@ export const useGameLogic = (
keyEnabled: pf.keyEnabled,
keyTonic: pf.keyTonic,
keyMode: pf.keyMode,
strings: pf.strings,
fretWindowEnabled: pf.fretWindowEnabled,
fretMin: pf.fretMin,
fretMax: pf.fretMax,
});
}, [settings.instrument, settings.difficulty, settings.tuningId, settings.customMinFret, settings.customMaxFret,
settings.practice?.keyEnabled, settings.practice?.keyTonic, settings.practice?.keyMode,
settings.practice?.fretWindowEnabled, settings.practice?.fretMin, settings.practice?.fretMax]);
}, [settings]);
// --- Note Generation ---
const generateNewNote = useCallback((keepFeedback = false) => {