Commit Graph

81 Commits

Author SHA1 Message Date
da060e5bb9 Delivery record: late-feedback round (octave fix, count-in, auto-continue, live staff, library) 2026-09-14 02:30:43 +02:00
173c4c56bc Fix stave vertical placement: compensate VexFlow space_above_staff_ln offset in live staff and phrase rows (verified via screenshots) 2026-09-14 02:21:33 +02:00
7d4c71539a Live-note staff: 64px box aligned with mic button, extreme ledger lines overflow instead of clipping 2026-09-14 02:13:08 +02:00
9fb3f91b92 Fix live-note staff clipping (written-range headroom, block SVG) and center Zen-mode content vertically 2026-09-14 02:11:14 +02:00
fff512b4dd Phrase mode: QA updates (tempo timing verification, auto-continue, expanded library documented) 2026-09-14 01:49:29 +02:00
4f2ee8798a Phrase mode: count-in click fix, auto-continue sections, BPM widget, live-note staff, 13 new exercises 2026-09-14 01:45:39 +02:00
82c105bcbf Docs: Phrase Mode in README/TECHNICAL_REALIZATION, delivery record with verified evidence 2026-09-14 01:23:20 +02:00
909c30192f Phrase mode: count-in no-scoring fix, re-arm timeout for repeated notes, browser QA scripts 2026-09-14 01:22:55 +02:00
486f3c5dcd Phrase mode: browser debug hook (localStorage.phraseDebug) 2026-09-14 01:16:21 +02:00
9cb78b39d5 Phrase mode UI fixes: visible current-note accent, staff headroom, reused virtual-instrument/hint toggles, zen decluttering 2026-09-14 01:16:00 +02:00
0520cb08b4 Phrase mode UI fixes: visible current-note accent, staff headroom, reused virtual-instrument/hint toggles, zen decluttering 2026-09-14 01:15:52 +02:00
4d6e205b07 Phrase mode: App integration (mode toggle, keyboard, zen), Controls tweaks, styles 2026-09-14 00:58:43 +02:00
821f88d43a Phrase mode: ABC parser (subagent), library content, renderer, PhraseTrainer component 2026-09-14 00:57:32 +02:00
c7f1fa170b Phrase mode: audio engine (groups, clicks, blanking), raw frame bus, trainer hook 2026-09-14 00:50:47 +02:00
7c5632fab6 Phrase mode: PhraseMatcher (episode/latching logic) + transport schedule (tested) 2026-09-14 00:47:29 +02:00
8e20098102 Phrase mode P0: score model, scales/keys, playable range, melody + scale generators (tested) 2026-09-14 00:44:09 +02:00
6e24b94a91 Review phrase mode requirements and specify implementation contracts 2026-09-14 00:21:43 +02:00
0d11570b58 Add Phrase Mode requirements & implementation plan (draft) 2026-09-14 00:05:20 +02:00
141487e3df Update docs: detection/matching pipeline, new settings, testing 2026-09-13 19:16:54 +02:00
3cc9a0c43d Add reference note duration and wait-for-silence options
- 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.
2026-09-13 18:52:33 +02:00
6e60ced477 Dark mode contrast, tuner display and misc UI fixes
- color-scheme per theme so native controls (selects, checkboxes, number
  inputs, sliders) render dark-native instead of black-on-black.
- Themed .control-select text color; new .control-input class replaces
  hardcoded white-on-black inline input styles.
- Tuner widget stays mounted when enabled: idle state (dimmed, needle parked,
  '—') instead of appearing/disappearing. Fully theme-var based (was
  hardcoded white — invisible in light mode).
- Remove CSS transitions on per-frame values (tuner needle, level meter):
  transitions interrupted 60x/sec are left stuck by WebKit/Safari; the
  display EMA from the detection loop replaces them.
- VexFlow notation: resolve CSS var() to concrete colors (SVG attributes
  can't resolve var(), silently fell back to black) and override VexFlow's
  hardcoded #444 ledger-line default; re-render on theme changes
  (useLayoutEffect so children read the updated attribute in time).
- Themed switch toggles (were hardcoded #ddd / white — glowed in dark mode).
- Fixed-height pitch readout so the layout stops jumping when a note starts
  or stops sounding.
- Split SettingsContext into context/Provider/hook files (fast-refresh);
  memoized provider functions; typed webkitAudioContext; prefer-const;
  removed 'as any' casts. ESLint now passes clean.
2026-09-13 18:52:27 +02:00
079d574b66 Overhaul pitch detection and note matching
- Pick detector per instrument range: ACF2PLUS (robust down to ~40 Hz) for
  normal instruments, YIN only for the whistle register. pitchfinder's YIN
  latches onto tau=2 (~20 kHz garbage) below ~100 Hz and for quiet input;
  the old fixed 4096 window masked this, the smaller window exposed it.
- RMS-normalize analysis input for the YIN path only; ACF2PLUS keeps the raw
  signal so its internal unpitched gate rejects quiet decayed audio instead
  of amplifying noise into confident wrong pitches (tuner stuck on 'a note').
- Adaptive analysis window sized to the instrument's lowest note (~2 periods):
  half the latency, a quarter of the CPU for guitar/piano/voice; bass keeps
  the full window for E1.
- Reject detections implausibly below the instrument floor (mains hum).
- Clear stale pitch readings after 200 ms instead of keeping them forever.
- Shared AudioEngine singleton for all playback (was: two AudioContexts);
  tracks audibility so the app stops hearing its own speaker (ear-training
  self-scoring) and gates matching plus display during playback.
- MatchTracker: grace-period based note hold instead of reset-on-every-flicker
  (YIN flickers during attacks/decays; the old hard reset made the 50 ms
  threshold fire unreliably).
- Display damping in the producer (EMA for cents/level, 3-frame note-name
  hysteresis); display components render directly without CSS transitions.
- Regression tests: synthetic signals through the exact pipeline helpers
  (MatchTracker + pitchDetection test suites).
2026-09-13 18:52:21 +02:00
d8602e0bd8 More detailed note detection settings 2026-01-01 19:45:16 +01:00
a785d188e9 Refactoring 2025-12-31 10:35:11 +01:00
d70a9c3fee increase NOTE_MATCH_THRESHOLD_MS to 100ms 2025-12-31 10:02:43 +01:00
0373a7c516 reduce note match threshold_ms 2025-12-30 22:39:19 +01:00
fe5442eda0 Fix issues with resizing on small screens 2025-12-30 22:30:48 +01:00
d909649e00 mobile UI 2025-12-30 21:33:32 +01:00
aea2442fd6 mobile UI 2025-12-30 20:17:35 +01:00
7a272175d9 Improve mobile UI (resizing) 2025-12-30 20:11:08 +01:00
be7d994ca5 Attempt to fix microphone on android 2025-12-30 19:41:21 +01:00
b27c24cfd0 Mobile UI improvements 2025-12-30 19:24:27 +01:00
96b236acee Improve mobile UI 2025-12-30 10:24:25 +01:00
6f67769974 Add hints on mouseover on virtual instrument 2025-12-28 17:10:37 +01:00
1101c7be9c umami.is telemetry 2025-12-28 15:31:32 +01:00
d83cccb392 JensMohrmann.de 2025-12-28 15:15:51 +01:00
1008fe0eb6 Adjust logo and switch help and settings buttons 2025-12-28 15:09:30 +01:00
c21576a443 Modern fermata logo 2025-12-28 14:47:37 +01:00
dbe7d9a38e Add keybaord shortcuts for mic and virtual instrument 2025-12-28 14:32:07 +01:00
c76a172c1c Fix success animation blocking new note 2025-12-28 14:17:42 +01:00
febb55cf5a Configure custom domain sight-reading.de 2025-12-28 13:52:34 +01:00
5ce02498c1 Readme and technical documentation 2025-12-27 22:46:58 +01:00
d4415c516e piano details 2025-12-27 22:36:01 +01:00
9b517b5bf6 Fix piano graphics 2025-12-27 19:27:18 +01:00
e97e036bdd Add piano as virtual instrument 2025-12-27 19:23:41 +01:00
ee36cf00cd Fix pitch detection frequency ranges 2025-12-27 19:01:09 +01:00
da02c8977e Increase mic sensitivity range 2025-12-27 18:54:43 +01:00
03a5e8e3c1 mic sensitivity setting 2025-12-27 18:43:19 +01:00
2ad1fe0ea9 improve volume control 2025-12-27 18:12:32 +01:00
bf6c443ebd Add settings dialog 2025-12-27 17:48:57 +01:00