Creating music expressions in Scheme can be tedious, as they are
heavily nested and the resulting Scheme code is large. For some
simple tasks, this can be avoided, using common LilyPond syntax inside
Scheme, with the dedicated #{ ... #}
syntax.
The following two expressions give equivalent music expressions:
mynotes = { \override Stem #'thickness = #4 { c'8 d' } } #(define mynotes #{ \override Stem #'thickness = #4 { c'8 d' } #})
The content of #{ ... #}
is enclosed in an implicit {
... }
block, which is parsed. The resulting music expression, a
SequentialMusic
music object, is then returned and usable in Scheme.
Arbitrary Scheme forms, including variables, can be used in #{ ... #}
expressions with the $
character ($$
can be used to
produce a single $
character). This makes the creation of simple
functions straightforward. In the following example, a function
setting the TextScript's padding is defined:
#(use-modules (ice-9 optargs)) #(define* (textpad padding #:optional once?) (ly:export ; this is necessary for using the expression ; directly inside a block (if once? #{ \once \override TextScript #'padding = #$padding #} #{ \override TextScript #'padding = #$padding #}))) { c'^"1" #(textpad 3.0 #t) % only once c'^"2" c'^"3" #(textpad 5.0) c'^"4" c'^"5" }
Here, the variable padding
is a number; music expression
variables may also be used in a similar fashion, as in the following
example:
#(define (with-padding padding) (lambda (music) #{ \override TextScript #'padding = #$padding $music \revert TextScript #'padding #})) { c'^"1" \applymusic #(with-padding 3) { c'^"2" c'^"3" } c'^"4" }
The function created by (with-padding 3)
adds \override
and
\revert
statements around the music given as an argument, and returns
this new expression. Thus, this example is equivalent to:
{ c'^"1" { \override TextScript #'padding = #3 { c'^"2" c'^"3"} \revert TextScript #'padding } c'^"4" }
This function may also be defined as a music function:
withPadding = #(def-music-function (parser location padding music) (number? ly:music?) #{ \override TextScript #'padding = #$padding $music \revert TextScript #'padding #}) { c'^"1" \withPadding #3 { c'^"2" c'^"3"} c'^"4" }
This page is for LilyPond-2.6.3 (stable-branch).