[ << Fundamental concepts ] | [首页][目录][索引] | [ Tweaking output >> ] |
[ < Building a score from scratch ] | [ 上 : Extending the templates ] | [ Scores and parts > ] |
4.4.4 Saving typing with variables and functions
By this point, you’ve seen this kind of thing:
hornNotes = \relative { c''4 b dis c } \score { { \hornNotes } }
You may even realize that this could be useful in minimalist music:
fragmentA = \relative { a'4 a8. b16 } fragmentB = \relative { a'8. gis16 ees4 } violin = \new Staff { \fragmentA \fragmentA | \fragmentB \fragmentA | } \score { { \violin } }
However, you can also use these variables (also known as macros, or user-defined commands) for tweaks:
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 } }
These variables 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 variables. It’s a lot harder to read, especially the last line.
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-. | } }
Remember ‘post-events’? Articulations, fingerings, anything that has to be added after a note (see Structure of a note entry), often prefixed with a dash or a direction modifier. In fact, even these events can be stored in a variable – in which case the usual curly braces are not wanted, since you wouldn’t use them between a note and its articulations.
If such a definition includes a prefix, then the variable can be used directly after the note – unless you want to change its direction, in which case you can insert a modifier that will take precedence:
articulationVar = -^-! artEsprVar = \articulationVar ^\espressivo \relative c' { c\articulationVar d e2^\articulationVar d2\artEsprVar c_\artEsprVar }
So far we’ve seen static substitution – when LilyPond
sees \centerText
, it replaces it with the stuff that
we’ve defined it to be (ie the stuff to the right of
centerText=
).
LilyPond can handle non-static substitution, too (you can think of these as functions).
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 }
Using variables is also a good way to reduce work if the
LilyPond input syntax changes (see
Updating files with convert-ly). If
you have a single definition (such as \dolce
) for all your
input 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.
[ << Fundamental concepts ] | [首页][目录][索引] | [ Tweaking output >> ] |
[ < Building a score from scratch ] | [ 上 : Extending the templates ] | [ Scores and parts > ] |