[ < ] [ > ]   [ << ] [ Subir ] [ >> ]         [Arriba] [Índice general] [Índice] [ ? ]

B.6 Contextos para programadores

@translationof Contexts for programmers


[ < ] [ > ]   [ << ] [ Subir ] [ >> ]         [Arriba] [Índice general] [Índice] [ ? ]

B.6.1 Evaluación de contextos

@translationof Context evaluation

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]


[ < ] [ > ]   [ << ] [ Subir ] [ >> ]         [Arriba] [Índice general] [Índice] [ ? ]

B.6.2 Ejecutar una función sobre todos los objetos de la presentación

@translationof Running a function on all layout objects

La manera más versátil de realizar el ajuste fino de un objeto es \applyOutput, que funciona insertando un evento dentro del contexto especificado ( (internals)ApplyOutputEvent sección ‘ApplyOutputEvent’ en Referencia de Funcionamiento Interno). Su sintaxis es o bien

 
\applyOutput Contexto proc

o bien

 
\applyOutput Context.Grob proc

donde proc es una función de Scheme que toma tres argumentos.

Al interpretarse, la función proc se llama para cada objeto de presentación (con el nombre del grob Grob si se especifica) que se encuentra en el contexto Contexto en el tiempo actual, con los siguientes argumentos:

Además, la causa del objeto de presentación, es decir el objeto o expresión musical que es responsable de haberlo creado, está en la propiedad cause del objeto. Por ejemplo, para la cabeza de una nota, éste es un evento (internals)NoteHead sección ‘NoteHead’ en Referencia de Funcionamiento Interno, y para un objeto plica, éste es un objeto (internals)Stem sección ‘Stem’ en Referencia de Funcionamiento Interno.

He aquí una función que usar para \applyOutput; borra las cabezas de las notas que están sobre la línea central y junto a ella:

 
#(define (blanker grob grob-origin context)
   (if (< (abs (ly:grob-property grob 'staff-position)) 2)
       (set! (ly:grob-property grob 'transparent) #t)))

\relative {
  a'4 e8 <<\applyOutput Voice.NoteHead #blanker a c d>> b2
}

[image of music]

Para que función se interprete en los niveles de Score o de Staff utilice estas formas:

 
\applyOutput Score…
\applyOutput Staff…

[ < ] [ > ]   [ << ] [ Subir ] [ >> ]

Este documento ha sido generado por gub el el 13 julio 2020 utilizando texi2html 1.82.

Otros idiomas: English, deutsch, français.
Acerca de la selección automática del idioma.