Problem
This package ships no text face. pubspec.yaml declares exactly two families and both are music fonts (Bravura, Greciliae); assets/smufl/ holds Bravura.otf and no text font at all.
Every string the package draws — lyrics, tempo marks, rehearsal letters, dynamics text, fingerings, chord symbols — falls back to Academico, Century Schoolbook, Edwin, serif. On a host that provides none of those, every one of them renders as a .notdef box.
Measured: the generic serif family does not rescue it. A headless binary with a face registered literally as serif produced a byte-identical PNG to one with no text font at all.
The supported answer today
MusicTextFont.use / MusicScoreTheme.textFontFamily is a real escape hatch and, since 2.8.0, reaches every string the package draws. Measured with a face injected: ink went from 14 942 px to 6 886 px and .notdef boxes from 2 to 0 on the probe score.
So this is not "text is broken" — it is "the package makes the consumer supply something it could supply itself".
What closing this needs
An OFL-licensed text face committed to assets/, declared in pubspec.yaml, and used as the default when the consumer sets nothing. Candidates worth evaluating for a music package: Edwin (Verovio's, OFL, designed for exactly this), or a Century-Schoolbook-alike.
Acceptance criteria
- A text face ships and is the default; the
.notdef count on the probe score is 0 with no consumer configuration.
MusicTextFont.use still overrides it.
THIRD_PARTY_LICENSES.md records the licence, as it does for Bravura and Greciliae.
- Archive-size impact stated in the PR — this package already carries ~5 MB of font assets.
Problem
This package ships no text face.
pubspec.yamldeclares exactly two families and both are music fonts (Bravura,Greciliae);assets/smufl/holdsBravura.otfand no text font at all.Every string the package draws — lyrics, tempo marks, rehearsal letters, dynamics text, fingerings, chord symbols — falls back to
Academico, Century Schoolbook, Edwin, serif. On a host that provides none of those, every one of them renders as a.notdefbox.Measured: the generic
seriffamily does not rescue it. A headless binary with a face registered literally asserifproduced a byte-identical PNG to one with no text font at all.The supported answer today
MusicTextFont.use/MusicScoreTheme.textFontFamilyis a real escape hatch and, since 2.8.0, reaches every string the package draws. Measured with a face injected: ink went from 14 942 px to 6 886 px and.notdefboxes from 2 to 0 on the probe score.So this is not "text is broken" — it is "the package makes the consumer supply something it could supply itself".
What closing this needs
An OFL-licensed text face committed to
assets/, declared inpubspec.yaml, and used as the default when the consumer sets nothing. Candidates worth evaluating for a music package: Edwin (Verovio's, OFL, designed for exactly this), or a Century-Schoolbook-alike.Acceptance criteria
.notdefcount on the probe score is 0 with no consumer configuration.MusicTextFont.usestill overrides it.THIRD_PARTY_LICENSES.mdrecords the licence, as it does for Bravura and Greciliae.