Next: , Previous: Suggestions for writing LilyPond files, Up: Working on LilyPond projects


4.2 Saving typing with identifiers and functions

By this point, you've seen this kind of thing:

     
     hornNotes = \relative c'' { c4 b dis c }
     \score {
       {
         \hornNotes
       }
     }

[image of music]

You may even realize that this could be useful in minimalist music:

     
     fragA = \relative c'' { a4 a8. b16 }
     fragB = \relative c'' { a8. gis16 ees4 }
     violin = \new Staff { \fragA \fragA \fragB \fragA }
     \score {
       {
         \violin
       }
     }

[image of music]

However, you can also use these identifiers (also known as variables, macros, or (user-defined) command) for tweaks:

     
     dolce = \markup{ \italic \bold dolce }
     padText = { \once \override TextScript #'padding = #5.0 }
     fthenp=_\markup{ \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p }
     violin = \relative c'' {
       \repeat volta 2 {
         c4._\dolce b8 a8 g a b |
         \padText
         c4.^"hi there!" d8 e' f g d |
         c,4.\fthenp b8 c4 c-. |
       }
     }
     \score {
       {
         \violin
       }
     \layout{ragged-right=##t}
     }

[image of music]

These identifiers are obviously useful for saving typing. But they're worth considering even if you only use them once – they reduce complexity. Let's look at the previous example without any identifiers. It's a lot harder to read, especially the last line.

violin = \relative c'' {
  \repeat volta 2 {
    c4._\markup{ \italic \bold dolce } b8 a8 g a b |
    \once \override TextScript #'padding = #5.0
    c4.^"hi there!" d8 e' f g d |
    c,4.\markup{ \dynamic f \italic \small { 2nd }
      \hspace #0.1 \dynamic p } b8 c4 c-. |
  }
}

So far we've seen static substitution – when LilyPond sees \padText, it replaces it with the stuff that we've defined it to be (ie the stuff to the right of padtext=).

LilyPond can handle non-static substitution, too (you can think of these as functions).

     
     padText =
     #(define-music-function (parser location padding) (number?)
       #{
         \once \override TextScript #'padding = #$padding
       #})
     
     \relative c''' {
       c4^"piu mosso" b a b
       \padText #1.8
       c4^"piu mosso" d e f
       \padText #2.6
       c4^"piu mosso" fis a g
     }

[image of music]

Using identifiers is also a good way to reduce work if the LilyPond input syntax changes (see Updating old files). If you have a single definition (such as \dolce) for all your files (see Style sheets), then if the syntax changes, you only need to update your single \dolce definition, instead of making changes throughout every .ly file.


Next: , Previous: Suggestions for writing LilyPond files, Up: Working on LilyPond projects

This page is for LilyPond-2.10.33 (stable-branch).

Report errors to http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs.

Other languages: French.