Back to work
Personal · Accessibility mobile app · 2026

music-view

A Flutter app for visually-impaired pianists — renders scores in ultra-high contrast with 2× note size, auto-scrolling to tempo or following the notes you actually play (real-time pitch detection via microphone).

Flutter Dart Riverpod MusicXML MIDI FFT / Pitch Firebase
Challenge

Visually-impaired pianists have no accessible solution for reading sheet music — text too small, no auto-scroll, nothing adapted.

Approach

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.

Outcome

Working prototype, tested with a visual-impairment association.

01Context

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. music-view does the opposite: one staff line at a time, 2× note size, pure black-on-white (or white-on-black), zero decorative elements.

The score auto-scrolls, either at a set tempo or by following the player through the microphone. The goal: keep playing when your hands can't turn pages or adjust a metronome.

02What I built

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.
03Accessibility principles

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).
04Stack
FlutteriOS + Android + iPad
RiverpodState management
GoRouterNavigation
MusicXMLScore source format
MIDITempo, expected notes
FFT / PitchMic-based pitch detection
FirebaseAuth, Firestore, Storage
Custom CanvasNative ScorePainter