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 }