B.8 Contenedores Unpure-pure

Nota: Si bien esta subsección refleja la situación actual, el ejemplo dado es irrelevante y no muestra ningún efecto.

Los contenedores unpure-pure son útiles para sobreescribir los cálculos de espaciado en Y-axis, el eje Y (específicamente Y-offset y Y-extent) con una función de Scheme en lugar de un valor literal, como un número o una pareja de números.

Para determinados objetos gráficos, las dimensiones verticales Y-extent están basadas en la propiedad stencil (sello): la sobreescritura de la propiedad sello de uno de estos objetos necesitaría otra sobreescritura de Y-extent con un contenedor unpure-pure. Cuando una función sobreescribe el desplazamiento Y-offset y/o las dimensiones verticales Y-extent, se supone que ello dispara los álculos de los saltos de línea demasiado pronro durante la compilación. Por ello la función no se evalúa en absoluto (devolviendo por lo general un valor de ‘0’ o de ‘'(0 . 0)’) lo que puede dar colisiones como resultado. Una función ‘pure’ no afecta a las propiedades, los objetos se suicidan y por tanto siempre tendrán evaluado correctamente su valor relacionado con el eje Y.

En este momento existen aproximadamente 30 funciones que ya se conbsideran ‘pure’ y los contenedores Unpure-pure son una manera de establecer como ‘pure’ funciones que no están en esta lista. La función ‘pure’ se evalúa antes de cualquier salto de línea y así el espaciado horizontal se puede ajustar ‘a tiempo’. La función ‘unpure’ se evalúa entonces después del salto de línea.

Nota: Dado que es difícil saber en todo momento qué funciones están en esta lista, recomendamos que cualquier función ‘pure’ que usted cree, no utilicen los objetos gráficos Beam ni VerticalAlignment.

Un contenedor unpure-pure se construye como sigue:

(ly:make-unpure-pure-container f0 f1)

donde f0 es una función que toma n argumentos (n >= 1) y el primer argumento debe ser siempre el grob. Esta es la función que da el resultado real. f1 es la función que se está etiquetando como ‘pure’ que toma n + 2 argumentos. De nuevo, el primer argumento siempre debe ser el grob, pero el segundo y el tercero son los argumentos de ‘inicio’ y ‘fin’.

inicio y fin son, a todos los efectos, valores mudos que solo tienen importancia para los objetos de extensión (Spanners como Hairpin, reguladores, o Beam, barras), que pueden devolver diferentes estimaciones de altura basadas en una columna de inicio y de final.

El resto son los otros argumentos para la primera función (que pueden no ser ninguno si n = 1).

Los resultados de la segunda función se usan como aproximación del valor requerido cuando se usa después por parte de la primera función para obtener el valor real que se usa entonces para el ajuste fino mucho tiempo después, durante el proceso de espaciado.

#(define (square-line-circle-space grob)
(let* ((pitch (ly:event-property (ly:grob-property grob 'cause)
                                 'pitch))
      (notename (ly:pitch-notename pitch)))
 (if (= 0 (modulo notename 2))
     (make-circle-stencil 0.5 0.0 #t)
     (make-filled-box-stencil '(0 . 1.0)
                              '(-0.5 . 0.5)))))

squareLineCircleSpace = {
  \override NoteHead.stencil = #square-line-circle-space
}

smartSquareLineCircleSpace = {
  \squareLineCircleSpace
  \override NoteHead.Y-extent =
   #(ly:make-unpure-pure-container
      ly:grob::stencil-height
      (lambda (grob start end) (ly:grob::stencil-height grob)))
}

\new Voice \with { \remove Stem_engraver }
\relative c'' {
  \squareLineCircleSpace
  cis4 ces disis d
  \smartSquareLineCircleSpace
  cis4 ces disis d
}
[image of music]

En el primer compás, sin un contenedor unpure-pure, el motor de espaciado no conoce la anchura de la cabeza de la nota ydeja que choque con las alteraciones accidentales. En el segundo compás, con contenedores unpure-pure, el motor de espaciado conoce el ancho de las cabezas de nota y evita la colisión alargando la línea adecuadamente.

Normalmente, para cálculos sencillos se pueden usar funciones casi idénticas para las dos partes ‘unpure’ y ‘pure’ , solo cambiando el número de los argumentos que se pasan a, y el ámbito de, la función. Este ejemplo de utilización es lo bastante frecuente como para que ly:make-unpure-pure-container construya una segunda función de forma predeterminada cuando se llama con solo un argumento de función.

Nota: Si una función se etiqueta como ‘pure’ y después resulta que no lo es, los resultados pueden ser inesperados.


Extender LilyPond v2.25.29 (development-branch).