Referencia de la notación de GNU LilyPond: 5.5.6 Contenedores unpure-pure

### 5.5.6 Contenedores unpure-pure

Los contenedores ‘unpure-pure’ (pura y no pura) son útiles para la sobreescritura de los cálculos del espaciado en el eje Y (concretamente `Y-offset` e `Y-extent`) con una función de Scheme en lugar de un literal, es decir, un número o una pareja de números.

Para ciertos objetos gráficos, las dimensiones `Y-extent` están basadas en la propiedad `stencil`, la sobreescritura de la propiedad de sello de éstos requiere una sobreescritura adicional de `Y-extent` con un contenedor unpure-pure. Cuando una función sobreescribe una dimensión `Y-offset` y/o `Y-extent` se supone que esto dispara los cálculos de los saltos de línea prematuramente durante la compilación. Así pues, la función no se evalúa en absoluto (devolviendo por lo general un valor de ‘`0`’ o ‘`'(0 . 0)`’) lo que puede dar lugar a colisiones. Una función ‘pura’ no afecta a las propiedades, objetos o suicidios de grobs, y por ello siempre ven sus valores relacionados con el eje Y evaluados correctamente.

Actualmente hay unas treinta funciones que ya se consideran ‘puras’ y los contenedores Unpure-pure son una manera de establecer funciones que no están en esta lista como ‘puras’. La función ‘pura’ se evalúa antes de cualquier salto de línea y así el espaciado horizontal se puede ajustar ‘a tiempo’. La función ‘impura’ se evalúa entonces después del salto de línea.

Nota: Dado que es difícil saber siempre qué funciones están en esta lista, recomendamos que cualquier función ‘pura’ que estemos creando no utilice los grobs `Beam` o `VerticalAlignment`.

Un contenedor ‘unpure-pure’ se contruye de la manera siguiente:

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

donde `f0` es una función que toma n argumentos (n >= 1) y el primer argumento siempre debe ser el grob. Ésta es la función que da el resultado real. f1 es la función que se etiqueta como ‘pura’ que toma n + 2 argumentos. De nuevo, el primer argumento debe ser siempre el grob pero los argumentos segundo y tercero son argumentos de ‘inicio’ y de ‘final’.

inicio y final son, a todos los efectos, valores mudos que sólo tienen importancia para los `objetos de extensión` (o sea: `Hairpin`, regulador, o `Beam`, barra), que pueden devolver distintas estimaciones de altura basadas en una columna de inicio y una de final.

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

El resultado de la segunda función se usa como una aproximación del valor necesario, que se usa entonces por la primera función para obtener el valor real que se usa a continuación para el ajuste de precisión mucho más tardío 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
>     }

En el primer compás, sin el contenedor unpure-pure, el motor de espaciado no conoce la anchura de la cabeza de la nota y permite que colisione con las alteraciones accidentales. En el segundo compás, el motor de espaciado conoce la anchura de las cabezas de las notas y evita la colisión mediante el alargamiento de la línea en la medida adecuada.

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

Nota: Si una función está caracterizada como ‘pura’ y resulta que no lo es, el resultado puede ser inesperado.

#### LilyPond — Referencia de la notación v2.22.2 (rama estable).