flutter_notemus 2.6.0
flutter_notemus: ^2.6.0 copied to clipboard
Professional music notation for Flutter: SMuFL/Bravura engraving, grand-staff & cross-staff beaming, Gregorian chant (Greciliae), and MusicXML/MEI/MIDI I/O.
Changelog #
All notable changes to Flutter Notemus are documented in this file.
The format is based on Keep a Changelog and this project follows Semantic Versioning.
2.6.0 - 2026-06-19 #
A large engraving release: multi-staff / grand-staff rendering (the library
is no longer single-staff), cross-staff beaming, a sweep of Behind-Bars CMN
corrections, deeper MusicXML/MEI import, and Gregorian chant render-fidelity
work. All additions are backward-compatible (new widgets, model fields, and
parser paths); existing single-staff MusicScore usage is unchanged.
Added — multi-staff & score rendering #
GrandStaffwidget andGrandStaffPainter: render aStaffGroup(piano grand staff, SATB choir, N-staff systems) on a shared horizontal grid, with the SMuFLbraceandbracketTop/bracketBottomglyphs, a system-start barline joining the staves, continuous per-measure system barlines, and vertically-aligned noteheads.ScoreViewwidget: render a wholeScore(multipleStaffGroups) on one unified grid — a full multi-section/orchestral system.- Multi-system wrapping for the grand staff: long groups wrap into stacked systems with shared break points and the clef + key restated each system.
- Cross-staff beaming: a beamed voice can straddle two staves
(
Note.crossStaffMove); the beam is drawn between the staves with stems reaching it. - MusicXML import →
Score: each part becomes aStaffGroup(multi-staff parts are braced as a grand staff);<part-group>/<group-symbol>spans are imported as section brackets; a beam that changes<staff>mid-group is kept on its home staff with an automatic cross-staff move.
Added — common-music notation #
- Cautionary (parenthesised) and editorial (bracketed) accidentals
(
Note.accidentalParenthesis), imported and exported via MusicXML. - Nested / overlapping slurs with numbered identity (
SlurEvent,Note.slurs), matched by number and arched concentrically; MusicXML<slur number=>import. - Additive meters (e.g.
3+2+2) rendered withtimeSigPlus; free-time (senza misura) draws no glyph. - Tuplet ratios (
a:b) and multi-digit tuplet numbers; sloped tuplet brackets. - Chord-level articulations; ledger lines from SMuFL metadata; heavy-light / heavy-heavy barlines with the correct glyphs.
Changed — engraving (Behind Bars) #
- Chord stem direction corrected (was inverted).
- Inter-note spacing now uses the Gould square-root law keyed to the previous note's duration (inter-onset), with augmentation-dot and cancellation-natural widths reserved; rests use ~0.8× spacing.
- Mid-system clef/key/time changes now render (and clef changes draw at cue size); the last/underfull system is no longer stretched.
- Cross-voice second/unison noteheads are displaced so they no longer overlap; chord ties fan outward; a lone full-measure rest is centred; marcato always sits above the note.
- Hairpins span to the next dynamic/barline.
Changed — Gregorian chant #
- Horizontal episema and augmentum (mora) dot rendered with the Greciliae
HEpisema*/AuctumMoraglyphs (shape-specific episema for virga/quilisma); asymmetric breathing space around divisiones; climacus inclinata and repeated same-pitch strophae tucked into single neumes; custos length by leap distance.
Fixed #
- Brace/bracket no longer overlaps the staff; the orchestral bracket uses the Bravura serif glyphs instead of drawn tips; beam-processing no longer drops newly added note fields.
Added — engraving & typography correctness pass (Issues #3, #4, #5, #8, #9, #12) #
This release also consolidates the earlier engraving/typographic correctness work that had not yet been published to pub.dev:
- SMuFL
braceglyph workflow for staff-group braces:BracketRendererrenders the scalablebraceglyph (vertically stretched to the group height) when SMuFL metadata is available, with the previous custom cubic path kept as an automatic fallback (Issue #3). - Robust
repeatBothbarline rendering: uses the combinedrepeatLeftRightglyph when present, otherwise composesrepeatRight+repeatLeftusing SMuFL advance metrics and thebarlineSeparationengraving default (Issue #5). NoteRenderer.renderSyllablesis now public and reused byChordRenderer, so chords renderNote.syllableswith the same typography as single notes; newChordRenderer.lyricNoteForselects the chord's lyric note (Issue #12).- Stem and flag attachment derived from the SMuFL stem anchor plus half the
stemThicknessengraving default, scaled bystaffSpace; the hardcoded raw-pixel offset constants were removed so single-note stems use the sameSMuFLPositioningEnginepath as chords (Issue #4). SystemData.getShortestNoteDurationaccounts forChordandTuplet(applying the tuplet ratio, recursively for nested tuplets), andTimeSlice.getMaxWidthno longer returns a constant placeholder (Issue #9).- Removed a misleading dead
// TODOinMeasureValidatorreferencing aDuration.tupletfield that never existed (Issue #8). - Regression suites for spacing/duration of chords & tuplets, tuplet measure validation, stem/flag scaling, repeat barlines, the brace glyph, and chord lyrics.
Known limitations #
- Jianpu (numbered notation) is a work in progress / experimental. Basic rendering from the model is available and shown in the example gallery, but coverage is partial and the API may still change — it is not yet considered production-ready.
- Inter-note hyphen centering (Issue #14) and melisma extension lines (Issue #13) remain open: both require relocating syllable rendering into a post-layout pass, deferred to avoid regressing currently-working lyric rendering.
2.5.1 - 2026-03-29 #
This release finishes the pub.dev polish pass for engraving quality, showcase coverage, release documentation, and codebase hygiene.
Added #
- A curated Cupertino-based example gallery with restored public demos for grace notes, slurs/ties, lyrics/text, tuplets, octave marks, ornaments, and articulation coverage.
- New regression tests for chord slur/tie grouping, articulation helpers, tuplet rest centering, SMuFL positioning, and the example app smoke suite.
- GitHub roadmap issues for styling/theming, editable score workflows, score hit-testing, real-time interactivity, and production-ready MIDI/audio support.
- CI workflow (
.github/workflows/ci.yml) that runsflutter analyze,flutter test, andflutter pub publish --dry-runon every push and pull request.
Changed #
MusicScorePainter.shouldRepaintcontinues to use a deterministic layout signature, andLayoutEngine.layoutWithSignature()remains the compatibility-safe path for signature-aware layout.- Example score previews now use a white canvas, independent scroll controllers, explicit Cupertino icon font loading, larger default typography, and vertically centered score content in bounded cards.
- Example score previews no longer shrink responsively by default, improving beam, lyric, grace-note, and octave-mark legibility in the public gallery.
- All source comments and documentation strings migrated to English throughout the entire codebase (library, tests, and examples).
Fixed #
- Slurs, ties, and grace-note ligatures now route on the stem-free side of the notehead, including chord-aware tie grouping and grace-note entry geometry.
- Tuplet brackets and numbers keep better clearance from note/beam fields, and mixed tuplets now center internal rests on the rhythmic slot instead of drifting left.
- Arpeggio signs sit closer to chord noteheads and octave-mark examples keep the ottava text, dashed span, and hook inside the preview area.
- Beaming processing preserves complete note metadata during layout, including lyric syllables and auxiliary note properties required by downstream renderers/parsers.
- Articulation placement follows the effective stem direction, which keeps tenuto/accent placement consistent even when notes are beamed or voice-driven.
- Preserved
voiceNumbercontext during horizontal justification so multi-voice rendering remains consistent after system expansion. - Stabilized spacing model behavior and adaptive expansion blend to reduce subtle density drift in existing scores.
- Resolved garbled UTF-8 characters in source comments across all affected files (Issue #11 closed).
- Extracted duplicate stem X-offset constants in
BeamRendererinto a single_stemXOffset()helper, eliminating the repeated inline definition.
2.5.0 - 2026-03-23 #
Added #
- MEI v5 100% conformance: full coverage of Music Encoding Initiative v5 specification.
SpaceandMeasureSpaceclasses (MEI<space>and<mSpace>).FiguredBassandFigureElementclasses (MEI<fb>/<f>).HarmonicAnalysis,ChordTable,HarmonicLabelclasses (MEI<harm>,intm,mfunc,deg,inth,pclass).MeiHeaderwith full FRBR model (Work/Expression/Manifestation/Item levels).ScoreDefinitionclass (MEI<scoreDef>).MensuralNote,MensuralRest,Ligature,Mensur,ProportMark(MEI Mensural repertoire).Neume,NeumeComponent,NeumeDivision(MEI Neume notation).TabNote,TabGrp,TabTuningwith standard guitar/bass/ukulele tunings (MEI Tablature).
DurationTypeextended with historical values (maxima,long,breve) and ultra-short values up totwoThousandFortyEighth(2048th note).DurationType.meiDurValuegetter andDurationType.fromMeiValue()for MEI serialization.Pitch.pitchClassgetter (0–11, MEIpclass) andPitch.solmizationName/Pitch.fromSolmization().KeyModeenum (major, minor, dorian, phrygian, lydian, mixolydian, aeolian, locrian, none).TimeSignature.free()andTimeSignature.additive()constructors for MEI<meterSig>variants.SyllableandVerseclasses for MEI<syl>/<verse>lyric encoding.Staff.lineCountparameter for non-standard staves (MEI<staffDef @lines>).Measure.numberfield (MEI<measure @n>).Note.tabFret/Note.tabStringfields for tablature notation.MusicalElement.xmlIdfield for MEIxml:idcross-referencing.- MEI v5 badge and conformance section added to README.
- Audit document
doc/MEI_V5_AUDIT.mddocumenting 100% coverage across 30 categories. - GitHub issues #7, #8, #9 tracking remaining implementation work.
Fixed #
- All
avoid_printwarnings in example files replaced withdebugPrint. - Deprecated
Tuplet.showBracket/showNumberusages replaced withbracketConfig/numberConfigin examples. deprecated_member_use(withOpacity) replaced withwithValues(alpha:)in example files.implementation_importsandunnecessary_importwarnings resolved in JSON example files.prefer_const_constructorswarnings resolved across example files.- Non-exhaustive switch expressions in
BeamAnalyzer._getDurationValue()andMusicXMLParser._durationTypeToString()fixed afterDurationTypeenum expansion.
2.2.1 - 2026-03-23 #
Fixed #
- Replaced
LICENSEcontent with canonical Apache-2.0 text so pub.dev can recognize an OSI-approved license. - Moved third-party license attributions to
THIRD_PARTY_LICENSES.md.
2.2.0 - 2026-03-23 #
Changed #
- Translated example app UI texts to English across example pages and labels.
- Added web plugin support entry with
FlutterNotemusWeb. - Added Swift Package Manager manifests and source targets for iOS and macOS plugin integration.
- Normalized license metadata and Apache-2.0 declaration in
pubspec.yaml.
2.1.0 - 2026-03-23 #
Changed #
- Migrated README content to English across all sections.
- Reorganized README with project links at the top.
- Kept backlog references and project links aligned with GitHub and GitHub Pages.
2.0.2 - 2026-03-23 #
Fixed #
- Restored the complete README content for GitHub and pub.dev package page.
- Added project links section with GitHub, pub.dev, and GitHub Pages URL.
- Added explicit open-pending issues section with links to tracked implementation gaps.
2.0.1 - 2026-03-23 #
Added #
- Public backlog tracking document:
doc/OPEN_ISSUES.md - GitHub issue backlog for pending implementation gaps:
- #1 Native audio backend for iOS/macOS/Linux/Windows
- #2 Real notation engraving for PDF export
- #3 SMuFL brace integration for staff groups
- #4 Stem/flag primitive parameterization
- #5
repeatBothrobust glyph fallback
Changed #
- README fully rewritten and normalized (clean structure, setup, examples, status)
- Project status documentation now clearly separates stable features vs pending areas
2.0.0 - 2026-03-23 #
Added #
- First-party MIDI module exposed via
package:flutter_notemus/midi.dart MidiMapper.fromStaffandMidiMapper.fromScore- Repeat expansion (
repeatForward,repeatBackward,repeatBoth) with volta filtering - Tuplet, polyphony, and tie-aware event generation
- Metronome track generation synchronized with expanded playback timeline
- Standard MIDI file writer (
MidiFileWriter) - Native backend contract (
MidiNativeAudioBackend) - MethodChannel backend (
MethodChannelMidiNativeAudioBackend) - Native sequence bridge (
MidiNativeSequenceBridge) - PPQ sync API (
setTicksPerQuarter) - Android native plugin implementation (Kotlin + C++)
- Plugin channel setup for iOS, macOS, Linux, and Windows
- Unit tests for MIDI mapping and export
Changed #
- Public API includes MIDI exports via
flutter_notemus.dartandmidi.dart - Native backend state documented (Android active, other platforms stubbed)
