GNU LilyPond – Manuel d'initiation: 4.3.1 Visibilité et couleur des objets

### 4.3.1 Visibilité et couleur des objets

Dans un but pédagogique, on peut être amené à masquer certains éléments d’une partition, que les élèves doivent ensuite compléter. Imaginons, par exemple, un exercice dans lequel il faudrait rétablir les barres de mesure dans un morceau de musique. En temps normal, les barres de mesure s’insèrent automatiquement. Comment faire pour les effacer de la partition ?

Avant de nous y attaquer, souvenons-nous que les propriétés d’objets sont parfois groupées dans ce qu’on appelle des interfaces – voir Propriétés listées par interface. Cela permet de rapprocher toutes les propriétés susceptibles d’être utilisées ensemble pour modifier un objet graphique – si l’une d’elles est choisie pour un objet, elle s’appliquera à tous les autres. Certains objets tirent alors leurs propriétés de telle ou telle interface, d’autres objets de telle ou telle autre interface. La liste des interfaces qui contiennent les propriétés liées à un objet graphique (grob) figure dans la RPI, en bas de la page de description du grob ; pour voir ces propriétés, il faut aller voir ces interfaces.

Nous avons vu, dans Propriétés des objets de rendu, comment trouver les informations sur les grobs. Nous procédons de la même manière et consultons la RPI pour connaître l’objet chargé d’imprimer les barres de mesure. En cliquant sur Backend puis sur Tous les objets de rendu, nous trouvons un objet appelé `BarLine`. Parmi ses propriétés, deux d’entre elles déterminent son aspect visuel : `break-visibility` et `stencil`. L’objet `BarLine` est également lié à plusieurs interfaces, dont la `grob-interface` où figurent les propriétés `transparent` et `color`. Toutes peuvent modifier l’aspect visuel des barres de mesure – et de beaucoup d’autres objets, bien sûr. Examinons chacune d’elles tour à tour.

### stencil

Cette propriété contrôle l’apparence des barres de mesure en précisant le type de symbole (glyphe) à imprimer. Comme pour de nombreuses autres propriétés, on peut lui indiquer de ne rien imprimer en lui attribuant la valeur `#f`. Essayons en laissant de côté, une fois encore, le contexte concerné (`Voice` en l’occurrence) :

>     {
>       \time 12/16
>       \override BarLine #'stencil = ##f
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Les barres de mesure sont encore là ! Pourquoi ? Retournons à la RPI et regardons de nouveau la page qui traite des propriétés de BarLine. En haut de la page, il est précisé que « Les objets BarLine sont créés par le graveur Bar_engraver ». Allons à la page de `Bar_engraver`. Tout en bas se trouve la liste des contextes dans lesquels fonctionne ce graveur. Tous sont du type `Staff`, de sorte que, si la commande `\override` n’a pas fonctionné comme prévu, c’est parce que `Barline` n’appartient pas au contexte par défaut, `Voice`. Si le contexte spécifié est erroné, la commande ne fonctionne pas. Cela n’entraîne pas de message d’erreur, et rien n’apparaît dans le fichier log. Essayons de corriger en mentionnant le bon contexte :

>     {
>       \time 12/16
>       \override Staff.BarLine #'stencil = ##f
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Cette fois, les barres de mesure ont disparu.

Vous remarquerez que l’affectation de la valeur `#f` à la propriété `stencil` déclechera une erreur dès lors que l’objet en question se doit d’avoir des dimensions pour les nécessités du traitement. Ce sera le cas, par exemple, si vous effacez le `stencil` d’un objet `NoteHead`. Il vaut mieux, en pareil caas, utiliser la fonction `point-stencil` qui, quant à elle, attribue à l’objet une taille à zero :

>     {
>       c4 c
>       \once \override NoteHead #'stencil = #point-stencil
>       c4 c
>     }

### visibilité des barres (break-visibility)

La RPI mentionne, à la page sur `BarLine`, que la propriété `break-visibility` attend comme argument un vecteur de trois boléens. Ceux-ci indiquent respectivement si les barres de mesure doivent être imprimées ou non à la fin de la ligne, à l’intérieur de la ligne et au début de la ligne. Dans notre cas, nous voulons que toutes les barres soient supprimées, si bien que la valeur dont nous avons besoin est `'#(#f #f #f)`. Essayons, sans oublier d’ajouter le contexte `Staff`. Vous remarquerez que, en plus de cette valeur, nous ajoutons `#'#` devant la parenthèse ouvrante. Le `'#` est nécessaire car il fait partie intégrante de la valeur contenant un vecteur, et le premier `#` est là, comme toujours avec la commande `\override`, pour introduire la valeur elle-même.

>     {
>       \time 12/16
>       \override Staff.BarLine #'break-visibility = #'#(#f #f #f)
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Comme on peut le constater, cette solution-là aussi supprime les barres de mesure.

### transparence

La RPI mentionne, à la page sur `grob-interface`, que la propriété `transparent` attend comme argument un boléen. Il faudrait donc mettre `#t` pour rendre l’objet transparent. Dans cet exemple, essayons de rendre transparente la métrique (time signature en anglais) plutôt que les barres de mesure. Pour cela, il nous faut trouver le nom du grob chargé de l’indication de mesure. De retour sur la page « Tous les objets de rendu » de la RPI, nous cherchons les propriétés de l’objet `TimeSignature`. Celui-ci est géré par le graveur `Time_signature_engraver` qui, comme vous pouvez le constater, appartient au contexte `Staff` et peut se rattacher à la `grob-interface`. Dans ces conditions, la commande pour rendre la métrique transparente est :

>     {
>       \time 12/16
>       \override Staff.TimeSignature #'transparent = ##t
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

La métrique a bien disparu mais la commande a laissé un blanc en lieu et place du chiffrage. Ce peut être souhaitable dans le cadre d’un exercice, afin que les élèves aient la place pour compléter, mais dans d’autres circonstances, ce peut être gênant. Pour y remédier, attribuons plutôt au stencil des métriques la valeur `#f` :

>     {
>       \time 12/16
>       \override Staff.TimeSignature #'stencil = ##f
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

La différence est flagrante : le fait d’attribuer au stencil la valeur `#f` supprime totalement l’objet, tandis que le fait de le rendre `transparent` le laisse en place, mais de façon invisible.

### couleur

Essayons enfin de rendre les barres de mesure invisibles en les colorant en blanc. La difficulté est de savoir si les barres blanches vont couper ou non les lignes de la portée aux endroits où elles se croisent. Vous verrez dans les exemples ci-dessous que cela peut se produire, sans qu’on le sache à l’avance. Les explications de ce phénomène et les solutions pour y remédier sont exposées dans Blanchiment des objets. Pour le moment, acceptons cet inconvénient et concentrons-nous sur l’apprentissage de la gestion des couleurs.

La `grob-interface` indique que la valeur de la propriété `color` est une liste, sans plus d’explication. En fait, cette liste est une liste de valeurs en unités internes ; pour éviter d’avoir à chercher ce qu’il faut y mettre, il existe différents moyens d’indiquer la couleur. Le premier moyen consiste à utiliser l’une des couleurs normales de la première Liste des couleurs. Pour mettre les barres de mesure en blanc, on écrit :

>     {
>       \time 12/16
>       \override Staff.BarLine #'color = #white
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

et nous constatons que les barres de mesure sont une fois de plus invisibles. Attention : aucune apostrophe ne précède `white` – il ne s’agit pas d’un symbole mais d’une fonction. Quand on l’invoque, elle fournit une liste de valeurs internes requises pour changer la couleur en blanc. Les autres couleurs aussi, dans la « liste normale », sont des fonctions. Pour en être certain, vous pouvez faire l’essai en choisissant une autre fonction de la liste en guise de couleur.

Le deuxième moyen de changer la couleur consiste à utiliser la deuxième Liste des couleurs, dite noms de couleurs X11. Ceux-ci doivent obligatoirement être précédés d’une autre fonction, qui convertit les noms de couleurs X11 en une liste de valeurs internes, `x11-color`, comme ceci :

>     {
>       \time 12/16
>       \override Staff.BarLine #'color = #(x11-color 'white)
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Vous noterez que, dans ce cas, la fonction `x11-color` admet un symbole comme argument ; il faut donc placer une apostrophe devant le symbole et insérer les deux à l’intérieur de parenthèses.

Il existe une troisième fonction, écrite pour convertir les valeurs RVB en couleurs internes – la fonction `rgb-color`. Elle comporte trois arguments, donnant respectivement l’intensité du rouge, du vert et du bleu. Ces arguments prennent des valeurs comprises entre 0 et 1. Ainsi, pour choisir la couleur rouge, la valeur serait `(rgb-color 1 0 0)` ; pour le blanc, ce serait `(rgb-color 1 1 1)` :

>     {
>       \time 12/16
>       \override Staff.BarLine #'color = #(rgb-color 1 1 1)
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Enfin, il existe une échelle de gris parmi les possibilités de couleurs X11. Elle va du noir (`'grey0`) au blanc (`'grey100`), avec un pas de 1. Essayons de l’utiliser en attribuant à tous les objets de notre exemple différentes nuances de gris :

>     {
>       \time 12/16
>       \override Staff.StaffSymbol   #'color = #(x11-color 'grey30)
>       \override Staff.TimeSignature #'color = #(x11-color 'grey60)
>       \override Staff.Clef          #'color = #(x11-color 'grey60)
>       \override Voice.NoteHead      #'color = #(x11-color 'grey85)
>       \override Voice.Stem          #'color = #(x11-color 'grey85)
>       \override Staff.BarLine       #'color = #(x11-color 'grey10)
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Vous remarquerez le contexte associé à chacun des objets. Une erreur sur ce point empêcherait la commande de fonctionner. Souvenez-vous que le contexte est celui dans lequel est placé le graveur approprié. Pour chaque graveur, on peut trouver son contexte par défaut en partant de l’objet lui-même, puis en cherchant le graveur qui le produit ; la page du graveur dans la RPI nous indique alors le contexte dans lequel le graveur se trouve normalement.

Autres langues : English, česky, deutsch, español, 日本語, nederlands.

#### LilyPond — Manuel d’initiation