Manual de aprendizaje de GNU LilyPond: 4.4.3 Objetos fuera del pentagrama

### 4.4.3 Objetos fuera del pentagrama

Los objetos fuera-del-pentagrama se sitúan automáticamente para evitar las colisiones. Existen varias formas de sobreescribir la colocación automática si el posicionado no resulta óptimo.

#### La propiedad `outside-staff-priority` (prioridad fuera del pentagrama)

Los objetos fuera-del-pentagrama se colocan automáticamente para evitar las colisiones. Los objetos que tienen el valor más bajo de la propiedad `outside-staff-priority` se sitúan más cerca del pentagrama, y entonces otros objetos fuera-del-pentagrama se elevan tanto como sea necesario para evitar la colisión. La prioridad `outside-staff-priority` se defina en el `grob-interface` y así es una propiedad de todos los objetos de presentación. De forma predeterminada se establece a `#f` para todos los objetos dentro-del-pentagrama, y a un valor numérico adecuado a cada objeto fuera-del-pentagrama cuando se crea el objeto. La tabla siguiente presenta los valores numéricos predeterminados para algunos de los objetos fuera-del-pentagrama más comunes.

Observe los nombres algo inusuales de algunos de los objetos: los objetos de extensión se crean automáticamente para controlar el posicionamiento vertical de los grobs que (quizá) comienzan y terminan en distintos momentos musicales, de manera que cualquier modificación a la prioridad `outside-staff-priority` del grob subyacente no tiene ningún efecto. Por ejemplo, cambiar la `outside-staff-priority` del objeto de regulador `Hairpin` no tiene efecto sobre la posición vertical de los reguladores: en lugar de eso, tenemos que cambiar la `outside-staff-priority` del objeto asociado `DynamicLineSpanner`. Esta sobreescritura se debe escribir al comienzo del objeto de extensión, que podría incluir varios reguladores o matices dinámicos encadenados.

Objeto de presentación | Prioridad | Controla la posición de:
--- | --- | ---
`RehearsalMark` | `1500` | Letras de ensayo
`MetronomeMark` | `1000` | Indicaciones metronómicas
`VoltaBracketSpanner` | `600` | Cajetines de primera y segunda vez
`TextScript` | `450` | Texto en elementos de marcado
`MultiMeasureRestText` | `450` | Texto sobre silencios de compás completo
`OttavaBracket` | `400` | Corchetes de octava alta y baja
`TextSpanner` | `350` | Objetos de extensión de texto
`DynamicLineSpanner` | `250` | Todas las indicaciones dinámicas
`VoltaBracketSpanner` | `100` | Números de compás
`TrillSpanner` | `50` | Trinos mantenidos

He aquí un ejemplo que muestra la situación predeterminada de algunos de ellos.

>     % Set details for later Text Spanner
>     \override TextSpanner.bound-details.left.text
>         = \markup { \small \bold Slower }
>     % Place dynamics above staff
>     \dynamicUp
>     % Start Ottava Bracket
>     \ottava #1
>     c''4 \startTextSpan
>     % Add Dynamic Text and hairpin
>     c''4\pp\<
>     c''4
>     % Add Text Script
>     c''4^Text |
>     c''4 c''
>     % Add Dynamic Text and terminate hairpin
>     c''4\ff c'' \stopTextSpan |
>     % Stop Ottava Bracket
>     \ottava #0
>     c'4 c' c' c' |

Este ejemplo también muestra cómo crear textos con extensión (Text Spanners): textos con líneas extensoras por encima de una sección de música. El extensor abarca desde la instrucción `\startTextSpan` hasta la instrucción `\stopTextSpan`, y el formado del texto se define por medio de la instrucción `\override TextSpanner`. Para ver más detalles, consulte Extensiones de texto.

También muestra la manera de crear corchetes de octava alta y baja.

Si los valores predeterminados de `outside-staff-priority` no le ofrecen las colocaciones deseadas se puede sobreescribir la prioridad de cualquiera de los objetos. Suponga que quisiéramos que el corchete de octava estuviera situado por debajo del elemento extensor de texto en el ejemplo de arriba. Todo lo que debemos hacer es localizar la prioridad de `OttavaBracket` en el RFI o en las tablas anteriores, y reducirlo a un valor inferior al de `TextSpanner`, recordando que `OttavaBracket` se crea dentro del contexto de `Staff`:

>     % Set details for later Text Spanner
>     \override TextSpanner.bound-details.left.text
>         = \markup { \small \bold Slower }
>     % Place dynamics above staff
>     \dynamicUp
>     % Place following Ottava Bracket below Text Spanners
>     \once \override Staff.OttavaBracket.outside-staff-priority = #340
>     % Start Ottava Bracket
>     \ottava #1
>     c''4 \startTextSpan
>     % Add Dynamic Text
>     c''4\pp
>     % Add Dynamic Line Spanner
>     c''4\<
>     % Add Text Script
>     c''4^Text |
>     c''4 c''
>     % Add Dynamic Text
>     c''4\ff c'' \stopTextSpan |
>     % Stop Ottava Bracket
>     \ottava #0
>     c'4 c' c' c' |

Observe que algunos de estos objetos, concretamente los números de compás, las indicaciones metronómicas y las letras de ensayo, se alojan de forma predeterminada dentro del contexto `Score`; así pues, debe asegurarse de que utiliza el contexto adecuado cuando se sobreescriben sus propiedades.

De forma predeterminada, las ligaduras de expresión están clasificadas como objetos dentro-del-pentagrama, pero con frecuencia aparecen encima del pentagrama si las notas que une son muy agudas. Ello puede empujar a una posición muy elevada a los objetos fuera-del-pentagrama como las articulaciones, pues la ligadura se colocará en primer lugar. La propiedad `avoid-slur` de la articulación se puede establecer al valor `'inside` (por dentro) para llevarla al interior de la ligadura, pero la propiedad `avoid-slur` es efectiva solamente si la prioridad `outside-staff-priority` está también ajustada al valor `#f`. De forma alternativa, la prioridad `outside-staff-priority` de la ligadura se puede fijar en un valor numérico para hacer que se sitúe en línea con otros objetos fuera del pentagrama de acuerdo con este valor. He aquí un ejemplo que muestra el efecto de los dos métodos:

>     \relative c'' {
>       c4( c^\markup { \tiny \sharp } d4.) c8 |
>       c4(
>         \once \override TextScript.avoid-slur = #'inside
>         \once \override TextScript.outside-staff-priority = ##f
>         c4^\markup { \tiny \sharp } d4.) c8 |
>       \once \override Slur.outside-staff-priority = #500
>         c4( c^\markup { \tiny \sharp } d4.) c8 |
>     }

Los cambios en `outside-staff-priority` también se pueden emplear para controlar la situación vertical de los objetos individuales, aunque los resultados pueden no siempre ser deseables. Suponga que quiere que “Text3” se sitúe por encima de “Text4” en el ejemplo bajo el epígrafe Comportamiento Automático de más arriba (véase Comportamiento automático). Todo lo que debemos hacer es localizar la prioridad de `TextScript` en el RFI o en las tablas de arriba, y aumentar la prioridad de “Text3” hasta un valor superior:

>     c''2^"Text1"
>     c''2^"Text2" |
>     \once \override TextScript.outside-staff-priority = #500
>     c''2^"Text3"
>     c''2^"Text4" |

Esto, ciertamente, eleva a “Text3” por encima de “Text4” pero también lo eleva por encima de “Text2”, y “Text4” ahora se desploma hacia abajo. Quizá no sea tan buena idea. ¿Y si lo que realmente queremos hacer es posicionar todas las anotaciones a la misma distancia por encima del pentagrama? Para hacerlo, vamos a necesitar claramente espaciar las notas en sentido horizontal para hacer sitio para el texto. Esto se hace empleando la instrucción `textLengthOn`.

#### La instrucción `\textLengthOn`

De forma predeterminada, el texto producido mediante marcado no ocupa ningún espacio horizontal en cuanto se refiere a la disposición de la música. La instrucción `\textLengthOn` invierte este comportamiento, ocasionando que las notas resulten tan espaciadas como sea necesario para acomodar el texto:

>     \textLengthOn  % Cause notes to space out to accommodate text
>     c''2^"Text1"
>     c''2^"Text2" |
>     c''2^"Text3"
>     c''2^"Text4" |

La instrucción para volver al comportamiento predeterminado es `\textLengthOff`. De forma alternativa, se puede usar `\once` con `\textLengthOn` si el efecto se ha de limitar a un solo momento musical. El comportamiento de espaciado correspondiente para las llamadas de ensayo y las indicaciones de tempo se controla independientemente con las instrucciones `\markLengthOn` y `\markLengthOff`.

El texto de marcado también evita las notas que se proyectan por encima del pentagrama. Si esto no es lo que deseamos, el desplazamiento automático hacia arriba se puede desactivar mediante el establecimiento de la prioridad a `#f`. He aquí un ejemplo que muestra cómo el texto de marcado interactúa con tales notas.

>     \relative {
>       % This markup is short enough to fit without collision
>       c''2^"Tex" c'' |
>       R1 |

>       % This is too long to fit, so it is displaced upwards
>       c,,2^"Text" c'' |
>       R1 |

>       % Turn off collision avoidance
>       \once \override TextScript.outside-staff-priority = ##f
>       c,,2^"Long Text   " c'' |
>       R1 |

>       % Turn off collision avoidance
>       \once \override TextScript.outside-staff-priority = ##f
>       \textLengthOn        % and turn on textLengthOn
>       c,,2^"Long Text   "  % Spaces at end are honored
>       c''2 |
>     }

#### Posicionamiento de los matices dinámicos

Las indicaciones de matiz dinámico normalmente se colocarán por debajo del pentagrama, pero se pueden posicionar por encima con la instrucción `\dynamicUp`. Se situarán verticalmente respecto a la nota a la que van adosadas, y flotarán por debajo (o por encima) de todos los objetos dentro-del-pentagrama tales como ligaduras de fraseo y números de compás. Esto puede ofrecer resultados bastante aceptables, como muestra este ejemplo:

>     \relative {
>       \clef "bass"
>       \key aes \major
>       \time 9/8
>       \dynamicUp
>       bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! |
>       ees,2.~\)\mf ees4 r8 |
>     }

Sin embargo, si las notas y sus indicaciones dinámicas adosadas están muy cerca, la colocación automática evitará las colisiones desplazando las marcas dinámicas posteriores más lejos, aunque este puede no ser el lugar óptimo, como muestra el siguiente ejemplo más bien artificial:

>     \dynamicUp
>     \relative { a'4\f b\mf a\mp b\p }

Si se presentara una situación similar en música ‘real’, podría ser preferible espaciar las notas un poco más entre sí, de forma que todas las marcas dinámicas puedan caber a la misma distancia vertical desde el pentagrama. Hemos sido capaces de hacer esto para el texto de marcado utilizando la instrucción `\textLengthOn`, pero no existe una instrucción equivalente para las indicaciones de matiz dinámico. Por tanto, tendremos que averiguar cómo hacerlo utilizando instrucciones `\override`.

#### Escalado de un «Grob»

En primer lugar debemos aprender cómo se especifica el tamaño de los grobs. Todos los grobs tienen un punto de referencia definido dentro de ellos que se usa para colocarlos respecto a su objeto padre. Entonces, este punto del grob se posiciona a una distancia horizontal, `X-offset`, y una distancia vertical, `Y-offset`, a partir de su padre. La dimensión horizontal del objeto viene dada por una pareja de números, `X-extent`, que dice dónde están los límites izquierdo y derecho respecto del punto de referencia. La amplitud vertical se define de forma similar mediante una pareja de números, `Y-extent`. Éstas son propiedades de todos los grobs que contemplan el `grob-interface`.

De forma predeterminada, los objetos fuera-del-pentagrama reciben una anchura cero, de manera que pueden solaparse en la dirección horizontal. Esto se hace mediante el truco de hacer que la dimensión más a la izquierda sea igual a infinito y que la dimensión más a la derecha sea igual a menos infinito, estableciendo el valor de `extra-spacing-width` a `'(+inf.0 . -inf.0)`. Así, para asegurar que no se superponen en la dirección horizontal tendremos que sobreescribir este valor de `extra-spacing-width` para darles un poco de espacio adicional. Las unidades son el espacio entre dos líneas del pentagrama, de forma que debería bastar mover el límite izquierdo media unidad a la izquierda y el límite derecho media unidad a la derecha:

>     \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5)

Veamos si funciona en nuestro ejemplo anterior:

>     \dynamicUp
>     % Extend width by 1 staff space
>     \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5)
>     \relative { a'4\f b\mf a\mp b\p }

Esto tiene un mejor aspecto, pero quizá habríamos preferido que las indicaciones de dinámica estuvieran alineadas sobre la misma línea de base en lugar de ir hacia arriba y hacia abajo con las notas. La propiedad que lo hace es `staff-padding` (relleno de pentagrama) que se estudia en la sección dedicada a las colisiones (véase Colisiones de objetos).

#### LilyPond — Manual de aprendizaje v2.22.2 (rama estable).