4.4.4 変数と関数を用いて入力の手間を省く

これまでに、以下のような記述を見てきました:

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

\score {
  {
    \hornNotes
  }
}

[image of music]

これは音楽表記を最小化するのに役に立つ可能性があるということに気付くかもしれません:

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

violin = \new Staff {
  \fragmentA \fragmentA |
  \fragmentB \fragmentA |
}

\score {
  {
    \violin
  }
}

[image of music]

さらに、これらの変数 (変数、マクロ、(ユーザ定義) コマンドなどと呼ばれます) を調整のために使うこともできます:

dolce = \markup { \italic \bold dolce }

centerText = { \once \override TextScript.self-alignment-X = #CENTER }

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 |
    \centerText
    c4.^"hi there!" d8 e f g d |
    c4.\fthenp b8 c4 c-. |
  }
}

\score {
  {
    \violin
  }
}

[image of music]

これらの変数は明らかに入力の手間を省くのに役立っています。例え 1 回しか使用しない音楽であっても、変数化することを考慮する価値はあります – 変数化は複雑さを減らします。前の例を変数化しなかったものを見てみましょう。とても読み難く、特に最後の行が読み難いです。

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

これまでに見てきたのは静的な置き換えです – LilyPond は \centerText を見つけると、それを定義した内容 (つまり、centerText= の右側にあるもの) に置き換えます。

LilyPond は非静的な置き換えも処理できます (それらを関数と見なすことができます)。

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" b a b
  \padText #2.6
  c4^"piu mosso" b a b
}

[image of music]

変数を使うことは、LilyPond 入力構文に変更があった場合の作業を減らす良い方法でもあります (convert-ly を使ってファイルを更新する を参照してください)。あなたがあなたの入力ファイルすべてに使用する単一の定義 (\dolce のような) を持っていて、構文が変更された場合、すべての .ly ファイルを変更する代わりに、\dolce 定義をアップデートするだけで済みます。 (スタイル シート を参照してください。)


GNU LilyPond 学習マニュアル v2.25.22 (development-branch).