5.4 Décalages et alignements (GNU LilyPond – Manuel d’initiation)

### 5.4 Décalages et alignements

LilyPond a besoin de connaître où chacun des objets graphiques devrait se placer. Cette information quant au positionnement est enregistrée sous forme de coordonnées relatives : le positionnement d’un objet se définit relativement au positionnement de son parent. Si l’on travaillait en coordonnées absolues – autrement dit à partir des coins de la page –, préserver la relation spatiale entre les différents objets relèverait du cauchemar.

Chaque objet graphique sait quel est son parent dans l’axe respectif. Par exemple, un objet `Flag` (crochet) sait que son parent sur l’axe des abscisses est un objet `Stem` (hampe) particulier.

Les coordonnées relatives qui décrivent le positionnement d’un objet sont enregistrées dans les propriétés d’objet appelées `X-offset` et `Y-offset`. Elles sont exprimées en espace de portée. `X-offset` est le décalage horizontal entre le point de référence d’un objet et le point de référence d’un objet parent sur l’axe des X (il en va de même pour `Y-offset`).

Mais qu’est-ce qu’un point de référence ? Il s’agit d’un point spécifique qui définit le positionnement de l’objet. Faisons un peu de géométrie : si l’on doit placer des formes sur un plan, on pourrait bien dire « le coin inférieur gauche de ce carré a pour coordonnées (0, 2) » ou « le centre de ce cercle est en (−1, 3) ». « Coin inférieur gauche » et « centre » seront respectivement les points de référence du carré et du cercle.

L’illustration ci-dessous montre où se place le point de référence de quelques objets particuliers, indiqué par un point rouge – par exemple, la ligne médiane pour les barres de mesure, l’intersection entre la ligne de base et le bord gauche d’une boîte de texte, ou bien encore le centre vertical sur la gauche d’une tête de note.

    {
      \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 "|."
    }

Une dérogation aux valeurs de `X-offset` ou `Y-offset` peut faire se déplacer des objets relativement à leurs parents :

    {
      \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 "|."
    }

Vous n’aurez pas manqué de constater que l’objet `Flag` s’est déplacé comme son parent `Stem`.

Note : Modifier `X-offset` ou `Y-offset` ne produit pas toujours les effets escomptés, voir Alignement des objets.

Venons-en maintenant à une autre paire de propriétés : `X-extent` et `Y-extent`. Toutes deux sont constituées d’une paire de nombres, que LilyPond appelle en interne un intervalle, et enregistrent la taille relative d’un objet par rapport à son point de référence. Par exemple, un `X-extent` égal à (-1 . 4) signifie que le bord gauche du grob est à 1 espace de portée sur la gauche de son point de référence, et son bord droit à 4 espaces de portée sur la droite du point de référence, pour une largeur totale de 4 - (-1) = 4 + 1 = 5 espaces de portée. Les deux nombres d’une étendue peuvent être positifs ; par exemple, (2 . 3) est une étendue tout à fait valide : cela signifie que l’intégralité du grob est à droite de son point de référence, et que la largeur de ce grob est de 3 - 2 = 1 espace de portée. De la même manière, les deux nombres pourraient être négatifs ; bien que peu probable, cette situation ne perturberait pas LilyPond. Dans la plupart des cas, du moins pour `X-extent`, le premier nombre est 0, ce qui signifie que le point de référence est sur le bord gauche de l’objet graphique.

L’exemple précédent illustre ceci tout à fait : le bord gauche aussi bien de l’accent que du point d’orgue est à gauche du point de référence ; il en va de même pour la tête de la brève (nous avons préféré le style de tête `'altdefault` pour plus de visibilité).

Supposons maintenant que nous voulions positionner un objet `RehearsalMark` de telle sorte que son bord droit s’aligne sur une barre de mesure (par défaut, LilyPond centre horizontalement la marque de repère). Avec un `X-offset` égal à zéro, c’est à dire que son point de référence s’aligne sur le point de référence de son parent, à savoir la barre de mesure dans le cas présent, le grob `RehearsalMark` se place comme ceci :

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

Il nous faut donc le décaler. N’oublions pas la signification du second nombre de `X-extent` : il s’agit de la position du bord droit de l’objet relativement à son point de référence. Si nous soustrayons cette valeur à zéro, nous devrions obtenir le décalage horizontal voulu :

>     {
>       % 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
>     }

Et si nous voulions centrer un objet sur le point de référence de son parent ? Rien de plus simple : calculons le déplacement entre le point de référence de cet objet et le centre de son étendue. Quelques exemples :

- `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

Une fonction avec un nom à rallonges est déjà disponible et capable de réaliser ces calculs pour nous :

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

à laquelle il suffit d’indiquer l’alignement désiré :

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

Ce code demande à la procédure de trouver la distance entre le point de référence de l’objet et son bord droit, puis de l’utiliser comme décalage horizontal, ce qui aura pour résultat que l’objet sera aligné par sa droite.

Si donc on change l’étendue d’un objet, on affecte la manière dont il sera aligné – parce que LilyPond pensera que les dimensions de l’objet sont différentes :

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

Bien sûr, si l’étendue d’un objet est vide (sa paire ne forme pas un intervalle), les procédures telles que `x-aligned-on-self` n’auront aucune information quant aux dimensions de cet objet et ne pourront donc pas calculer de décalage (elles retourneront simplement la valeur 0). Autrement dit, un grob dont l’étendue est vide ne peut « s’aligner » que sur son point de référence puisqu’aucune autre information n’est disponible pour l’alignement :

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

Notez bien qu’une étendue vide et une étendue égale à zéro résultent en un même positionnement :

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

Néanmoins, une étendue vide (ou nulle, ou autre) ne nous empêche pas de placer l’objet à l’endroit où nous le souhaitons – on doit juste se passer des procédures d’alignement. On peut toujours spécifier le décalage désiré, et tout fonctionne comme à l’accoutumée :

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

Il y a encore quelque chose à garder à l’esprit : le parent d’un grob a, lui aussi, ses propres dimensions, et nous devons en tenir compte. Par exemple, si nous disons

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

l’objet `LyricText` sera centré, mais sur le point de référence de son parent – c’est à dire que le centre de la syllabe s’alignera sur le point de référence de la tête de note. Si nous voulons que le centre de l’objet `LyricText` s’aligne avec le centre de son objet parent `NoteHead`, il nous faut recourir à une autre procédure : `aligned-on-x-parent`. Son comportement est similaire à `x-aligned-on-self` mais, en plus de calculer un décalage sur la base de l’étendue d’un objet, elle utilise aussi l’étendue de l’objet parent pour déterminer les positions relatives au centre de l’étendue :

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

#### GNU LilyPond – Manuel d’initiation v2.26.0 (stable-branch).

- 1 Installation
  - 1.1 Installation en mode graphique
  - 1.2 Installation en ligne de commande
- 2 Tutoriel
  - 2.1 Compilation d’un fichier
  - 2.2 Composition d’un fichier source
    - 2.2.1 Notation simple
      - Hauteurs
      - Durées et rythme
      - Silences
      - Métrique
      - Indication de tempo
      - Clefs
      - Tout ensemble
    - 2.2.2 Travail sur les fichiers d’entrée
  - 2.3 Gestion des erreurs
  - 2.4 Bien lire le manuel
    - 2.4.1 Matériel incomplet
    - 2.4.2 Exemples cliquables
    - 2.4.3 Vue d’ensemble des manuels
- 3 Bases de notation musicale
  - 3.1 Notation sur une seule portée
    - 3.1.1 Barre et contrôle de mesure
      - Barre de mesure
      - Contrôle de mesure
    - 3.1.2 Hauteurs et armure
      - Altérations
      - Armures
      - Attention aux armures et aux hauteurs
    - 3.1.3 Liaisons
      - Liaisons de prolongation
      - Liaisons d’articulation
      - Liaisons de phrasé
      - Attention aux types de liaison
    - 3.1.4 Articulations et nuances
      - Articulation
      - Doigté
      - Nuance
    - 3.1.5 Ajout de texte
    - 3.1.6 Barres de ligature automatiques et manuelles
    - 3.1.7 Commandes rythmiques avancées
      - Mesure incomplète
      - N-olet
      - Note d’ornement
  - 3.2 Notes simultanées
    - 3.2.1 Les expressions musicales en clair
      - Analogie avec les expressions mathématiques
      - Expressions musicales simultanées – plusieurs portées
      - Expressions musicales simultanées – une seule portée
    - 3.2.2 Plusieurs portées
    - 3.2.3 Regroupements de portées
    - 3.2.4 Combinaison de notes en accords
    - 3.2.5 Polyphonie sur une portée
  - 3.3 Chansons
    - 3.3.1 Écriture de chants simples
    - 3.3.2 Alignement des paroles sur une mélodie
    - 3.3.3 Paroles pour plusieurs portées
  - 3.4 Dernières précisions
    - 3.4.1 Organisation du code source avec des variables
    - 3.4.2 Ajout de titres
    - 3.4.3 Noms de note absolus
    - 3.4.4 Après le tutoriel
- 4 Concepts fondamentaux
  - 4.1 Organisation des fichiers LilyPond
    - 4.1.1 Introduction à la structure de fichier LilyPond
    - 4.1.2 La partition est une (unique) expression musicale composée
    - 4.1.3 Expressions musicales imbriquées
    - 4.1.4 Structuration de la saisie des notes
    - 4.1.5 Non-imbrication des crochets et liaisons
  - 4.2 Les voix contiennent la musique
    - 4.2.1 J’entends des voix
    - 4.2.2 Instanciation explicite des voix
    - 4.2.3 Voix et paroles
  - 4.3 Contextes et graveurs
    - 4.3.1 Tout savoir sur les contextes
    - 4.3.2 Création d’un contexte
    - 4.3.3 Tout savoir sur les graveurs
    - 4.3.4 Modification des propriétés d’un contexte
    - 4.3.5 Ajout et suppression de graveurs
  - 4.4 Extension des modèles
    - 4.4.1 Soprano et violoncelle
    - 4.4.2 Partition pour chœur à quatre voix mixtes
    - 4.4.3 Écriture d’une partition à partir de zéro
    - 4.4.4 Économie de saisie grâce aux identificateurs et fonctions
    - 4.4.5 Conducteurs et parties
- 5 Retouche de partition
  - 5.1 Retouches élémentaires
    - 5.1.1 Objets et interfaces
    - 5.1.2 Conventions de nommage des objets et propriétés
    - 5.1.3 Méthodes de retouche
      - La commande `\override`
      - La commande `\revert`
      - Le préfixe `\once`
      - Les commandes `\tweak` et `\offset`
      - Le préfixe `\single`
  - 5.2 Le manuel de référence des propriétés internes
    - 5.2.1 Propriétés des objets de rendu
    - 5.2.2 Propriétés listées par interface
    - 5.2.3 Types de propriétés
  - 5.3 Apparence des objets
    - 5.3.1 Visibilité et couleur des objets
      - La propriété `stencil`
      - La propriété `break-visibility`
      - La propriété `transparent`
      - La propriété `color`
    - 5.3.2 Taille des objets
    - 5.3.3 Longueur et épaisseur des objets
  - 5.4 Décalages et alignements
  - 5.5 Positionnement des objets
    - 5.5.1 Comportement automatique
    - 5.5.2 Objets inclus dans la portée
      - La propriété `direction`
      - Doigtés
    - 5.5.3 Objets hors de la portée
      - La propriété `outside-staff-priority`
      - La commande `\textLengthOn`
      - Positionnement des nuances
      - Dimensionnement des objets graphiques
  - 5.6 Espacement vertical
  - 5.7 Collisions d’objets
    - 5.7.1 Déplacement d’objets
    - 5.7.2 Correction des collisions d’objets
      - La propriété `padding`
      - La propriété `right-padding`
      - La propriété `staff-padding`
      - La propriété `self-alignment-X`
      - La propriété `staff-position`
      - La propriété `extra-offset`
      - La propriété `positions`
      - La propriété `force-hshift`
    - 5.7.3 Exemple concret
  - 5.8 Autres retouches
    - 5.8.1 Autres utilisations des retouches
      - Liaison entre plusieurs voix
      - Rendu MIDI d’un point d’orgue
    - 5.8.2 Utilisation de variables dans les retouches
    - 5.8.3 Feuilles de style
    - 5.8.4 Autres sources de documentation
    - 5.8.5 Retouches avancées avec Scheme
- Appendix A Modèles
  - A.1 Gabarits préprogrammés
    - A.1.1 Gabarit pour chœur à quatre voix mixtes
    - A.1.2 Gabarit pour double chœur à quatre voix mixtes
  - A.2 Modèles pour portée unique
    - A.2.1 Notes seules
    - A.2.2 Notes et paroles
    - A.2.3 Notes et accords
    - A.2.4 Notes, paroles et accords
  - A.3 Modèles pour piano
    - A.3.1 Piano seul
    - A.3.2 Chant et accompagnement
    - A.3.3 Piano et paroles entre les portées
  - A.4 Modèles pour quatuor à cordes
    - A.4.1 Quatuor à cordes simple
    - A.4.2 Parties pour quatuor à cordes
  - A.5 Modèles pour ensemble vocal
    - A.5.1 Partition pour chœur SATB
    - A.5.2 Partition pour chœur SATB avec réduction pour piano
    - A.5.3 Partition pour chœur SATB avec alignement des contextes
    - A.5.4 Chœur à quatre voix mixtes sur quatre portées
    - A.5.5 Couplet pour solo et refrain à deux voix
    - A.5.6 Hymnes et cantiques
    - A.5.7 Psalmodie
  - A.6 Orchestre
    - A.6.1 Orchestre, chœur et piano
  - A.7 Exemples de notation ancienne
    - A.7.1 Transcription de musique mensurale
    - A.7.2 Transcription du grégorien
  - A.8 Autres modèles
    - A.8.1 Symboles de jazz
- Appendix B GNU Free Documentation License
- Appendix C Index des commandes et concepts