Saving typing with identifiers and functions - GNU LilyPond
Description: GNU LilyPond

Next: Style sheets, Previous: Troubleshooting (taking it all apart), Up: Working on LilyPond projects

### 4.5 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
>            }
>          }

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
>            }
>          }

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}
>          }

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
>          }

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.

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

Other languages: English.
Using automatic language selection.