B.6.1 Avaluació de contextos
Es poden modificar els contextos durant la interpretació amb codi de l’Scheme. Dins d’un bloc de codi del LilyPond, la sintaxi per fer això és:
\applyContext funció
En codi de l’Scheme, la sintaxi és:
(make-apply-context funció)
funció
ha de ser una funció de l’Scheme que agafa un
únic argument, que és el context al qual aplicar-la. La funció
pot accedir a, així com sobreescriure o establir propietats de
grobs s i propietats de contextos. Qualsevol acció agafada per la
funció que depengui de l’estat del context, està limitada a
l’estat del context en el moment de cridar a la funció.
Així mateix, els canvis efectuats per una crida a
\applyContext
romanen en efecte fins que es modifiquen de
nou directament, o es reverteixen, fins i tot si han canviat les
condicions inicials sobre les que depenen.
Les funcions següents de l’Scheme són útils quan s’utilitza
\applyContext
:
ly:context-property
recuperar el valor d’una propietat de context
ly:context-set-property!
establir el valor d’una propietat de context
ly:context-grob-definition
ly:assoc-get
recuperar el valor d’una propietat d’un grob
ly:context-pushpop-property
fer una sobreescriptura temporal (
\temporary \override
) o una reversió (\revert
) sobre una propietat d’un grob
L’exemple següent recupera el valor actual de fontSize
, i a
continuació el dobla:
doubleFontSize = \applyContext #(lambda (context) (let ((fontSize (ly:context-property context 'fontSize))) (ly:context-set-property! context 'fontSize (+ fontSize 6)))) { \set fontSize = -3 b'4 \doubleFontSize b' }![]()
L’exemple següent recupera els colors actuals dels grobs
NoteHead
, Stem
i Beam
, i a continuació els
modifica perquè tinguin un matís menys saturat.
desaturate = \applyContext #(lambda (context) (define (desaturate-grob grob) (let* ((grob-def (ly:context-grob-definition context grob)) (color (ly:assoc-get 'color grob-def black)) (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color))) (ly:context-pushpop-property context grob 'color new-color))) (for-each desaturate-grob '(NoteHead Stem Beam))) \relative { \time 3/4 g'8[ g] \desaturate g[ g] \desaturate g[ g] \override NoteHead.color = #darkred \override Stem.color = #darkred \override Beam.color = #darkred g[ g] \desaturate g[ g] \desaturate g[ g] }![]()
Això pot implementar-se també com una funció musical, amb
l’objecte de restringir les modificacions a un únic bloc de
música. Observeu com s’usa ly:context-pushpop-property
tant com una sobreescriptura temporal
(\temporary \override
) com una reversió
(\revert
):
desaturate = #(define-music-function (music) (ly:music?) #{ \applyContext #(lambda (context) (define (desaturate-grob grob) (let* ((grob-def (ly:context-grob-definition context grob)) (color (ly:assoc-get 'color grob-def black)) (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color))) (ly:context-pushpop-property context grob 'color new-color))) (for-each desaturate-grob '(NoteHead Stem Beam))) #music \applyContext #(lambda (context) (define (revert-color grob) (ly:context-pushpop-property context grob 'color)) (for-each revert-color '(NoteHead Stem Beam))) #}) \relative { \override NoteHead.color = #darkblue \override Stem.color = #darkblue \override Beam.color = #darkblue g'8 a b c \desaturate { d c b a } g b d b g2 }![]()