[ << Cambiar los valores por omisión ] | [Arriba][Índice general][Índice] | [ Tablas del manual sobre notación >> ] |
[ < Uso de alterBroken ] | [ Subir : Trucos avanzados ] | [ Uso de las funciones musicales > ] |
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.
[ << Cambiar los valores por omisión ] | [Arriba][Índice general][Índice] | [ Tablas del manual sobre notación >> ] |
[ < Uso de alterBroken ] | [ Subir : Trucos avanzados ] | [ Uso de las funciones musicales > ] |