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. 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 courants qui
sont placés, par défaut, dans les contextes Staff
ou
Voice
.
Objet de rendu | Priorité | Contrôle la position de : |
---|---|---|
| | Texte sur les silences qui couvrent des mesures entières |
| | Texte des markup (ou étiquettes) |
| | Indication d’octaviation |
| | Bandeau ou extension de texte |
| | Toutes les marques de nuances |
| | Bandeau de répétition |
| | Bandeau de trille |
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' \startTextSpan % Add Dynamic Text c\pp % Add Dynamic Line Spanner c\< % Add Text Script c^Text c c % Add Dynamic Text c\ff c \stopTextSpan % Stop Ottava Bracket \ottava #0 c, 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
Extensions de texte.
Il montre aussi comment créer des marques d’octaviation.
Vous aurez remarqué que les numéros de mesure, l’indication métronomique
et les marques de répétition n’apparaissent pas. Par défaut, ils sont
créés dans le contexte Score
et leur
outside-staff-priority
est ignorée face aux objets qui sont créés
dans le contexte Staff
. Si vous voulez faire apparaître les
numéros de mesure, l’indication métronomique ou les marques de
répétition conformément à la valeur de leur
outside-staff-priority
, il vous faudra retirer respectivement le
Bar_number_engraver
, le Metronome_mark_engraver
oule
Mark_engraver
du contexte Score
et les placer en haut du
contexte Staff
. Après quoi ces marques porteront les valeurs de
outside-staff-priority
par défaut suivantes :
Objet de rendu | Priorité |
---|---|
| |
| |
| |
Si les valeurs de outside-staff-priority
par défaut ne donnent
pas les résultats que vous attendez, 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 RPI 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' \startTextSpan % Add Dynamic Text c\pp % Add Dynamic Line Spanner c\< % Add Text Script c^Text c c % Add Dynamic Text c\ff c \stopTextSpan % Stop Ottava Bracket \ottava #0 c, c c c
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 (voir Comportement automatique). Il
nous suffit pour cela de regarder dans la RPI ou dans le tableau plus
haut la priorité de TextScript
, et d’augmenter la priorité de
« Text3 » jusqu’à une valeur très haute :
c2^"Text1" c^"Text2" \once \override TextScript #'outside-staff-priority = #500 c^"Text3" c^"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
.
\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 faut pour s’adapter au texte :
\textLengthOn % Cause notes to space out to accommodate text c2^"Text1" c^"Text2" c^"Text3" c^"Text4"
La commande qui permet de revenir au comportement par défaut est
\textLengthOff
. Rappelez-vous que \once
ne
fonctionne qu’avec \override
, \set
, \revert
ou
\unset
, et donc ne peut pas être utilisé avec
\textLengthOn
.
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 notes.
% This markup is short enough to fit without collision c2^"Tex" c''2 R1 % This is too long to fit, so it is displaced upwards c,,2^"Text" c''2 R1 % Turn off collision avoidance \once \override TextScript #'outside-staff-priority = ##f c,,2^"Long Text " c''2 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
Nuances
Les indications de nuances 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 :
\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 a4\f b\mf c\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. Il était possible de faire cela pour les textes de
markup grâce à la commande \textLengthOn
mais 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’étendue verticale est fixée par une paire de nombre,
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 arriver à 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
en '(0 . 0)
,
afin que leur vraie largeur se manifeste. La commande pour y
parvenir avec des indications de nuances est :
\override DynamicText #'extra-spacing-width = #'(0 . 0)
Voyons si ça marche sur notre exemple précédent :
\dynamicUp \override DynamicText #'extra-spacing-width = #'(0 . 0) a4\f b\mf c\mp b\p
Bon, cela a mis un terme aux déplacements verticaux des
nuances mais il reste deux problèmes. Il faudrait que les
nuances soient un peu plus écartées et ce serait mieux si
elles étaient toutes à la même distance de la portée. Le
premier problème est simple à résoudre. Au lieu d’attribuer
à extra-spacing-width
la valeur zéro, nous pourrions
mettre un peu plus. L’unité est la distance entre deux lignes
de portée, donc en écartant le bord gauche d’une demi-unité
et le bord droit d’une demi-unité, on obtient :
\dynamicUp % Extend width by 1 staff space \override DynamicText #'extra-spacing-width = #'(-0.5 . 0.5) a4\f b\mf c\mp b\p
C’est mieux mais nous voulons peut-être aligner les indications de
nuances 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
; la section suivante lui est consacrée.