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'
}

[image of music]

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]
}

[image of music]

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
}

[image of music]


Extender LilyPond v2.25.21 (rama de desarrollo).