4.4.4 Úspora psaní na stroji pomocí proměnných a funkcí

Bis jetzt wurde immer derartige Notation vorgestellt:

hornNotes = \relative { c''4 b dis c }

\score {
  {
    \hornNotes
  }
}

[image of music]

Sie können sich vorstellen, dass das etwa für minimalistische Musik sehr nützlich sein könnte:

fragmentA = \relative { a'4 a8. b16 }
fragmentB = \relative { a'8. gis16 ees4 }
violin = \new Staff {
  \fragmentA \fragmentA |
  \fragmentB \fragmentA |
}

\score {
  {
    \violin
  }
}

[image of music]

Diese Variablen (die man auch als Makros oder Benutzer-Befehl bezeichnet) können jedoch auch für eigene Anpassungen eingesetzt werden:

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 {
  \repeat volta 2 {
    c''4._\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]

Derartige Variablen sind offensichtlich sehr nützlich, zu Tipparbeit zu ersparen. Aber es lohnt sich schon, sie zu benutzen, wenn man sie nur einmal benutzen will, denn sie vereinfachen die Struktur einer Datei sehr stark. Hier das vorige Beispiel ohne jede Benutzung von Variablen. Es ist sehr viel schwerer lesbar, besonders die letzte Zeile.

violin = \relative {
  \repeat volta 2 {
    c''4._\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-. |
  }
}

Bisher haben wir vor allem statische Ersetzungen betrachtet: wenn LilyPond etwa \padText sieht, wird es ersetzt mit all dem Code, mit dem wir es definiert haben (also alles, was sich rechts von padtext= befindet).

LilyPond kann auch nicht-statische Ersetzungen bewältigen. Man kann sie sich als Funktionen vorstellen.

padText =
#(define-music-function
     (padding)
     (number?)
   #{
     \once \override TextScript.padding = $padding
   #})

\relative {
  c'''4^"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]

Die Benutzung von Variablen ist auch eine gute Möglichkeit, Arbeit zu vermeiden, wenn sich einmal die Syntax von LilyPond ändern sollte (siehe auch with convert-ly Updating old input files with convert-ly). Wenn man eine einzige Definition hat (wie etwa \dolce), die für alle Vorkommen in der Notation eingesetzt wird, muss man auch nur einmal diese Definition aktualisieren, anstatt dass man sie in jeder ‘.ly’-Datei einzeln ändern müsste.


LilyPond – Learning Manual v2.23.82 (Vývojářská větev).