music-view
A Flutter app I'm building for visually-impaired pianists — ultra-high-contrast scores, 2× note size, scrolling that follows the tempo or the notes actually played on the piano (picked up by the mic, in real time).
Visually-impaired pianists have no accessible solution for reading sheet music — text too small, no auto-scroll, nothing adapted.
Flutter app with ultra-high-contrast display, horizontal auto-scroll at tempo, live audio-follow via mic FFT to stay synced with actual playing. MusicXML / OpenScore import.
Working prototype, tested with a visual-impairment association.
An app built for one specific need
For a pianist who has lost 70 % of their eyesight, reading a standard score is physically impossible. Existing apps show too much, too small, with insufficient contrast. I went the opposite way: one staff line at a time, 2× note size, pure black-on-white (or white-on-black), nothing decorative.
The score scrolls on its own, at a set tempo or by following the player through the microphone. The goal I set myself is simple: keep playing when your hands aren't free to turn pages or fiddle with a metronome. In short: the player plays, the app follows.
Accessibility-first score viewer
- Native MusicXML rendering via a custom ScorePainter (Flutter Canvas) — single treble staff + double treble/bass staff, notes at 2× standard size.
- Auto-scroll (BPM) — the score advances at the piece's tempo, the user never touches the phone while playing.
- Audio-follow via mic — real-time capture, FFT / pitch detection, match played notes vs expected notes. The score advances bar-by-bar when the correct sequence is detected.
- Library — 10 pre-loaded classical pieces (Beethoven, Debussy, Satie, Bach…) + search & download from public-domain APIs (IMSLP, OpenScore).
- Calibration — dedicated screen that fits zoom, contrast and default tempo to each user's specific needs.
Constraint as design driver
- Notes and musical symbols at a minimum of 2× standard size.
- Configurable high contrast (strict black-on-white or white-on-black mode).
- Large touch targets for every interaction — no tap target below 48 px.
- Zero visual clutter: display only what's needed to play.
- Full support for system accessibility settings (dynamic type, increased contrast, reduce motion).