Skip to content

LilyPond

Mahlif converts to LilyPond format for high-quality PDF output.

Direction Status Method
Mahlif → LilyPond ✅ Working CLI / Python API
LilyPond → Mahlif ❌ Not planned

Quick Start

# Convert Mahlif XML to LilyPond
mahlif convert score.mahlif.xml score.ly

# Then compile with LilyPond
lilypond score.ly

Python API

from mahlif import parse
from mahlif.lilypond import to_lilypond

score = parse("score.mahlif.xml")
lily_source = to_lilypond(score)

with open("score.ly", "w") as f:
    f.write(lily_source)

Feature Support

Score Structure

Feature Status LilyPond Output
Version header \version "2.24.0"
Title/composer \header { title = "..." }
Page size \paper { paper-width = ... }
Staff names \new Staff = "Violin"

Notes and Rests

Feature Status LilyPond Output
Single notes c'4
Chords <c' e' g'>4
Rests r4
Hidden rests s4 (spacer)
Ties c'4~

Durations

Ticks Duration LilyPond
2048 Breve \breve
1536 Dotted whole 1.
1024 Whole 1
768 Dotted half 2.
512 Half 2
384 Dotted quarter 4.
256 Quarter 4
192 Dotted eighth 8.
128 Eighth 8
96 Dotted 16th 16.
64 16th 16
32 32nd 32

Clefs and Signatures

Feature Status LilyPond Output
Initial clef \clef treble
Clef changes \clef bass
Key signature \key bes \major
Key changes Mid-bar key changes
Time signature \time 4/4

Dynamics and Expression

Feature Status LilyPond Output
Dynamics \p, \f, \ff, \mf, etc.
Crescendo hairpin \<
Diminuendo hairpin \>

Articulations

Articulation Status LilyPond
Staccato -.
Staccatissimo -!
Tenuto --
Accent ->
Marcato -^
Fermata \fermata
Long fermata \longfermata
Short fermata \shortfermata
Up bow \upbow
Down bow \downbow
Harmonic \flageolet
Trill \trill
Arpeggio \arpeggio

Barlines

| Type | Status | LilyPond | | ------------ | ------ | -------- | --- | --- | | Single | ✅ | | | | Double | ✅ | \bar " | | " | | Final | ✅ | \bar " | ." | | Repeat start | ✅ | \bar ". | :" | | Repeat end | ✅ | \bar ": | ." |

Not Yet Implemented

High Priority

Feature LilyPond Notes
Slurs ( ) Need start/end tracking
Tuplets \tuplet 3/2 { } Need grouping logic
Multi-voice << { } \\ { } >> Need voice separation
Lyrics \lyricmode { } Need syllable alignment
Grace notes \grace, \acciaccatura

Medium Priority

Feature LilyPond Notes
Text annotations ^"text"
Rehearsal marks \mark "A"
Tempo markings \tempo 4 = 120
System breaks \break
Staff groups \new StaffGroup
Grand staff \new PianoStaff
Transposition \transpose c bes

Layout/Positioning

Feature Notes
dx/dy offsets Pixel-accurate positioning
Staff spacing \override VerticalAxisGroup
Note spacing \override SpacingSpanner

Known Limitations

  1. Empty bars show as | instead of whole-bar rests
  2. Long lines — each staff is one line (no wrapping)
  3. Enharmonic spelling may differ from original
  4. Time signatures only appear when they change

Export Statistics

From a test orchestral score:

Metric Count
Staves 36
Notes 15,466
Chords 4,740
Dynamics 1,230
Slurs 1,248
Hairpins 333
Key changes 261
Clef changes 19