GNU LilyPond – Manuel de notation: 4.4.1 Espacement vertical au sein d'un système

### 4.4.1 Espacement vertical au sein d’un système

LilyPond dispose de trois différents mécanismes permettant de contrôler l’espacement au sein d’un système selon trois catégories :

- portées isolées,
- portées regroupées (portées d’un même groupe, telles celles d’un `ChoirStaff`, etc.), et
- lignes de non-portée (`Lyrics`, `ChordNames`, etc.).

La hauteur de chaque système se détermine en deux phases. Les portées sont tout d’abord espacées selon la surface disponible. Puis les lignes autres que des portées, comme les paroles ou les accords, sont réparties entre les portées.

Les paragraphes qui suivent traitent exclusivement de la manière de gérer l’espacement entre les lignes d’un système – portée musicale ou non. Pour ce qui a trait aux espacements entre les systèmes, mouvements, annotations et marge, ils sont contrôlés par des variables attachées au bloc `\paper` et font l’objet du chapitre Variables d’espacement vertical fluctuant.

#### Propriétés d’espacement au sein d’un système

L’espacement entre les portées est géré par deux jeux de propriétés d’objet graphique (grob). Le premier, associé à l’objet graphique `VerticalAxisGroup`, est créé pour toute ligne de portée ou de non-portée. Le second, associé à l’objet graphique `StaffGrouper`, doit être explicitement créé pour un regroupement de portées particulier. Les propriétés qui leur sont attachées sont abordées en fin de section.

Le nom de ces propriétés, sauf `staff-affinity`, suit le schéma `item1-item2-spacing` – `item1` et `item2` étant les éléments à espacer. Notez bien que `item2` n’est pas forcément placé au-dessous : c’est le cas pour la propriété `nonstaff-relatedstaff-spacing` qui spécifie l’espacement d’une ligne de non-portée alors que sa `staff-affinity` a été déterminée à `UP`.

Toutes ces distances sont mesurées entre les points de référence respectifs des éléments considérés. Le point de référence d’une portée est le centre vertical du `StaffSymbol` – la ligne médiane si `line-count` est impair, l’interligne médian si `line-count` est pair. Quant aux lignes rattachées à des portées – lignes de non-portée – le tableau suivant présente le point de référence pour chacune d’elles :

Ligne de non-portée | Point de référence
--- | ---
`ChordNames` | ligne de base
`NoteNames` | ligne de base
`Lyrics` | ligne de base
`Dynamics` | mi-hauteur du « m »
`FiguredBass` | point le plus haut
`FretBoards` | ligne supérieure

En voici une représentation graphique :

Hormis `staff-affinity` – propriété attachée au grob `VerticalAxisGroup` –, chacune de ces propriétés est enregistrée sous la forme d’une liste associative dont la structure est identique à celle des variables du bloc `\paper` que nous avons examinées au chapitre Variables d’espacement vertical fluctuant. Les particularités en matière de modification d’une liste associative font l’objet d’un chapitre particulier. Les propriétés des objets graphiques se règlent avec un `\override` mentionné dans un bloc `\score` ou `\layout`, pas dans le bloc `\paper`.

L’exemple suivant illustre deux façons de modifier une liste associative. La première déclaration n’agit que sur une seule clé, alors que la seconde redéfinit la propriété dans son intégralité.

>     \new Staff \with {
>       \override VerticalAxisGroup
>                   .default-staff-staff-spacing.basic-distance = #10
>     } { … }

>     \new Staff \with {
>       \override VerticalAxisGroup.default-staff-staff-spacing =
>         #'(('basic-distance  . 10)
>            (minimum-distance . 9)
>            (padding . 1)
>            (stretchability . 10))
>     } { … }

La modification d’un espacement au niveau global se mentionne au sein du bloc `\layout` :

>     \layout {
>       \context {
>         \Staff
>         \override VerticalAxisGroup
>           .default-staff-staff-spacing.basic-distance = #10
>       }
>     }

Les réglages concernant les propriétés d’espacement vertical des objets graphiques sont répertoriées aux chapitres VerticalAxisGroup et StaffGrouper. Les propriétés relatives aux lignes de non-portée sont répertoriées selon la définition de leur contexte dans la Référence des propriétés internes.

#### Propriétés de l’objet `VerticalAxisGroup`

Les propriétés de l’objet `VerticalAxisGroup` s’ajustent à l’aide d’un `\override` au niveau d’un contexte `Staff` (ou son équivalent).

`staff-staff-spacing`

  Il s’agit de la distance entre la portée en cours et la portée qui suit au sein du même regroupement, qu’il y ait ou des lignes de non-portée (`Lyrics` ou autre entre les deux. Cette propriété ne s’applique pas à la dernière portée d’un système.

  En tout état de cause, la fonction Scheme `staff-staff-spacing` d’un `VerticalAxisGroup` affectera les propriétés du `StaffGrouper` si la portée est incluse dans un regroupement ; elle s’appliquera au `default-staff-staff-spacing` en l’absence de regroupement. Les portées peuvent donc s’aligner différemment selon qu’elles sont ou non regroupées. Pour obtenir le même espacement sans tenir compte des éventuels regroupements, cette fonction peut faire place à une complète redéfinition des espacements fluctuants à l’aide de règles dérogatoires comme vu précédemment. Au cas où seulement certaines +valeurs font l’objet d’une dérogation, les valeurs non mentionnées +seront ajustées sur celles de `default-staff-staff-spacing` (si +tant est qu’elles y soient définies).

`default-staff-staff-spacing`

  Il s’agit de la distance qui s’appliquera par défaut aux portées isolées, à moins que `staff-staff-spacing` n’ait été redéfini explicitement par un `\override`.

`staff-affinity`

  Il s’agit de la direction – `UP`, `DOWN` ou `CENTER` – que prendra une ligne de non-portée pour aller s’accoler aux portées adjacentes. Si vous lui attribuez `CENTER`, cette ligne de non-portée ira se placer à équidistance entre les portées qui l’encadrent, tout en tenant compte des éventuels risques de collision et autres contraintes d’espacement. Des lignes de non-portée adjacentes devraient avoir une `staff-affinity` allant de haut en bas – autrement dit, pas de `UP` après un `DOWN`. Une ligne de non-portée en dessous d’un système devrait avoir sa `staff-affinity` définie à `UP`. De la même manière, lorsque cette ligne surplombe un système, sa `staff-affinity` devrait être définie à `DOWN`. Prenez garde à la valeur que vous affectez à `staff-affinity` : si vous affectez la valeur `#f` à une ligne de non-portée, cette ligne sera considérée comme étant une portée ; à l’inverse, utiliser la propriété `staff-affinity` pour une portée lui fera perdre cette qualité.

`nonstaff-relatedstaff-spacing`

  Il s’agit de la distance entre la ligne de non-portée en cours et la portée la plus proche selon la `staff-affinity`, à la double condition qu’il n’y ait pas déjà une autre ligne de non-portée et que la valeur de `staff-affinity` soit `UP` ou `DOWN`. Lorsque la valeur de `staff-affinity` est égale à `CENTER`, la valeur de `nonstaff-relatedstaff-spacing` servira à centrer la ligne de non-portée entre les deux portées adjacentes même si une autre non-portée est présente (quelque soit le côté). Le positionnement d’une ligne de non-portée dépend donc à la fois des portées qui l’entourent tout comme des autres lignes de non-portée adjacentes. L’affectation d’une faible valeur à la propriété `stretchability` de l’un de ces types d’espacement l’avantagera ; lui affecter une valeur élevée aura pour conséquence de diminuer l’influence de l’espacement considéré.

`nonstaff-nonstaff-spacing`

  Il s’agit de la distance entre deux lignes de non-portée selon l’orientation définie par `staff-affinity` et dès lors qu’elles ont la même orientation. Bien entendu, ceci ne peut concerner que les valeurs `UP` et `DOWN` de `staff-affinity`.

`nonstaff-unrelatedstaff-spacing`

  Il s’agit de la distance entre une ligne de non-portée et la portée à l’opposé de l’orientation adoptée, à la double condition qu’il n’y ait pas déjà une autre ligne de non-portée et que la valeur de `staff-affinity` soit `UP` ou `DOWN`. Cette propriété trouve toute sa légitimité pour décaler une ligne de `Lyrics` de la portée à laquelle elle ne correspond pas.

#### Propriétés de l’objet `StaffGrouper`

Les propriétés de l’objet `StaffGrouper` s’ajustent à l’aide d’un `\override` au niveau d’un contexte `StaffGroup` (ou son équivalent).

`staff-staff-spacing`

  Il s’agit de la distance entre deux portées consécutives d’un même système. La propriété `staff-staff-spacing` de l’objet `VerticalAxisGroup` d’une portée en particulier peut se redéfinir à l’aide de règles dérogatoires.

`staffgroup-staff-spacing`

  Il s’agit de la distance entre la dernière portée d’un regroupement et la portée suivante, au sein d’un même système, y compris lorsqu’une ou plusieurs lignes de non-portée (tel `Lyrics`) s’insèrent entre les deux. Cette propriété ne concerne pas la dernière portée d’un système. Dans le cas où la propriété `staff-staff-spacing` d’une portée du regroupement a été ajustée au niveau de son propre `VerticalAxisGroup`, cette dernière aura préséance.

#### Voir aussi

Manuel de notation : Modification de listes associatives, Variables d’espacement vertical fluctuant.

Fichiers d’initialisation : ‘`ly/engraver-init.ly`’, ‘`scm/define-grobs.scm`’.

Référence des propriétés internes : Contexts, VerticalAxisGroup, StaffGrouper.

#### Espacement de portées isolées

Les `Staff`, `DrumStaff`, `TabStaff` entre autres sont des contextes de « portée » pouvant contenir plusieurs voix, mais pas une portée.

L’espacement de ces portées isolées est géré par les propriétés suivantes :

- Propriétés du `VerticalAxisGroup` :
  - `default-staff-staff-spacing`
  - `staff-staff-spacing`

Ces propriétés d’objet graphique sont expliquées une à une au chapitre Propriétés d’espacement au sein d’un système.

Certaines propriétés supplémentaires s’appliqueront dès lors que ces portées sont regroupées – voir Espacement de portées regroupées.

L’exemple suivant illustre la manière de gérer l’espacement de portées isolées à l’aide de la propriété `default-staff-staff-spacing`. Les mêmes règles appliquées de manière dérogatoire au `staff-staff-spacing` produiront les mêmes effets, y compris au sein de regroupements.

>     \layout {
>       \context {
>         \Staff
>         \override VerticalAxisGroup.default-staff-staff-spacing =
>           #'((basic-distance . 8)
>              (minimum-distance . 7)
>              (padding . 1))
>       }
>     }

>     <<
>       % The very low note here needs more room than 'basic-distance
>       % can provide, so the distance between this staff and the next
>       % is determined by 'padding.
>       \new Staff { b,2 r | }

>       % Here, 'basic-distance provides enough room, and there is no
>       % need to compress the space (towards 'minimum-distance) to make
>       % room for anything else on the page, so the distance between
>       % this staff and the next is determined by 'basic-distance.
>       \new Staff { \clef bass g2 r | }

>       % By setting 'padding to a negative value, staves can be made to
>       % collide.  The lowest acceptable value for 'basic-distance is 0.
>       \new Staff \with {
>         \override VerticalAxisGroup.default-staff-staff-spacing =
>           #'((basic-distance . 3.5)
>              (padding . -10))
>       } { \clef bass g2 r | }
>       \new Staff { \clef bass g2 r | }
>     >>

#### Voir aussi

Fichiers d’initialisation : ‘`scm/define-grobs.scm`’.

Morceaux choisis : Espacements.

Référence des propriétés internes : VerticalAxisGroup.

#### Espacement de portées regroupées

Dans les partitions orchestrales ou de grande ampleur, il arrive souvent que des portées soient regroupées. L’espacement est alors plus important entre deux regroupements qu’entre les portées d’un même groupe.

Les regroupements de portées tels le `StaffGroup` ou le `ChoirStaff` sont des contextes qui peuvent contenir simultanément une ou plusieurs portées.

L’espacement entre les portées d’un même regroupement est géré par les propriétés suivantes :

- Propriétés du `VerticalAxisGroup` :
  - `staff-staff-spacing`
- Propriétés du `StaffGrouper` :
  - `staff-staff-spacing`
  - `staffgroup-staff-spacing`

Ces propriétés d’objet graphique sont expliquées une à une au chapitre Propriétés d’espacement au sein d’un système.

L’exemple suivant illustre la manière de gérer l’espacement de portées regroupées, à l’aide des propriétés de l’objet graphique `StaffGrouper` :

>     \layout {
>       \context {
>         \Score
>         \override StaffGrouper.staff-staff-spacing.padding = #0
>         \override StaffGrouper.staff-staff-spacing.basic-distance = #1
>       }
>     }

>     <<
>       \new PianoStaff \with {
>         \override StaffGrouper
>                     .staffgroup-staff-spacing
>                     .basic-distance = #20
>       } <<
>         \new Staff { c'1 }
>         \new Staff { c'1 }
>       >>

>       \new StaffGroup <<
>         \new Staff { c'1 }
>         \new Staff { c'1 }
>       >>
>     >>

#### Voir aussi

Fichiers d’initialisation : ‘`scm/define-grobs.scm`’.

Morceaux choisis : Espacements.

Référence des propriétés internes : VerticalAxisGroup, StaffGrouper.

#### Espacement des lignes rattachées à des portées

Les lignes de non-portée, comme les `Lyrics` ou les `ChordNames` sont des contextes dont les objets de rendu sont gravés à l’instar des portées – une ligne horizontale dans un système. En fait, les lignes de non-portée sont des contextes qui vont créer un objet de rendu `VerticalAxisGroup` auxquel est attaché le Axis_group_engraver.

L’espacement des lignes de non-portée est géré par les propriétés suivantes :

- Propriétés du `VerticalAxisGroup` :
  - `staff-affinity`
  - `nonstaff-relatedstaff-spacing`
  - `nonstaff-nonstaff-spacing`
  - `nonstaff-unrelatedstaff-spacing`

Ces propriétés d’objet graphique sont expliquées une à une au chapitre Propriétés d’espacement au sein d’un système.

L’exemple suivant utilise la propriété `nonstaff-nonstaff-spacing` pour gérer l’espacement entre des lignes consécutives de non-portée. Vous noterez que la valeur élevée attribuée à la clé `stretchability` permet aux paroles de s’étirer plus que de raison.

>     \layout {
>       \context {
>         \Lyrics
>         \override VerticalAxisGroup
>                     .nonstaff-nonstaff-spacing
>                     .stretchability = #1000
>       }
>     }

>     \new StaffGroup
>     <<
>       \new Staff \with {
>         \override VerticalAxisGroup.staff-staff-spacing =
>           #'((basic-distance . 30))
>       } { c'1 }
>       \new Lyrics \with {
>         \override VerticalAxisGroup.staff-affinity = #UP
>       } \lyricmode { up }
>       \new Lyrics \with {
>         \override VerticalAxisGroup.staff-affinity = #CENTER
>       } \lyricmode { center }
>       \new Lyrics \with {
>         \override VerticalAxisGroup.staff-affinity = #DOWN
>       } \lyricmode { down }
>       \new Staff { c'1 }
>     >>

#### Voir aussi

Fichiers d’initialisation : ‘`ly/engraver-init.ly`’, ‘`scm/define-grobs.scm`’.

Morceaux choisis : Espacements.

Référence des propriétés internes : Contexts, VerticalAxisGroup.

#### LilyPond — Manuel de notation v2.22.2 (branche stable).