GNU LilyPond – Manuel de notation: 5.4.7 Visibilité des objets

### 5.4.7 Visibilité des objets

La visibilité des objets de rendu se contrôle de quatre façons différentes : vous pouvez supprimer leur stencil, les rendre transparents, les coloriser en blanc ou bien encore forcer leur propriété `break-visibility`. Les trois premières options peuvent s’appliquer à tous les objets, la dernière étant réservée aux objets changeables. Le Manuel d’initiation contient une introduction à ces quatre techniques, à la rubrique Visibilité et couleur des objets.

LilyPond met en œuvre quelques techniques particulières adaptées à certains objets ; elles sont couvertes par une rubrique spécifique.

#### Suppression des stencils

Tout objet de rendu se voit attribuer une propriété `stencil`. Elle est par défaut définie par la fonction chargée de dessiner cet objet. Lorsque cette propriété est désactivée de force – en lui attribuant la valeur `#f` – aucune fonction ne sera appelée ; l’objet ne sera donc pas dessiné. Le retour au comportement par défaut s’opère à l’aide d’un `\revert`.

>     a1 a
>     \override Score.BarLine.stencil = ##f
>     a a
>     \revert Score.BarLine.stencil
>     a a a

Cette opération relativement courante fait l’objet du racourci `\omit` :

>     a1 a
>     \omit Score.BarLine
>     a a
>     \undo \omit Score.BarLine
>     a a a

#### Transparence des objets

Tout objet de rendu dispose d’une propriété de transparence, qui est par défaut définie à `#f`. Le fait de l’activer rendra l’objet transparent tout en préservant la place qu’il occupe.

>     a'4 a'
>     \once \override NoteHead.transparent = ##t
>     a' a'

Cette opération relativement courante fait l’objet du racourci `\hide` :

>     a'4 a'
>     \once \hide NoteHead
>     a' a'

#### Blanchiment des objets

Tout objet de rendu dispose d’une propriété couleur, par défaut définie à `black` (noir). Le fait de la forcer à `white` (blanc) rendra l’objet indistinct du fond blanc. Néanmoins, lorsque cet objet en recouvre d’autres, la couleur de leurs points de jonction dépendra de l’ordre dans lequel ils sont dessinés, ce qui peut laisser apparaître un fantôme de l’objet blanchi comme ci-dessous :

>     \override Staff.Clef.color = #white
>     a'1

Cet inconvénient peut être évité en modifiant l’ordre dans lequel les objets sont dessinés. Chaque objet de rendu dispose d’une propriété `layer` (calque ou niveau) à laquelle est affecté un nombre entier. Les objets ayant la plus faible valeur sont dessinés en premier, puis les autres, de telle sorte qu’un objet ayant une valeur plus élevée les recouvrira. La plupart des objet ont un `layer` valorisé à `1` – quelques uns, dont `StaffSymbol` et `BarLine`, ont une valeur à `0`. L’ordre d’impression d’objets ayant une même valeur de `layer` est indéterminé.

La clef de l’exemple précédent a par défaut un `layer` à `1` ; elle est donc dessinée après les lignes de la portée – `layer` valorisé par défaut à `0` – et donc les recouvre. Pour changer cet état de fait, l’objet `Clef` doit avoir un `layer` de valeur inférieure, disons `-1`, pour pouvoir être dessiné avant.

>     \override Staff.Clef.color = #white
>     \override Staff.Clef.layer = #-1
>     a'1

#### Morceaux choisis

#### Utilisation de la propriété `whiteout`

Tout objet graphique peut s’imprimer sur un fond blanc afin de masquer une partie des objets qu’il recouvre. Ceci trouve toute son utilité pour améliorer certaines collisions, notamment dans des situations où un repositionnement d’objets est irréaliste. Il faut alors explicitement définir la propriété `layer` afin de contrôler quels objets seront masqués par le fond blanc. Dans l’exemple ci-dessous, la liaison est en collision avec la métrique ; la situation est améliorée dès lors que la portion de liaison qui traverse la métrique est masquée par l’affectation de la propriété `whiteout` à l’objet `TimeSignature`. Pour ce faire, `TimeSignature` est déplacé sur un calque au-dessus de celui de `Tie` – il reste sur le calque par défaut (1) –, puis le `StaffSymbol` est placé sur un calque supérieur à celui de `TimeSignature` pour ne pas être masqué.

>     {
>       \override Score.StaffSymbol.layer = #4
>       \override Staff.TimeSignature.layer = #3
>       b'2 b'~
>       \once \override Staff.TimeSignature.whiteout = ##t
>       \time 3/4
>       b' r4
>     }

#### Utilisation de `break-visibility`

La plupart des objets de rendu ne sont imprimés qu’une seule fois ; certains cependant, tels les barres de mesure, clefs, métriques ou armures, apparaîtront deux fois lors d’un saut de ligne – une première fois en fin de ligne, puis à nouveau au début de la ligne suivante. Ces objets, que l’on peut traiter de changeables (breakable en anglais) disposent de la propriété `break-visibility` spécialement chargée de contrôler leur visibilité aux trois endroits où il sont susceptibles d’apparaître : en début de ligne, en cours de ligne ou en fin de ligne – si tant est qu’un changement s’y produise.

Par exemple, la métrique est imprimée par défaut au début de la première ligne, et nulle part ailleurs. En cas de modification, une nouvelle métrique sera imprimée à l’endroit du changement. Dans le cas où ce changement intervient en fin de ligne, la nouvelle métrique s’imprime au début de la ligne suivante, et une métrique « de précaution » viendra se placer au bout de la ligne précédente.

Ce comportement est géré par la propriété `break-visibility`, dont vous trouverez une explication à la rubrique Visibilité et couleur des objets. Cette propriété est constituée d’un vecteur de trois booléens qui, dans l’ordre, déterminent si l’objet sera imprimé à la fin, en cours, et au début d’une ligne – on pourrait aussi dire avant un saut de ligne, là où il n’y a pas de saut de ligne, et après un saut de ligne.

Les huit combinaisons possibles sont aussi disponibles sous la forme de fonctions prédéfinies, regroupées dans le fichier ‘`scm/output-lib.scm`’. Le tableau suivant vous les présente ; les trois dernières colonnes indiquent l’endroit où l’objet sera visible.

Forme | Forme | Avant | Hors | Après
--- | --- | --- | --- | ---
fonctionnelle | vectorielle | saut | saut | saut
`all-visible` | `#(#t #t #t)` | oui | oui | oui
`begin-of-line-visible` | `#(#f #f #t)` | non | non | oui
`center-visible` | `#(#f #t #f)` | non | oui | non
`end-of-line-visible` | `#(#t #f #f)` | oui | non | non
`begin-of-line-invisible` | `#(#t #t #f)` | oui | oui | non
`center-invisible` | `#(#t #f #t)` | oui | non | oui
`end-of-line-invisible` | `#(#f #t #t)` | non | oui | oui
`all-invisible` | `#(#f #f #f)` | non | non | non

Les réglages par défaut de la propriété `break-visibility` diffèrent selon l’objet de rendu. Le tableau suivant présente, pour la plupart des objets comportant la propriété `break-visibility`, ces réglages par défaut.

Objet de rendu | Contexte habituel | Réglage par défaut
--- | --- | ---
`BarLine` | `Score` | calculé
`BarNumber` | `Score` | `begin-of-line-visible`
`BreathingSign` | `Voice` | `begin-of-line-invisible`
`Clef` | `Staff` | `begin-of-line-visible`
`Custos` | `Staff` | `end-of-line-visible`
`Divisio` | `Staff` | `begin-of-line-invisible`
`DoublePercentRepeat` | `Voice` | `begin-of-line-invisible`
`KeySignature` | `Staff` | `begin-of-line-visible`
`ClefModifier` | `Staff` | `begin-of-line-visible`
`RehearsalMark` | `Score` | `end-of-line-invisible`
`TimeSignature` | `Staff` | `all-visible`

Voici un exemple d’utilisation de la forme vectorielle pour contrôler la visibilité des barres de mesure :

>     \relative {
>       f'4 g a b
>       f4 g a b
>       % Remove bar line at the end of the current line
>       \once \override Score.BarLine.break-visibility = ##(#f #t #t)
>       \break
>       f4 g a b
>       f4 g a b
>     }

Lors d’un forçage de `break-visibility` sous une forme vectorielle, les trois éléments doivent impérativement être mentionnés. Ces formes vectorielles ne sont d’ailleurs pas prises en charge par tous les objets de rendu, et certaines combinaisons peuvent entraîner des erreurs ; nous citerons entre autres :

- Une barre de mesure ne peut s’imprimer en début de ligne.
- Un numéro de mesure ne peut apparaître au début de la première ligne, à moins d’être différent de 1.
- Clef – voir ci-après.
- Les répétitions en pourcentage sont soit toutes imprimées, soit aucune. Vous devrez utiliser `begin-of-line-invisible` pour les voir et `all-invisible` pour les masquer.
- Armure – voir ci-après.
- Modificateur de clef – voir ci-après.

#### Considérations spécifiques

#### Visibilité après changement explicite

La propriété `break-visibility` contrôle la visibilité des armures ou changements de clef en début de ligne uniquement, donc après un saut. Elle ne produit aucun effet sur la visibilité d’une armure ou d’une clef après un changement explicite de tonalité ou de clef, ni en cours, ni en fin de ligne. Dans l’exemple suivant, l’armure est présente même après le passage en si bémol majeur malgré l’activation de `all-invisible` (tous invisibles).

>     \relative {
>       \key g \major
>       f'4 g a b
>       % Try to remove all key signatures
>       \override Staff.KeySignature.break-visibility = #all-invisible
>       \key bes \major
>       f4 g a b
>       \break
>       f4 g a b
>       f4 g a b
>     }

La visibilité lors de ces changements explicites d’armure ou de clef est géré respectivement par les propriétés `explicitKeySignatureVisibility` et `explicitClefVisibility`. Leur fonctionnement est en tout point identique à celui de la propriété `break-visibility` – forme vectorielle à trois éléments ou forme fonctionnelle comme indiqué ci-avant. Toutes deux sont attachées au contexte `Staff` (la portée) et non directement aux objets de rendu ; elles sont de ce fait introduites par une instruction `\set`. Leur valeur par défaut est de toujours imprimer les objets – réglage sur `all-visible`. Ces deux propriétés gèrent uniquement la visibilité des armures et clefs lors d’un changement explicite, et en dehors d’un début de ligne ; il faudra en pareil cas forcer la `break-visibility` de ces objets pour les supprimer.

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \override Staff.KeySignature.break-visibility = #all-invisible
>       \key bes \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

#### Visibilité des bécarres de précaution

L’impression d’altérations de précaution au moment d’un changement explicite de tonalité sera annulée dès lors que vous aurez désactivé la propriété `printKeyCancellation` du contexte `Staff` :

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \set Staff.printKeyCancellation = ##f
>       \override Staff.KeySignature.break-visibility = #all-invisible
>       \key bes \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

Avec de tels réglages particuliers, seules les altérations accidentelles permettront d’indiquer le changement de tonalité.

Notez bien que lors d’une bascule en do majeur ou la mineur, seuls les « bécarres d’annulation » permettent d’identifier le changement de tonalité. En pareil cas, désactiver `printKeyCancellation` sera sans effet :

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \set Staff.printKeyCancellation = ##f
>       \key c \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

La suppression des bécarres d’annulation même lors d’un passage en do majeur ou la mineur n’interviendra qu’après modification de la visibilité de l’objet `KeyCancellation` :

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \override Staff.KeyCancellation.break-visibility = #all-invisible
>       \key c \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

#### Clefs transposées

L’indication de transposition d’une clef est produite par l’objet de rendu `ClefModifier`. Sa visibilité étant gérée par héritage direct de l’objet `Clef`, nul n’est besoin de forcer un quelconque `break-visibility` au niveau des objets `ClefModifier` pour éliminer une indication de transposition lorsque la clef est invisible.

Lors d’un changement explicite de clef, la propriété `explicitClefVisibility` gère à la fois le symbole de la clef et l’indication de transposition qui lui est attachée.

#### Voir aussi

Manuel d’initiation : Visibilité et couleur des objets.

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