Skip to content

metronome marks aren't written to lilypond files #1852

@drammock

Description

@drammock

music21 version

9.9.1

Operating System(s) checked
Linux

Problem summary

MetronomeMark is not included when converting Stream object to Lilypond score.

Steps to reproduce

import music21 as mm

keysig = mm.key.Key("a-")
tempo = mm.tempo.MetronomeMark(number=87, referent=mm.note.Note(type="quarter"))
timesig = mm.meter.TimeSignature("3/4")
melody = [
    mm.note.Note(pitch=pitch, duration=mm.duration.Duration(type="quarter"))
    for pitch in keysig.getPitches()
]
stream = mm.stream.Stream([keysig, tempo, timesig, *melody])
stream.write("lily", "path/to/output/file.ly")

Expected vs. actual behavior

actual output (note the lack of any \tempo quarter = 87 or similar):

\version "2.24" 
\include "lilypond-book-preamble.ly"
    
color = #(define-music-function (parser location color) (string?) #{
        \once \override NoteHead.color = #(x11-color color)
        \once \override Stem.color = #(x11-color color)
        \once \override Rest.color = #(x11-color color)
        \once \override Beam.color = #(x11-color color)
     #})
    
\header { } 
\score  { 
 \new Voice { \new Voice { \key aes \minor 
                \time 3/4
                aes' 4  
                bes' 4  
                ces'' 4  
                des'' 4  
                ees'' 4  
                fes'' 4  
                ges'' 4  
                aes'' 4  
                 } 
               
 
           } 
         
 
  } 
 
\paper { }
\layout {
  \context {
    \RemoveEmptyStaves
    \override VerticalAxisGroup.remove-first = ##t
  }
 }

More information

My particular use case was a bit more complicated (instantiating a converter, extracting just the LyScoreBlock from its context, and writing a whole series of those one-line scores to a single page, with a custom header for the .ly file). FWIW, what I hacked together as a workaround is:

def insert_metronome_mark_into_score(score, tempo):
    tempo_range = mm.lily.lilyObjects.LyTempoRange(tempo)
    steno = mm.lily.lilyObjects.LyStenoDuration("4")  # "quarter" doesn't work
    tempo_mark = mm.lily.lilyObjects.LyTempoEvent(
        tempoRange=tempo_range, stenoDuration=steno
    )
    score[
        0
    ].scoreBody.music.compositeMusic.contents.music.compositeMusic.contents.sequentialMusic.musicList.contents[
        0
    ].music.compositeMusic.contents.sequentialMusic.musicList.contents.insert(
        2, tempo_mark
    )

I mention it because inserting the more simple mm.lilyObjects.LyTempoEvent(scalar="87") fails (lilypond seems to choke on \tempo 87 with no steno and equals sign). Also fails if the steno is "quarter" instead of "4" --- the docstring example code uses "quarter" so may want to change that.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions