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'
}
[image of music]

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]
}
[image of music]

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
}
[image of music]

Extender LilyPond v2.25.27 (development-branch).