GNU LilyPond – Manuel d'initiation: 4.4.3 Objets hors de la portée

### 4.4.3 Objets hors de la portée

Les objets extérieurs à la portée sont placés automatiquement de façon à éviter les collisions. Il est toutefois possible, grâce à différentes méthodes, de rectifier un positionnement automatique qui se révèlerait ne pas être optimal.

#### La propriété `outside-staff-priority`

Les objets avec la plus petite valeur de la propriété `outside-staff-priority` sont placés au plus près de la portée, tandis que les autres sont écartés autant qu’il faut pour éviter les collisions. La `outside-staff-priority` est définie dans la `grob-interface` ; elle est donc une propriété commune à tous les objets de rendu. Par défaut, elle est réglée sur `#f` pour tous les objets de la portée, et porte une valeur numérique appropriée à chacun des objets extérieurs à la portée, à mesure qu’ils sont créés. Le tableau suivant montre la valeur numérique par défaut pour quelques-uns des objets extérieurs à la portée les plus courant.

Vous noterez au passage certaines particularités quant au nom des objets. En effet, des objets à extension sont automatiquement créés dans le but de pouvoir contrôler le positionnement vertical des extrémités d’un grob qui commencerait et se terminerait à des instants musicaux différents. C’est la raison pour laquelle modifier le `outside-staff-priority` du grob sous-jacent n’aura aucun effet. C’est par exemple le cas lorsque vous modifiez l’alignement d’un objet `Hairpin` à l’aide de `outside-staff-priority` ; puisque le soufflet est associé à un objet `DynamicLineSpanner`, c’est sur celui-ci que doit porter l’effet de `outside-staff-priority`. L’instruction dérogatoire se place au début du bandeau qui constitue une ligne de base susceptible de contenir plusieurs soufflets ou indications de nuance.

Objet de rendu | Priorité | Contrôle la position de
--- | --- | ---
`RehearsalMark` | `1500` | Repère
`MetronomeMark` | `1000` | Indication métronomique
`SostenutoPedalLineSpanner` | `1000` | Indication de pédale
`SustainPedalLineSpanner` | `1000` |
`UnaCordaPedalLineSpanner` | `1000` |
`MeasureCounter` | `750` | Numéro de mesure
`VoltaBracketSpanner` | `600` | Bandeau de répétition
`InstrumentSwitch` | `500` | Texte de changement d’instrument
`TextScript` | `450` | Texte des markups (ou étiquettes)
`MultiMeasureRestText` | `450` | Texte sur les silences multimesures
`CombineTextScript` | `450` | Texte de parties combinées
`OttavaBracket` | `400` | Indication d’octaviation
`TextSpanner` | `350` | Bandeau ou extension de texte
`DynamicLineSpanner` | `250` | Toutes les marques de nuances
`BarNumber` | `100` | Numéro de mesure
`TrillSpanner` | `50` | Bandeau de trille
`AccidentalSuggestion` | `0` | Altération suggérée

Voici un exemple qui montre le placement par défaut de certains d’entre eux.

>     % 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' |

Cet exemple montre comment créer des extensions de texte (Text Spanners en anglais) – texte avec des longues lignes au-dessus d’un passage musical. L’extension s’étend depuis la commande `\startTextSpan` jusqu’à la commande `\stopTextSpan` et le format de texte est défini par la commande `\override TextSpanner`. Pour de plus amples détails, voir Indication textuelle avec extension.

Il montre aussi comment créer des marques d’octaviation.

Si les valeurs de `outside-staff-priority` par défaut ne donnent pas les résultats escomptés, il suffit de modifier la priorité de l’un de ces objets. Supposons que vous vouliez placer l’indication d’octaviation sous le bandeau de texte, dans l’exemple précédent. Tout ce que nous devons faire, c’est regarder la priorité de `OttavaBracket` dans la Référence des propriétés internes ou dans le tableau plus haut, et la ramener à une valeur plus basse que celle de `TextSpanner`, en gardant à l’esprit que `OttavaBracket` est créé dans le contexte `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' |

N’oublions pas que certains objets, tels les numéros de mesure, indications métronomiques et marques-repères, sont par défaut attachés au contexte `Score`.

Les liaisons sont intrinsèquement des objets membres de la portée (within-staff objects) bien qu’elles la surplombent lorsque les notes auxquelles elles se rattachent sont relativement hautes. Ceci peut avoir pour conséquence de remonter d’autant les objets externes (outside-staff objects) tels les articulations. La propriété `avoid-slur` de l’articulation en question peut se voir déterminée à `'inside` dans le but de « ramener » cette articulation à l’intérieur de la liaison. Cette propriété `avoid-slur` ne sera toutefois effective que dans la mesure où la `outside-staff-priority` est désactivée (valeur `#f`). Dans le même esprit, il est possible d’affecter une valeur numérique particulière à la propriété `outside-staff-priority` d’une liaison dans le but de regrouper la liaison avec les objets externes. L’exemple suivant illustre ces deux différentes méthodes.

>     \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 |
>     }

Le fait de changer la `outside-staff-priority` peut aussi servir à contrôler le positionnement vertical des objets individuels, quoique le résultat ne soit pas toujours formidable. Imaginons que nous voulions placer « Text3 » au-dessus de « Text4 » dans l’exemple de la section Comportement automatique, plus haut. Il nous suffit pour cela de regarder dans la Référence des propriétés internes ou dans le tableau plus haut la priorité de `TextScript`, et d’augmenter la priorité de « Text3 » jusqu’à une valeur très haute :

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

S’il est vrai que cela place « Text3 » au-dessus de « Text4 », ça le place aussi plus haut que « Text2 » tandis que « Text4 » dégringole. Ce n’est peut-être pas si bien que ça. En fait, ce que nous aimerions faire, c’est placer toutes les annotations à égale distance de la portée. Pour cela, nous avons besoin d’espacer horizontalement les notes pour laisser plus de place au texte. C’est possible grâce à la commande `textLengthOn`.

#### La commande `\textLengthOn`

Par défaut, l’espacement horizontal d’un texte produit sous forme de markup (ou d’étiquette) n’est pas pris en compte, dans la mesure où ce qui est concerné n’entre pas dans la musique. La commande `\textLengthOn` inverse ce comportement, faisant en sorte que les notes soient espacées autant qu’il le faut pour s’adapter au texte :

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

La commande qui permet de revenir au comportement par défaut est `\textLengthOff`. Alternativement, lorsque l’instruction `\textLengthOn` se limite à un seul instant musical, vous pouvez la préfixer d’un `\once`.
LilyPond dispose de commandes équivalentes et dévolues au traitement des repères et indications de tempo : `\markLengthOn` et `\markLengthOff`.

Les textes des markup éviteront également les notes qui s’échappent au-dessus de la portée. Si ce n’est pas notre souhait, il est possible de supprimer ce déplacement automatique vers le haut en attribuant à la priorité la valeur `#f`. Voici un exemple qui montre comment les textes des markup interagissent avec ces types de note.

>     \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 |
>     }

#### Positionnement des nuances

Les indications de nuance se placent normalement sous la portée, mais on peut les placer au-dessus avec la commande `\dynamicUp`. Elles se positionnent verticalement par rapport à la note à laquelle elles sont liées et se décalent vers le bas (ou le haut) en fonction des objets de la portée comme les liaisons de phrasé ou les numéros de mesure. Cela peut donner d’assez bons résultats, comme le montre cet exemple :

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

De toute façon, si les notes et les nuances qui leur sont liées sont trop proches, le positionnement automatique évitera les collisions en déplaçant davantage les nuances suivantes, mais le résultat peut ne pas être très satisfaisant, comme le montre cet exemple artificiel :

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

Si une telle situation devait survenir dans de la musique « réelle », il serait préférable d’espacer un peu plus les notes, de façon que les indications de nuance puissent toutes se situer à la même distance de la portée. S’il est possible de faire cela pour les textes de markup grâce à la commande `\textLengthOn`, il n’existe pas d’équivalent pour les indications de nuance. Il nous faut donc chercher à faire cela avec la commande `\override`.

#### Dimensionnement des objets graphiques

Tout d’abord, nous devons apprendre ce qui détermine la dimension des grobs. Tous les grobs portent en eux un point de référence qui est utilisé pour les positionner par rapport à leur objet parent. Ce point du grob est placé à une distance horizontale, `X-offset`, et à une distance verticale, `Y-offset`, de son parent. L’étendue horizontale de l’objet est fixée par une paire de nombres, `X-extent`, qui donnent la position du coin gauche et du coin droit par rapport au point de référence. De même, l’amplitude verticale est fixée par une paire de nombres, `Y-extent`. Ce sont des propriétés communes à tous les grobs et que gère la `grob-interface`.

Par défaut, la largeur des objets extérieurs à la portée est donnée comme étant nulle, si bien qu’ils peuvent se chevaucher horizontalement. Pour remédier à cela, on a ajouté l’infini à l’extension gauche et moins l’infini à l’extension droite, en attribuant à `extra-spacing-width` la valeur `'(+inf.0 . -inf.0)`. Pour être sûr que les objets ne se chevaucheront pas horizontalement, nous devons donc corriger cette valeur de `extra-spacing-width` pour leur attribuer un peu d’espace supplémentaire. L’unité de base est ici la largeur séparant deux lignes de portée ; décaler le bord gauche d’une demie unité vers la gauche et le bord droit d’une demie unité vers la droite devrait suffire :

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

Voyons si ça marche sur notre exemple précédent :

>     \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 }

C’est mieux mais nous voulons peut-être aligner les indications de nuance sur une même ligne plutôt que de les voir monter et descendre avec les notes. La propriété qui gère cela est `staff-padding` – voir Collisions d’objets.

#### LilyPond — Manuel d’initiation v2.22.2 (branche stable).