B.6.1 Evaluación de contextos
Se pueden modificar los contextos durante la interpretación con código de Scheme. Dentro de un bloque de código de LilyPond, la sintaxis para esto es:
\applyContext función
En código de Scheme, la sintaxis es:
(make-apply-context function)
función debe ser una función de Scheme que toma un
único argumento, que es el contexto al que aplicarla. La función
puede acceder a, así como sobreescribir u establecer propiedades
de grobs s y propiedades de contextos. Cualquier acción tomada
por la función que dependa del estado del contexto, está limitada
al estado del contexto en el momento de llamar a la
función. Asimismo, los cambios efectuados por una llamada a
\applyContext permanecen en efecto hasta que se modifican
de nuevo directamente, o se revierten, incluso si han cambiado las
condiciones iniciales sobre las que dependen.
Las siguientes funciones de Scheme son útiles cuando se utiliza
\applyContext:
-
ly:context-property recuperar el valor de una propiedad de contexto
-
ly:context-set-property! establecer el valor de una propiedad de contexto
-
ly:context-grob-definition -
ly:assoc-get recuperar el valor de una propiedad de un grob
-
ly:context-pushpop-property hacer una sobreescritura temporal (
\temporary \override) o una reversión (\revert) sobre una propiedad de un grob
El ejemplo siguiente recupera el valor actual de fontSize,
y a continuación lo 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'
}
El ejemplo siguiente recupera los colores actuales de los grobs
NoteHead, Stem y Beam, y a continuación los
modifica para que tengan un matiz menos saturado.
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]
}
Esto puede implementarse también como una función musical, con el
objeto de restringir las modificaciones a un único bloque de
música. Observe cómo se usa ly:context-pushpop-property
tanto como una sobreescritura temporal
(\temporary \override) como una reversión
(\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
}