5.4 Desplazamientos y alineaciones (Manual de aprendizaje de GNU LilyPond)

### 5.4 Desplazamientos y alineaciones

LilyPond necesita saber dónde colocar todos y cada uno de los objetos gráficos. Esta información de la colocación se almacena utilizando coordenadas relativas: la posición de un grob se define de forma relativa a la posición de su ancestro (si, en lugar de ello, tuviésemos que emplear coordenadas absolutas como por ejemplo las distancias a partir de los límites de la página, sería muy difícil mantener las relaciones espaciales entre unos grobs y otros).

Cada uno de los grobs sabe qué objeto es su ancestro en el eje respectivo. Por ejemplo, un grob `Flag` (corchete) sabe que su x-parent (el ancestro en el eje x) es un determinado grob `Stem` (plica).

Las coordenadas relativas que describen la ubicación de un grob se almacenan en propiedades de grob llamadas `X-offset` (desplazamiento en X) y `Y-offset` (desplazamiento en Y). Estas se miden en espacios de pentagrama. `X-offset` es el desplazamiento horizontal entre el punto de referencia del grob y el punto de referencia del x-parent del grob (y de forma similar con `Y-offset`).

¿Qué es un punto de referencia? Es un punto especial que define la posición del grob. Piense en ello de forma geomátrica: si tiene que definir dónde se sitúa una figura sobre el plano, normalmente diría algo como “la esquina inferior izquierda de este cuadrado tiene como coordenadas (0, 2)”, o “el centro de este círculo está en (-1, 3)”. ‘Esquina inferior izquierda’ y ‘centro’ serían los puntos de referencia para el cuadrado y el círculo, respectivamente.

Esta ilustración muestra dónde se ubican los puntos de referencia de determinados grobs, indicados como puntos rojos (por ejemplo, la línea central del pentagrama para las barras de compás y las plicas, la intersección entre la línea de base y el extremo izquierdo en el caso de una caja de texto, o el centro vertical en el lado izquierdo para una cabeza de nota).

    {
      \override NoteHead.style = #'altdefault     % for breve

      \time 4/2 g'2-> c''\fermata as'1^"Yogi" |
      b'\breve _"Larry" |
      \mark "Twinkle" e''8 s4.. \bar "|."
    }

Sobreescribiendo los valores `X-offset` o `Y-offset` podemos mover grobs de forma relativa a sus respectivos padres o ancestros:

    {
      \override Script.X-offset = 3               % fermata, accent
      \override TextScript.X-offset = 2           % "Yogi", "Larry"
      \override Stem.X-offset = -2
      \override Score.RehearsalMark.Y-offset = 5  % "Twinkle"

      \override NoteHead.style = #'altdefault     % for breve

      \time 4/2 g'2-> c''\fermata as'1^"Yogi" |
      b'\breve _"Larry" |
      \mark "Twinkle" e''8 s4.. \bar "|."
    }

Observe que el grob `Flag` (corchete) se ha movido juntamente con su grob `Stem` (plica).

Nota: Cambiar `X-offset` o `Y-offset` no siempre funciona como se espera, véase Aligning objects.

Ahora vamos a explicar otra pareja de propiedades: `X-extent` y `Y-extent`. Cada una de ellas es un par de números (internamente, LilyPond le llama a esto un intervalo), y almacenan las dimensiones de un grob relativas a su punto de referencia. Por ejemplo, `X-extent` igual a (-1 . 4) significa que el borde izquierdo del grob está 1 espacio de pentagrama a la izquierda de su punto de referencia, y el borde derecho está 4 espacios de pentagrama a la derecha del punto de referencia, dando una anchura total del 4 - (-1) = 4 + 1 = 5 espacios de pentagrama. Ambos números dentro de un ámbito de dimensiones pueden ser positivos; por ejemplo, (2 . 3) es una extensión válida: significa que el grob en su totalidad está a la derecha de su punto de referencia, y el ancho del grob es 3 - 2 = 1 espacio de pentagrama. De forma similar, ambos números pueden ser negativos; estas situaciones son bastante poco usuales pero no suponen ningún dolor de cabeza para LilyPond. La situación más común (al menos para `X-extent`) es que el primer número sea 0, lo que significa que el punto de referencia está justo en el extremo izquierdo del grob.

El ejemplo precedente muestra esto de una forma muy adecuada: tanto el borde izquierdo del accento como el del calderón están a la izquierda del punto de referencia; lo mismo vale para la cabeza de nota de breve (aquí hemos seleccionado el estilo `'altdefault` para las cabezas de forma que esto sea más visible).

Ahora supongamos que queremos posicionar un grob `RehearsalMark` (marca de ensayo) de tal manera que el borde derecho esté alineado con una barra de compás (de forma predeterminada, LilyPond centra la marca de ensayo horizontalmente). Con `X-offset` igual a cero (esto es, su punto de referencia está alineado con el ancestro, que es igual a la línea de compás en esta situación), el objeto gráfico `RehearsalMark` se posiciona de la siguiente manera:

>     {
>       \override Score.RehearsalMark.X-offset = 0
>       b4 b b b \mark "Twinkle" b b b b
>     }

Así pues, tenemos que desplazarlo. ¿Recuerda lo que significa el segundo número dentro de `X-extent`? Es la posición del borde derecho del grob relativo a su punto de referencia. Si sustraemos este valor a partir del cero, obtendremos el `X-offset` que buscamos:

>     {
>       % value -10.4 found by trial and error
>       \override Score.RehearsalMark.X-offset = -10.4
>       b4 b b b \mark "Twinkle" b b b b
>     }

¿Qué pasaría si quisiéramos centrar un grob sobre el punto de referencia de su ancestro? Es sencillo: calculemos el desplazamiento entre el punto de referencia del grob y el centro de sus dimensiones. He aquí algunos ejemplos:

- `X-extent` = (-2 . 2)
  ⇒ `X-offset` = 0 - 0 = 0
- `X-extent` = (0 . 4)
  ⇒ `X-offset` = 0 - (0 + 0.5 * 4) = -2
- `X-extent` = (-2 . 4)
  ⇒ `X-offset` = 0 - ((0.5 * -2) + (0.5 * 4)) = 0 - (-1 + 2) = -1

Ya existe una función (con un nombre súper largo) que puede efectuar estos cálculos por nosotros:

    \override GrobName.X-offset =
      #ly:self-alignment-interface::x-aligned-on-self

y solamente tenemos que especificar qué tipo de alineación deseamos:

    \override GrobName.self-alignment-X = #RIGHT

Este código dice al procedimiento que encuentre el desplazamiento entre el punto de referencia de un grob y su borde derecho, y lo use como el desplazamiento en x, lo que hará que el grob resulte alineado por la derecha.

De manera que si cambiamos las dimensiones de un grob, estaremos afectando a la manera en que se alinea (porque LilyPond pensará que las dimensiones del grob son diferentes):

>     {
>       \override Score.RehearsalMark.X-extent = #'(0 . 8)
>       \override Score.RehearsalMark.self-alignment-X = #RIGHT
>       b4 b b b \mark "Twinkle" b b b b
>     }

Asimismo, si las dimensiones de un grob son vacías (es decir, no es una pareja de intervalos), procedmientos como `x-aligned-on-self` no tendrán ninguna información sobre las dimensiones de, grob, y entonces no será capaz de calcular ningún desplazamiento (se limitará a devolver un valor 0). En otras palabras, un grob con unas dimensiones vacías solo se puede ‘alinear’ sobre su punto de referencia porque no hay otra información se se pueda usar para alinearlo:

>     {
>       \override Score.RehearsalMark.X-extent = ##f
>       b4 b b b \mark "Twinkle" b b b b
>     }

Observe que unas dimensiones vacías y unas dimensiones nulas dan como resultado la misma posición:

>     {
>       \override Score.RehearsalMark.X-extent = #'(0 . 0)
>       b4 b b b \mark "Twinkle" b b b b
>     }

Sin embargo, unas dimensiones vacías (o nulas, o cualquier otra dimensión) no nos impiden ubicar el grob en cualquier posición que deseemos: es solo que no podemos usar procedimientos de alineación para ello. Aún podemos especificar cualquier desplazamiento que queramos, y funcionará de la manera usual:

>     {
>       \override Score.RehearsalMark.X-extent = ##f
>       \override Score.RehearsalMark.X-offset = -10.4
>       b4 b b b \mark "Twinkle" b b b b
>     }

Ahora, hay una cosa más que no podemos olvidar: el ancestro de un grob tiene también sus propias dimensiones, y tenemos que tenerlas en cuenta. Por ejemplo, si escribimos

>     { a'1 }
>     \addlyrics {
>       \override LyricText.X-offset =
>         #ly:self-alignment-interface::x-aligned-on-self
>       \override LyricText.self-alignment-X = #CENTER
>       nn
>     }

El grob `LyricText` estará centrado, pero sobre el punto de referencia de su ancestro (esto es, el centro de la sílaba estará alineado con el punto de referencia de la cabeza de la nota). Si queremos que el centro del grob `LyricText` se alinee con el centro de su grob `NoteHead` padre, tenemos que usar un procedimiento distinto: `aligned-on-x-parent`. Funciona de manera muy similar a `x-aligned-on-self`, pero además de calcular un desplazamiento basado en las propias dimensiones del grob, usa también las dimensiones del objeto padre y calcula las posiciones relativas al centro del tamaño total:

>     { a'1 }
>     \addlyrics {
>       \override LyricText.X-offset =
>         #ly:self-alignment-interface::aligned-on-x-parent
>       \override LyricText.self-alignment-X = #CENTER
>       nn
>     }

#### Manual de aprendizaje de GNU LilyPond v2.26.0 (stable-branch).

- 1 Installing
  - 1.1 Graphical setup
  - 1.2 Command line setup
- 2 Tutorial
  - 2.1 Compilación del archivo
  - 2.2 Cómo escribir archivos de entrada
    - 2.2.1 Notación sencilla
      - Alturas
      - Duraciones (valores rítmicos)
      - Silencios
      - Indicación de compás
      - Indicaciones de tempo
      - Clave
      - Todo junto
    - 2.2.2 Trabajar sobre los archivos de entrada
  - 2.3 Tratar con los errores
    - 2.3.1 Consejos generales de solución de problemas
    - 2.3.2 Algunos errores comunes
  - 2.4 Cómo leer los manuales
    - 2.4.1 Material omitido
    - 2.4.2 Ejemplos con enlace
    - 2.4.3 Panorámica de los manuales
- 3 Notación corriente
  - 3.1 Notación en un solo pentagrama
    - 3.1.1 Líneas divisorias y comprobaciones de compás
      - Líneas divisorias
      - Comprobaciones de compás
    - 3.1.2 Alturas y armaduras
      - Alteraciones accidentales
      - Armaduras
      - Advertencia: armaduras y alturas
    - 3.1.3 Ligaduras de unión y de expresión
      - Ligaduras de unión
      - Ligaduras de expresión
      - Ligaduras de fraseo
      - Advertencias: ligaduras de expresión frente a ligaduras de unión
    - 3.1.4 Articulaciones y matices dinámicos
      - Articulaciones
      - Indicaciones de digitación
      - Matices dinámicos
    - 3.1.5 Añadir texto
    - 3.1.6 Barras automáticas y manuales
    - 3.1.7 Instrucciones rítmicas avanzadas
      - Compás parcial
      - Grupos especiales
      - Notas de adorno
  - 3.2 Varias notas a la vez
    - 3.2.1 Explicación de las expresiones musicales
      - Analogía: expresiones matemáticas
      - Expresiones musicales simultáneas: varios pentagramas
      - Expresiones musicales simultáneas: un solo pentagrama
    - 3.2.2 Varios pentagramas
    - 3.2.3 Grupos de pentagramas
    - 3.2.4 Combinar notas para formar acordes
    - 3.2.5 Polifonía en un solo pentagrama
  - 3.3 Canciones
    - 3.3.1 Elaborar canciones sencillas
    - 3.3.2 Alineación de la letra a una melodía
    - 3.3.3 Letra en varios pentagramas
  - 3.4 Retoques finales
    - 3.4.1 Organizar las piezas mediante variables
    - 3.4.2 Añadir títulos
    - 3.4.3 Nombres de nota absolutos
    - 3.4.4 Más allá del tutorial
- 4 Conceptos fundamentales
  - 4.1 Cómo funcionan los archivos de entrada de LilyPond
    - 4.1.1 Introducción a la estructura de los archivos de LilyPond
    - 4.1.2 La partitura es una (única) expresión musical compuesta
    - 4.1.3 Anidado de expresiones musicales
    - 4.1.4 Estructura de un elemento de nota
    - 4.1.5 Acerca de la no anidabilidad de llaves y ligaduras
  - 4.2 Las voces contienen música
    - 4.2.1 Oigo voces
    - 4.2.2 Voces explícitas
    - 4.2.3 Voces y música vocal
  - 4.3 Contextos y grabadores
    - 4.3.1 Explicación de los contextos
    - 4.3.2 Crear contextos
    - 4.3.3 Explicación de los grabadores
    - 4.3.4 Modificar las propiedades de los contextos
    - 4.3.5 Añadir y eliminar grabadores
  - 4.4 Extender las plantillas
    - 4.4.1 Soprano y violoncello
    - 4.4.2 Partitura vocal a cuatro voces SATB
    - 4.4.3 Crear una partitura partiendo de cero
    - 4.4.4 Ahorrar tecleo mediante variables y funciones
    - 4.4.5 Partituras y particellas
- 5 Trucar la salida
  - 5.1 Elementos de trucaje
    - 5.1.1 Objetos e interfaces
    - 5.1.2 Convenciones de nombres de objetos y propiedades
    - 5.1.3 Métodos de trucaje
      - La instrucción `\override`
      - La instrucción `\revert`
      - El prefijo `\once`
      - Las instrucciones `\tweak` y `\offset`
      - El prefijo `\single`
  - 5.2 Manual de referencia de funcionamiento interno
    - 5.2.1 Propiedades de los objetos de presentación
    - 5.2.2 Propiedades de las interfaces
    - 5.2.3 Tipos de propiedades
  - 5.3 Apariencia de los objetos
    - 5.3.1 Visibilidad y color de los objetos
      - La propiedad `stencil` (sello)
      - La propiedad `break-visibility` (visibilidad en el salto)
      - La propiedad `transparent` (transparente)
      - La propiedad `color`
    - 5.3.2 Tamaño de los objetos
    - 5.3.3 Longitud y grosor de los objetos
  - 5.4 Desplazamientos y alineaciones
  - 5.5 Colocación de los objetos
    - 5.5.1 Comportamiento automático
    - 5.5.2 Objetos interiores al pentagrama
      - La propiedad `direction` (dirección)
      - Digitaciones
    - 5.5.3 Objetos fuera del pentagrama
      - La propiedad `outside-staff-priority` (prioridad fuera del pentagrama)
      - La instrucción `\textLengthOn`
      - Posicionamiento de los matices dinámicos
      - Escalado de un «Grob»
  - 5.6 Espaciado vertical
  - 5.7 Colisiones de objetos
    - 5.7.1 Mover objetos
    - 5.7.2 Arreglar notación con superposiciones
      - La propiedad `padding` (relleno)
      - La propiedad `right-padding` (relleno por la derecha)
      - La propiedad `staff-padding` (relleno de pentagrama)
      - La propiedad `self-alignment-X` (auto-alineación en X)
      - La propiedad `staff-position` (posición en el pentagrama)
      - La propiedad `extra-offset` (desplazamiento adicional)
      - La propiedad `positions` (posiciones)
      - La propiedad `force-hshift` (forzar desplazamiento horizontal)
    - 5.7.3 Ejemplos reales de música
  - 5.8 Trucajes adicionales
    - 5.8.1 Otras aplicaciones de los trucos
      - Unir notas entre voces distintas
      - Simulación de un calderón en el MIDI
    - 5.8.2 Uso de variables para los ajustes de disposición
    - 5.8.3 Hojas de estilo
    - 5.8.4 Otras fuentes de información
    - 5.8.5 Trucos avanzados con Scheme
- Appendix A Plantillas
  - A.1 Plantillas incorporadas
    - A.1.1 Plantilla coral SATB
    - A.1.2 Plantilla coral SSAATTBB
  - A.2 Plantillas de pentagrama único
    - A.2.1 Sólo notas
    - A.2.2 Notas y letra
    - A.2.3 Notas y acordes
    - A.2.4 Notas, letra y acordes
  - A.3 Plantillas de piano
    - A.3.1 Piano solo
    - A.3.2 Piano y melodía con letra
    - A.3.3 Piano con letra centrada
  - A.4 Plantillas de cuarteto de cuerda
    - A.4.1 Cuarteto de cuerda simple
    - A.4.2 Particellas de cuarteto de cuerda
  - A.5 Plantillas de conjuntos vocales
    - A.5.1 Partitura vocal SATB
    - A.5.2 Partitura vocal SATB y reducción para piano automática
    - A.5.3 SATB con contextos alineados
    - A.5.4 SATB sobre cuatro pentagramas
    - A.5.5 Estrofas a solo y estribillo a dos voces
    - A.5.6 Melodías de himnos
    - A.5.7 Salmos
  - A.6 Plantillas orquestales
    - A.6.1 Orquesta, coro y piano
  - A.7 Plantillas para notación antigua
    - A.7.1 Transcripción de música mensural
    - A.7.2 Plantilla para transcripción de canto gregoriano
  - A.8 Otras plantillas
    - A.8.1 Combo de jazz
- Appendix B GNU Free Documentation License
- Appendix C Índice