]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/fr/user/changing-defaults.itely
Merge branch 'master' of ssh://kainhofer@git.sv.gnu.org/srv/git/lilypond into dev...
[lilypond.git] / Documentation / fr / user / changing-defaults.itely
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
2 @c This file is part of ../user/lilypond.tely
3 @ignore
4     Translation of GIT committish: 76de7e168dbc9ffc7671d99663c5ce50dae42abb
5
6     When revising a translation, copy the HEAD committish of the
7     version that you are working on.  See TRANSLATION for details.
8 @end ignore
9
10 @c \version "2.11.51"
11
12 @c Translators: Valentin Villenave
13 @c Translation checkers: Gilles Thibault
14
15 @node Changing defaults
16 @chapter Changing defaults
17
18 LilyPond est conçu pour engendrer, par défaut, des partitions de la
19 plus haute qualité.  Cependant, on peut parfois avoir à modifier cette
20 mise en page par défaut.  Celle-ci est réglée par tout un ensemble de
21 @qq{leviers et manettes}, dont ce chapitre ne cherche pas à faire
22 l'inventaire exhaustif.  Le propos est plutôt ici de mettre en évidence
23 les différents groupes auxquels s'apparentent ces contrôles, et d'expliquer
24 comment trouver le bon levier pour obtenir tel ou tel effet en particulier.
25
26 @cindex Référence du programme
27
28 Les moyens de contrôle des différents réglages sont décrits dans un document
29 séparé, la
30 @iftex
31 référence du programme
32 @end iftex
33 @ifnottex
34 @ref{Top,Référence du programme,,lilypond-internals}.
35 @end ifnottex
36 Ce guide répertorie toutes les variables, fonctions et autres options que
37 LilyPond met à votre disposition.  Il est consultable 
38 @c leave the @uref as one long line.
39 @uref{http://@/lilypond@/.org/@/doc/@/stable/@/Documentation/@/user/@/lilypond@/-internals/,en@tie{}ligne},
40 au format HTML, mais est également inclus dans la documentation
41 fournie avec le logiciel.
42
43 Il est quatre domaines dans lesquels on peut modifier les réglages par défaut :
44
45 @itemize @bullet
46 @item
47 La notation automatique, ce qui revient à modifier la manière dont les éléments
48 de notation sont automatiquement créés -- par exemple, les règles de ligatures.
49
50 @item
51 L'apparence, qui se rapporte aux objets pris individuellement -- ainsi de la direction 
52 des hampes, du placement des indications textuelles.
53
54 @item
55 Les contextes, qui recouvrent la manière dont les évènements musicaux sont représentés sous forme de
56 notation -- par exemple, le fait d'attribuer un chiffre de mesure distinct à chaque portée.
57
58 @item
59 La mise en page, autrement dit les marges, l'espacement, la taille du papier ; tous ces facteurs
60 font l'objet des chapitres @ref{General input and output} et @ref{Spacing issues}.
61 @end itemize
62
63 En sous-main, LilyPond se sert du langage Scheme (un dérivé du LISP) comme
64 infrastructure.  Modifier les choix de mise en page revient à pénétrer dans
65 les entrailles du programme, et de ce fait requiert l'emploi du Scheme.
66 Les fragments de Scheme, dans un fichier @code{.ly}, sont introduits par le
67 caractère @q{hash}, (@code{#}, improprement surnommé @q{dièse}).@footnote{Le 
68 @rlearning{Scheme tutorial} fournit quelques notions de base pour saisir des nombres,
69 des listes, des chaînes de caractères ou des symboles, en Scheme.}
70
71
72 @menu
73 * Automatic notation::          
74 * Interpretation contexts::     
75 * The override command::        
76 @end menu
77
78
79 @node Automatic notation
80 @section Automatic notation
81
82 Cette section s'intéresse au réglage de l'impression automatique des
83 ligatures.
84
85 @menu
86 * Setting automatic beam behavior::  
87 @end menu
88
89 @node Setting automatic beam behavior
90 @subsection Setting automatic beam behavior
91
92 @funindex autoBeamSettings
93 @funindex (end * * * *)
94 @funindex (begin * * * *)
95 @cindex ligatures automatiques, réglage
96 @cindex réglage des ligatures automatiques
97
98 @c [TODO: use \applyContext]
99
100 Dans les métriques courantes, les ligatures automatiques peuvent commencer
101 sur n'importe quelle note, mais ne peuvent se terminer qu'à certains points précis
102 dans la mesure : sur une pulsation, ou après toute durée spécifiée par les propriétés
103 nommées @code{autoBeamSettings}.  Ces propriétés consistent en une liste de règles
104 relatives au début ou à la fin des ligatures.  Par défaut, elles sont définies dans
105 le fichier
106 @file{scm/@/auto@/-beam@/.scm}.
107
108 On peut ajouter à cette liste une nouvelle règle, au moyen de la commande
109 @example
110 #(override-auto-beam-setting '(extrémité p q n m) a b [contexte])
111 @end example
112
113 @itemize @bullet
114
115 @item @code{extrémité} désigne le début (@code{begin}) ou la fin (@code{end}) de la ligature.
116
117 @item @code{p/q} désigne la valeur rythmique de la note que l'on veut affecter, ou de la
118 plus brève des notes concernées.  Si cette règle doit s'appliquer à toutes les ligatures,
119 remplacez @code{p} et @code{q} par des étoiles @qq{@code{*}}.
120
121
122 @item @code{n/m} est le chiffre de mesure dans lequel la règle doit
123 s'appliquer.  Si celle-ci doit s'appliquer dans toutes les métriques,
124 remplacez @code{n} et @code{m} par des étoiles @qq{@code{*}}.
125
126 @item @code{a/b} est l'emplacement, dans la mesure, auquel les ligatures doivent
127 débuter ou s'achever (suivant la valeur @q{extrémité} que nous venons de voir).
128
129
130 @item @code{contexte} est un argument facultatif, qui détermine le contexte dans lequel
131 la règle doit s'appliquer.  Par défaut, il s'agit de @code{'Voice}.
132 @code{#(score-override-auto-beam-setting '(A B C D) E F)} équivaut à
133 @code{#(override-auto-beam-setting '(A B C D) E F 'Score)}.
134
135 @end itemize
136
137 Par exemple, si l'on veut que les ligatures s'achèvent toujours après la première noire :
138
139
140 @example
141 #(override-auto-beam-setting '(end * * * *) 1 4)
142 @end example
143
144 On peut obliger une règle de ligatures à ne s'appliquer qu'à des groupes dont la note
145 la plus brève est d'une valeur précise :
146
147 @lilypond[quote,fragment,ragged-right,verbatim,relative=2]
148 \time 2/4
149 #(override-auto-beam-setting '(end 1 16 * *) 1 16)
150 a16 a a a a a a a |
151 a32 a a a a16 a a a a a |
152 #(override-auto-beam-setting '(end 1 32 * *) 1 16)
153 a32 a a a a16 a a a a a |
154 @end lilypond
155
156 On peut obliger une règle de ligatures à ne s'appliquer que pour un chiffre de mesure
157 précis :
158
159 @lilypond[quote,fragment,ragged-right,verbatim,relative=2]
160 \time 5/8
161 #(override-auto-beam-setting '(end * * 5 8) 2 8)
162 c8 c d d d
163 \time 4/4
164 e8 e f f e e d d
165 \time 5/8
166 c8 c d d d
167 @end lilypond
168
169 Enfin, on peut désactiver une règle de ligatures au moyen du réglage suivant :
170
171 @example
172 #(revert-auto-beam-setting '(extrémité p q n m) a b [contexte])
173 @end example
174
175 @noindent
176 @code{extrémité}, @code{p}, @code{q}, @code{n}, @code{m}, @code{a}, @code{b} et @code{contexte}
177 étant les mêmes que plus haut.  Il est même possible de désactiver des règles que l'on n'a pas
178 explicitement créées : les règles par défaut, qui se trouvent dans le fichier @file{scm/@/auto@/-beam@/.scm}.
179
180
181
182 @lilypond[quote,fragment,ragged-right,verbatim,relative=2]
183 \time 4/4
184 a16 a a a a a a a a a a a a a a a
185 #(revert-auto-beam-setting '(end 1 16 4 4) 1 4)
186 a16 a a a a a a a a a a a a a a a
187 @end lilypond
188
189 La commande @code{revert-auto-beam-setting} requiert exactement les mêmes arguments
190 que la règle d'origine.  En d'autres termes, les étoiles ne seront pas prises en compte ici.
191
192 @lilypond[quote,fragment,ragged-right,verbatim,relative=2]
193 \time 1/4
194 #(override-auto-beam-setting '(end 1 16 1 4) 1 8)
195 a16 a a a
196 #(revert-auto-beam-setting '(end 1 16 * *) 1 8) % ceci ne désactive pas la règle !
197 a a a a
198 #(revert-auto-beam-setting '(end 1 16 1 4) 1 8) % ceci marche
199 a a a a
200 @end lilypond
201
202
203
204 @c TODO:  old material -- not covered by above stuff, I think.
205 Si, dans une mesure à 5/4, l'on veut que les ligatures soient regroupées temps par temps,
206 il est nécessaire d'indiquer toutes les terminaisons de ligatures.
207 @example
208 #(override-auto-beam-setting '(end * * * *) 1 4 'Staff)
209 #(override-auto-beam-setting '(end * * * *) 1 2 'Staff)
210 #(override-auto-beam-setting '(end * * * *) 3 4 'Staff)
211 #(override-auto-beam-setting '(end * * * *) 5 4 'Staff)
212 @dots{}
213 @end example
214
215 La même syntaxe peut servir à définir les points de départ des ligatures.
216 Dans l'exemple suivant, les ligatures automatiques  ne peuvent se terminer 
217 que sur une noire pointée.
218 @example
219 #(override-auto-beam-setting '(end * * * *) 3 8)
220 #(override-auto-beam-setting '(end * * * *) 1 2)
221 #(override-auto-beam-setting '(end * * * *) 7 8)
222 @end example
223 @c ???? Je n'y comprends rien --vv
224 Dans une mesure à 4/4, cela implique que les ligatures ne peuvent se terminer que sur
225 la troisième croche, ou sur le quatrième temps (après la valeur de deux fois trois croches).
226
227 Si une ligature se fait de manière inattendue, pensez à vérifer les règles automatiques
228 dans le fichier @file{scm/@/auto@/-beam@/.scm} pour rechercher d'éventuels conflits, dans
229 la mesure ou les règles par défaut s'ajoutent à vos propres règles.  Il est alors nécessaire
230 de désactiver toute règle par défaut conduisant à des ligatures indésirables.
231
232 Ainsi, pour obtenir des ligatures en groupes de @code{(3 4 3 2)} croches, dans une mesure à 12/8,
233 il faudra préalablement utiliser :
234
235 @example
236 %%% annulons les réglages par défaut relatifs à 12/8, dans scm/auto-beam.scm 
237 #(revert-auto-beam-setting '(end * * 12 8) 3 8)
238 #(revert-auto-beam-setting '(end * * 12 8) 3 4)
239 #(revert-auto-beam-setting '(end * * 12 8) 9 8)
240
241 %%% puis ajoutons nos propres règles
242 #(override-auto-beam-setting '(end 1 8 12 8) 3 8)
243 #(override-auto-beam-setting '(end 1 8 12 8) 7 8)
244 #(override-auto-beam-setting '(end 1 8 12 8) 10 8)
245 @end example
246
247 @cindex ligatures automatiques
248 @cindex groupes de notes
249 @funindex autoBeaming
250 @cindex paroles
251
252 Si des ligatures sont utilisées dans les paroles d'une chanson (pour indiquer des mélismes),
253 les ligatures automatiques doivent être désactivées, avec @code{\autoBeamOff}.
254
255
256 @predefined
257
258 @funindex \autoBeamOff
259 @code{\autoBeamOff},
260 @funindex \autoBeamOn
261 @code{\autoBeamOn}.
262
263 @commonprop
264
265 Les groupes de notes reliées par les ligatures peuvent être spécifiés au moyen
266 de la propriété @code{beatGrouping}.
267
268 @lilypond[quote,verbatim,relative=2,fragment,ragged-right]
269 \time 5/16
270 \set beatGrouping = #'(2 3)
271 c8[^"(2+3)" c16 c8]
272 \set beatGrouping = #'(3 2)
273 c8[^"(3+2)" c16 c8]
274 @end lilypond
275
276
277 @knownissues
278
279 Si une partition se termine alors qu'une ligature automatique est restée inachevée,
280 cette dernière ligature ne sera pas imprimée du tout.  C'est également valable dans
281 le cas d'une musique polyphonique, saisie avec la syntaxe @code{<< @dots{} \\ @dots{}
282 >>}, où une voix se terminerait sans que la dernière ligature
283 soit achevée.
284
285 @node Interpretation contexts
286 @section Interpretation contexts
287
288 Cette section traite des contextes.
289
290 @menu
291 * Changing context properties on the fly::  
292 * Modifying context plug-ins::  
293 * Layout tunings within contexts::  
294 * Changing context default settings::  
295 * Defining new contexts::       
296 * Aligning contexts::           
297 * Vertical grouping of grobs::  
298 @end menu
299
300
301 @node Changing context properties on the fly
302 @subsection Changing context properties on the fly
303
304 @cindex propriétés
305 @funindex \set
306 @cindex modifier des propriétés
307
308 Chaque contexte peut avoir plusieurs @emph{propriétés}, c'est-à-dire
309 des variables qu'il inclut.  Ces dernières peuvent être modifiées @qq{à la volée},
310 c'est-à-dire pendant que la compilation s'accomplit.  C'est là le rôle de la
311 commande @code{\set}.
312
313 @example
314 \set @var{contexte}.@var{propriété} = #@var{valeur}
315 @end example
316
317 Ainsi :
318 @lilypond[quote,verbatim,relative=2,fragment]
319 R1*2
320 \set Score.skipBars = ##t
321 R1*2
322 @end lilypond
323
324 Cette commande permet de condenser les mesures vides de notes, en des silences
325 multi-mesures.  Il s'agit d'un objet Scheme, auquel on attribue la valeur booléenne
326 @q{vrai}, c'est-à-dire la lettre @code{#t} pour @q{True} en anglais.
327
328 Ce changement étant appliqué @q{à la volée}, il n'affecte que le second groupe de notes.
329
330 Si l'argument @var{contexte} n'est pas spécifié, alors la propriété cherchera à s'appliquer
331 dans le contexte le plus restreint où elle est employée : le plus souvent
332  @code{ChordNames}, @code{Voice}, ou @code{Lyrics}.  Dans l'exemple suivant,
333
334 @lilypond[quote,verbatim,relative=2,fragment]
335 c8 c c c
336 \set autoBeaming = ##f
337 c8 c c c
338 @end lilypond
339
340 @noindent
341 aucun argument @var{contexte} n'a été donné à la commande @code{\set}.
342 De ce fait, les ligatures automatiques sont désactivées dans le
343 contexte actuel, c'est-à-dire @rinternals{Voice}.  Notez que le
344 contexte le plus restreint n'est pas toujours le bon, 
345 et peut ne pas contenir la propriété qui vous intéresse : ainsi, la propriété 
346 @code{skipBars}, évoquée plus haut, ne relève pas du contexte @code{Voice}, 
347 et le code suivant ne fonctionnera pas.
348
349 @lilypond[quote,verbatim,relative=2,fragment]
350 R1*2
351 \set skipBars = ##t
352 R1*2
353 @end lilypond
354
355 Les contextes s'organisent de façon hiérarchique : aussi, lorsqu'un contexte de niveau
356 supérieur est spécifié (par exemple @code{Staff}), la propriété sera modifée dans
357 tous les contextes inférieurs (tous les contextes @code{Voice}, par exemple)
358 qu'il contient.
359
360 @funindex \unset
361
362 La commande @code{\unset} permet d'annuler la définition d'une propriété :
363
364 @example
365 \unset @var{contexte}.@var{propriété}
366 @end example
367
368 @noindent
369 si et seulement si cette propriété à été définie dans ce @var{contexte}
370 précis ; ainsi,
371
372 @example
373 \set Staff.autoBeaming = ##f
374 @end example
375
376 @noindent
377 même s'il s'applique à tous les contextes @code{Voice} contenus dans le
378 contexte @code{Staff}, ne peut être annulé au niveau @code{Voice}.  Le code
379 suivant sera sans effet.
380
381 @example
382 \unset Voice.autoBeaming
383 @end example
384
385 @noindent
386 En d'autres termes, la commande @code{\unset} doit impérativement être
387 accompagnée du même contexte que la commande @code{\set} d'origine.
388 Pour annuler l'effet, dans notre exemple, de @code{Staff.autoBeaming = ##f},
389 il faut donc entrer :
390 @example
391 \unset Staff.autoBeaming
392 @end example
393
394 Si l'on se trouve dans le contexte le plus restreint, il n'est pas obligatoire,
395 là encore, de spécifier le @var{contexte}.  Ainsi, les deux lignes suivantes sont équivalentes.
396
397
398 @example
399 \set Voice.autoBeaming = ##t
400 \set autoBeaming = ##t
401 @end example
402
403
404 @cindex \once
405 Pour modifier une propriété de façon à ce qu'elle ne s'applique qu'une seule fois,
406 il convient d'employer la commande @code{\once} :
407
408 @lilypond[quote,verbatim,relative=2,fragment]
409 c4
410 \once \set fontSize = #4.7
411 c4
412 c4
413 @end lilypond
414
415 Ici le changement de taille est annulé aussitôt après la note concernée.
416
417 La référence du programme contient une description exhaustive de toutes les
418 propriétés contexte par contexte : voir
419 @ifhtml
420 @rinternals{Tunable context properties}.
421 @end ifhtml
422 @ifnothtml
423 Translation @expansion{} Tunable context properties.
424 @end ifnothtml
425
426
427 @node Modifying context plug-ins
428 @subsection Modifying context plug-ins
429
430 Les contextes, tels que @code{Score} ou @code{Staff}, ne contiennent
431 pas que des propriétés ; ils mettent également en œuvre certains
432 sous-programmes (@q{plug-ins}, pour employer le terme consacré) nommés
433 @q{graveurs} (@q{engravers}, pour reprendre le terme anglais).
434 Ces sous-programmes sont chargés de créer les différents éléments de notation :
435 On trouve ainsi dans le contexte @code{Voice}, un graveur @code{Note_head_engraver},
436 chargé des têtes de notes, et dans le contexte @code{Staff}, un graveur
437 @code{Key_signature_engraver}, chargé de l'armure.
438
439 Vous trouverez une description exhaustive de chaque graveur dans
440 @ifhtml
441 @rinternals{Engravers}.
442 @end ifhtml
443 @ifnothtml
444 Program reference @expansion Translation @expansion{} Engravers.
445 @end ifnothtml
446 Chaque contexte mentionné dans
447 @ifhtml
448 @rinternals{Contexts}
449 @end ifhtml
450 @ifnothtml
451 Program reference @expansion Translation @expansion{} Context.
452 @end ifnothtml
453 répertorie les graveurs mis en œuvre.
454
455
456 On peut faire, au moyen de ces graveurs, sa propre @qq{cuisine}, en
457 modifiant les contextes à volonté.
458
459
460 Lorsque un contexte est créé, par la commande @code{\new} ou @code{\context}, on peut
461 y adjoindre un bloc @code{\with} (en anglais @q{avec}), dans lequel il est possible
462 d'ajouter (commande @code{\consists}) ou d'enlever (commande @code{\remove})
463 des graveurs :
464
465 @funindex \with
466
467 @example
468 \new @var{contexte} \with @{
469   \consists @dots{}
470   \consists @dots{}
471   \remove @dots{}
472   \remove @dots{}
473   @emph{etc.}
474 @}
475 @{
476   @emph{..musique..}
477 @}
478 @end example
479
480 @noindent
481 Ici les points de suspension @dots{} devront être remplacés par les noms
482 des graveurs désirés.  Dans l'exemple suivant, on enlève du contexte
483 @code{Staff}, le chiffre de mesure (graveur @code{Time_signature_engraver})
484 et la clé (graveur @code{Clef_engraver}).
485
486 @lilypond[quote,relative=1,verbatim,fragment]
487 <<
488   \new Staff {
489     f2 g
490   }
491   \new Staff \with {
492      \remove "Time_signature_engraver"
493      \remove "Clef_engraver"
494   } {
495     f2 g2
496   }
497 >>
498 @end lilypond
499
500 La clé et le chiffre de mesure ont disparu de la deuxième portée.  C'est une méthode
501 quelque peu radicale, puisqu'elle affectera toute la portée jusqu'à la fin de la
502 partition.  L'espacement s'en trouve également affecté, ce qui peut être ou non
503 l'effet recherché.  Une méthode plus sophistiquée aurait été de rendre ces objets
504 transparents (voir @rlearning{Common tweaks}).
505
506 Dans l'exemple suivant, voici une mise en pratique plus utile.  En temps
507 normal, les barres de mesure et la métrique sont synchronisées verticalement
508 dans toute la partition.  Les graveurs qui en sont responsables se nomment
509 @code{Timing_translator} et @code{Default_bar_line_engraver}.
510 En les enlevant du contexte @code{Score} pour les attribuer au contexte
511 @code{Staff}, chaque portée peut désormais avoir sa propre métrique.
512
513 @cindex polymétrique, partition
514 @cindex Chiffres de mesure multiples
515
516 @lilypond[quote,relative=1,ragged-right,verbatim,fragment]
517 \new Score \with {
518   \remove "Timing_translator"
519   \remove "Default_bar_line_engraver"
520 } <<
521   \new Staff \with {
522     \consists "Timing_translator"
523     \consists "Default_bar_line_engraver"
524   } {
525       \time 3/4
526       c4 c c c c c
527   }
528   \new Staff \with {
529     \consists "Timing_translator"
530     \consists "Default_bar_line_engraver"
531   } {
532        \time 2/4
533        c4 c c c c c
534   }
535 >>
536 @end lilypond
537
538
539 @node Layout tunings within contexts
540 @subsection Layout tunings within contexts
541
542 Chaque contexte est chargé de créer plusieurs types d'objets graphiques.
543 Il contient également les réglages nécessaires pour chacun de ces objets.
544 Si l'on modifie ces réglages, les objets n'auront plus la même apparence.
545
546 La syntaxe employée pour ce faire est
547
548 @example
549 \override @var{contexte}.@var{objet} #'@var{propriété} = #@var{valeur}
550 @end example
551
552 Ici @var{objet} est un objet graphique, tel que @code{Stem} (les hampes)
553 ou @code{NoteHead} (les têtes de note) ; @var{propriété} est une variable
554 (désignée par un symbole, ce qui explique l'apostrophe) employée par le système
555 de mise en page.  La sous-section @ref{Constructing a tweak} vous
556 aidera à savoir quoi mettre à la place de @var{objet}, @var{propriété} et
557 @var{valeur} ; notre propos n'est ici que d'examiner l'emploi de cette commande.
558
559 La commande suivante :
560
561 @verbatim
562 \override Staff.Stem #'thickness = #4.0
563 @end verbatim
564
565 @noindent
566 rend les hampes plus épaisses (la valeur par défaut est 1.3, ce qui signifie qu'elles 
567 sont 1,3 fois plus épaisses que les lignes de la portée).  Dans la mesure où nous avons
568 indiqué @code{Staff} comme contexte, ce réglage ne s'appliquera qu'à la portée courante ;
569 les autres portées demeureront intactes.
570
571
572 @lilypond[quote,verbatim,relative=2,fragment]
573 c4
574 \override Staff.Stem #'thickness = #4.0
575 c4
576 c4
577 c4
578 @end lilypond
579
580 La commande @code{\override} modifie donc la définition de l'objet @code{Stem}
581 dans le contexte @code{Staff} ; toutes les hampes qui suivent seront affectées.
582
583 Tout comme avec la commande @code{\set}, l'argument @var{contexte} peut être omis, auquel
584 cas le contexte par défaut (ici, @code{Voice}) sera employé.  La commande @code{\once}
585 permet de n'appliquer la modification qu'une seule fois.
586
587 @lilypond[quote,fragment,verbatim,relative=2]
588 c4
589 \once \override Stem #'thickness = #4.0
590 c4
591 c4
592 @end lilypond
593
594 La commande @code{\override} doit être entrée @emph{avant} l'objet concerné.
595 Ainsi, lorsque l'on veut altérer un objet qui se prolonge, tel qu'une liaison,
596 une ligature ou tout autre objet dit @emph{Spanner}, la commande @code{\override}
597 doit être saisie avant que l'objet soit créé.
598
599 @lilypond[quote,fragment,verbatim,relative=2]
600 \override Slur #'thickness = #3.0
601 c8[( c
602 \override Beam #'thickness = #0.6
603 c8 c])
604 @end lilypond
605
606 @noindent
607 Dans cet exemple, la liaison (@emph{Slur}) est épaissie, mais non la ligature
608 (@emph{Beam}).  En effet, le code qui lui est relatif n'a pas été inséré avant le début de
609 la ligature, et demeure donc sans effet.
610
611 De même que la commande @code{\unset}, la commande @code{\revert} défait
612 ce qui a été fait par une commande @code{\override}.  Tout comme avec @code{\unset},
613 elle ne peut annuler que les réglages effectués dans le même contexte.
614 Ainsi dans l'exemple suivant, la commande @code{\revert} est sans effet.
615
616 @example
617 \override Voice.Stem #'thickness = #4.0
618 \revert Staff.Stem #'thickness
619 @end example
620
621 Il existe, à l'intérieur même de certaines propriétés, des options que l'on
622 nomme @q{sous-propriétés}.  La syntaxe est alors
623
624 @c leave this as a long long
625 @example
626 \override @var{contexte}.@var{objet} #'@var{propriété} #'@var{sous-propriété} = #@var{valeur}
627 @end example
628
629 @noindent
630 Ainsi, par exemple :
631
632 @example
633 \override Stem #'details #'beamed-lengths = #'(4 4 3)
634 @end example
635
636
637 @seealso
638
639 Référence du programme : @rinternals{OverrideProperty}, @rinternals{RevertProperty},
640 @rinternals{PropertySet}, @rinternals{Backend}, et
641 @rinternals{All layout objects}.
642
643
644 @knownissues
645
646 La sous-couche Scheme ne vérifie pas la saisie des propriétés de façon
647 très stricte.  Des références cycliques dans des valeurs Scheme peuvent
648 de ce fait interrompre, ou faire planter le programme -- ou bien les deux.
649
650
651 @node Changing context default settings
652 @subsection Changing context default settings
653
654 Les réglages montrés dans les sous-sections @ref{Changing context
655 properties on the fly}, @ref{Modifying context plug-ins} et
656 @ref{Layout tunings within contexts} peuvent également être saisis indépendamment
657 de la musique dans le bloc @code{\layout}, au moyen de la commande @code{\context} :
658
659 @example
660 \layout @{
661   @dots{}
662   \context @{
663     \Staff
664
665     \set fontSize = #-2
666     \override Stem #'thickness = #4.0
667     \remove "Time_signature_engraver"
668   @}
669 @}
670 @end example
671
672 Le raccourci @code{\Staff} invoque les définitions inhérentes au contexte
673 @code{Staff}, de façon à ce qu'elles puissent être modifiées.
674
675 Les lignes suivantes affecteront toutes les portées (tous les contextes @code{Staff})
676 dans la partition.
677 @example
678 \set fontSize = #-2
679 \override Stem #'thickness = #4.0
680 \remove "Time_signature_engraver"
681 @end example
682
683 @noindent
684 Les autres contextes peuvent être modifiés de même manière.
685
686 La commande @code{\set}, dans le bloc @code{\layout}, est facultative ; aussi
687 les lignes suivantes produiront-elles le même effet.
688
689 @example
690 \context @{
691   @dots{}
692   fontSize = #-2
693 @}
694 @end example
695
696
697 @knownissues
698
699 Il est impossible de stocker des modifications de contexte dans un identificateur.
700
701 Le raccourci @code{\RemoveEmptyStaffContext} détruit tous les réglages
702 du contexte @code{\Staff}.  Pour modifier des propriétés de portées gouvernées
703 par @code{\RemoveEmptyStaffContext}, il faut le faire impérativement @emph{après}
704 avoir invoqué @code{\RemoveEmptyStaffContext} :
705
706 @example
707 \layout @{
708   \context @{
709     \RemoveEmptyStaffContext
710
711     \override Stem #'thickness = #4.0
712   @}
713 @}
714 @end example
715
716
717 @node Defining new contexts
718 @subsection Defining new contexts
719
720 Les contextes tels que @code{Staff} ou @code{Voice} sont faits
721 de briques de constructions empilées.  En combinant divers graveurs,
722 il est possible de créer de nouveaux types de contextes.
723
724 Dans l'exemple suivant, on construit, de zéro, un nouveau contexte très
725 semblable à @code{Voice}, mais qui n'imprime que des têtes de notes en forme
726 de barres obliques au centre de la portée.  Un tel contexte, par exemple, peut
727 servir à indiquer un passage improvisé dans un morceau de jazz.
728
729 @c KEEP LY
730 @lilypond[quote,ragged-right]
731 \layout { \context {
732   \name ImproVoice
733   \type "Engraver_group"
734   \consists "Note_heads_engraver"
735   \consists "Text_engraver"
736   \consists Pitch_squash_engraver
737   squashedPosition = #0
738   \override NoteHead #'style = #'slash
739   \override Stem #'transparent = ##t
740   \alias Voice
741 }
742 \context { \Staff
743   \accepts "ImproVoice"
744 }}
745
746 \relative c'' {
747   a4 d8 bes8 \new ImproVoice { c4^"ad lib" c
748    c4 c^"dévêtez-vous" c_"tout en jouant :)" c }
749   a1
750 }
751 @end lilypond
752
753
754 On a rassemblé les réglages dans un bloc @code{\context}, lui-même dans
755 le bloc @code{\layout} :
756
757 @example
758 \layout @{
759   \context @{
760     @dots{}
761   @}
762 @}
763 @end example
764
765 En lieu et place des points (@dots{}), voici les éléments à saisir :
766
767 @itemize @bullet
768 @item Tout d'abord, il convient de donner un nom @code{\name} à notre nouveau contexte :
769
770 @example
771 \name ImproVoice
772 @end example
773
774 @item Comme il est très semblable à @code{Voice}, nous souhaitons que toutes les
775 commandes associées au @code{Voice} déjà existant, restent valables.  D'où nécessité
776 de la commande @code{\alias}, qui va l'associer au contexte @code{Voice} :
777
778 @example
779 \alias Voice
780 @end example
781
782 @item Ce contexte doit pouvoir imprimer des notes, et des indications textuelles ;
783 on ajoute donc les graveurs appropriés.
784
785 @example
786 \consists Note_heads_engraver
787 \consists Text_engraver
788 @end example
789
790 @item Cependant, on veut que les notes s'affichent toutes au centre de la portée :
791
792 @example
793 \consists Pitch_squash_engraver
794 squashedPosition = #0
795 @end example
796
797 @noindent
798 Le graveur @rinternals{Pitch_squash_engraver} intercepte les notes créées par 
799 @rinternals{Note_heads_engraver}, et les @q{écrase} pour qu'elles aient toutes la
800 même position verticale, définie par @code{squashedPosition} : ici il s'agit de la
801 valeur@tie{}@code{0}, c'est-à-dire la ligne du milieu.
802
803 @item On veut que les notes aient la forme d'une barre oblique, sans aucune hampe :
804
805 @example
806 \override NoteHead #'style = #'slash
807 \override Stem #'transparent = ##t
808 @end example
809
810 @item Afin que tous ces graveurs puissent travailler de concert, on leur adjoint un
811 sous-programme spécial, introduit par la commande @code{\type} : il s'agit de
812 @rinternals{Engraver_group},
813
814 @example
815 \type "Engraver_group"
816 @end example
817
818 @end itemize
819
820 Récapitulons -- on se retrouve avec le bloc suivant :
821
822 @example
823 \context @{
824   \name ImproVoice
825   \type "Engraver_group"
826   \consists "Note_heads_engraver"
827   \consists "Text_engraver"
828   \consists Pitch_squash_engraver
829   squashedPosition = #0
830   \override NoteHead #'style = #'slash
831   \override Stem #'transparent = ##t
832   \alias Voice
833 @}
834 @end example
835
836 @funindex \accepts
837 Ce n'est pas tout.  En effet, on veut intégrer le nouveau contexte
838 @code{ImproVoice} dans la hiérarchie des contextes.  Tout comme le
839 contexte @code{Voice}, sa place est au sein du contexte @code{Staff}.
840 Nous allons donc modifier le contexte @code{Staff},
841 au moyen de la commande @code{\accepts} :
842
843 @example
844 \context @{
845   \Staff
846   \accepts ImproVoice
847 @}
848 @end example
849
850 @funindex \denies
851 Le contraire de @code{\accepts} est @code{\denies},
852 qui est parfois utile lorsque l'on recycle des définitions de
853 contextes déjà existantes.
854
855 Enfin, tout cela doit prendre place dans le bloc @code{\layout},
856 comme suit :
857
858 @example
859 \layout @{
860   \context @{
861     \name ImproVoice
862     @dots{}
863   @}
864   \context @{
865     \Staff
866     \accepts "ImproVoice"
867   @}
868 @}
869 @end example
870
871 On peut alors saisir la musique, comme dans l'exemple plus haut :
872
873 @example
874 \relative c'' @{
875   a4 d8 bes8
876   \new ImproVoice @{
877     c4^"ad lib" c
878     c4 c^"dévêtez-vous"
879     c c_"tout en jouant :)"
880   @}
881   a1
882 @}
883 @end example
884
885
886 @node Aligning contexts
887 @subsection Aligning contexts
888
889 Il est possible d'aligner verticalement chaque nouveau contexte,
890 en-dessous ou au-dessus, par exemple dans le cas de musique vocale
891 (@rlearning{Vocal ensembles}) ou d'@qq{ossias}.
892
893 @cindex ossia
894 @findex alignAboveContext
895 @findex alignBelowContext
896
897 @lilypond[quote,ragged-right]
898 ossia = { f4 f f f }
899 \score{
900   \relative c' \new Staff = "main" {
901     c4 c c c
902     <<
903       \new Staff \with {alignAboveContext=main} \ossia
904       { d8 f d f d f d f }
905     >>
906   }
907 }
908 @end lilypond
909
910
911 @node Vertical grouping of grobs
912 @subsection Vertical grouping of grobs
913
914 Les objets @code{VerticalAlignment} et @code{VerticalAxisGroup}
915 travaillent de concert.  Comme leurs noms anglais l'indiquent,
916 @code{VerticalAxisGroup} regroupe différents objets tels que les portées
917 (@code{Staff}), les paroles (@code{Lyrics}) et ainsi de suite ; puis
918 @code{VerticalAlignment} synchronise verticalement ces différents groupes.
919 En général, il n'y a qu'un seul @code{VerticalAlignment} pour l'ensemble
920 de la partition, mais chaque contexte @code{Staff}, @code{Lyrics}, etc.
921 possède son propre @code{VerticalAxisGroup}.
922
923
924 @node The override command
925 @section The @code{\override} command
926
927 La commande @code{\override} permet de modifier la mise en page
928 en détail.  Examinons son utilisation concrètementet dans les détails.
929 La syntaxe de cette commande ressemble généralement à :
930
931 @example
932 \override @var{contexte}.@var{objet} #'@var{propriété} = #@var{valeur}
933 @end example
934
935 La propriété @var{propriété} de l'objet @var{objet}, appartenant au contexte
936 @var{contexte}, se voit ainsi attribuer la valeur @var{valeur}.
937
938 @menu
939 * Constructing a tweak::        
940 * Navigating the program reference::  
941 * Layout interfaces::           
942 * Determining the grob property::  
943 * The tweak command::           
944 * Using Scheme code instead of tweak::  
945 * set versus override::         
946 * Difficult tweaks::            
947 @end menu
948
949
950
951 @node Constructing a tweak
952 @subsection Constructing a tweak
953
954 Les commandes permettant de modifier l'apparence de la partition
955 ressemblent en général à
956
957 @example
958 \override Voice.Stem #'thickness = #3.0
959 @end example
960
961 @noindent
962 Pour élaborer un réglage de ce type, on a besoin de connaître précisément :
963
964 @itemize
965 @item le contexte : ici @code{Voice} (la voix).
966 @item l'objet à affecter : ici @code{Stem} (les hampes).
967 @item la propriété à modifier : ici @code{thickness} (l'épaisseur du trait).
968 @item la valeur désirée : ici @code{3.0} (par défaut, elle est de 1.3).
969 @end itemize
970
971 Certaines @q{sous-propriétés} sont parfois contenues dans une propriété.
972 La commande devient alors :
973
974 @example
975 \override Stem #'details #'beamed-lengths = #'(4 4 3)
976 @end example
977
978 @cindex documentation exhaustive
979 @cindex trouver des objets graphiques
980 @cindex objets graphiques, description
981 @cindex régler
982 @funindex \override
983
984 Pour bien des propriétés, quel que soit le type de valeur requise,
985 attribuer la valeur @q{faux} (@code{##f} en Scheme) reviendra à désactiver
986 complètement l'action de la propriété qui se trouve ainsi purement
987 ignorée par LilyPond.  Cela peut s'avérer fort utile pour des propriétés
988 causant des désagréments.
989
990 @c such announcements are to be avoided -vv
991 @ignore
992 We demonstrate how to glean this information from the notation manual
993 and the program reference.
994 @end ignore
995
996
997
998 @node Navigating the program reference
999 @subsection Navigating the program reference
1000
1001 Comment, par exemple, déplacer le doigté dans le fragment suivant ?
1002
1003 @lilypond[quote,fragment,relative=2,verbatim]
1004 c-2
1005 \stemUp
1006 f
1007 @end lilypond
1008
1009 Sur la page de la documentation relative aux doigtés, c'est-à-dire
1010 @ref{Fingering instructions}, se trouve l'indication suivante :
1011
1012 @quotation
1013 @seealso
1014
1015 Référence du programme : @rinternals{Fingering}.
1016
1017 @end quotation
1018
1019
1020 @c  outdated info; probably will delete.
1021 @ignore
1022 This fragment points to two parts of the program reference: a page
1023 on @code{FingerEvent} and one on @code{Fingering}.
1024
1025 The page on @code{FingerEvent} describes the properties of the music
1026 expression for the input @code{-2}.  The page contains many links
1027 forward.  For example, it says
1028
1029 @quotation
1030 Accepted by: @rinternals{Fingering_engraver},
1031 @end quotation
1032
1033 @noindent
1034 That link brings us to the documentation for the Engraver, the
1035 plug-in, which says
1036
1037 @quotation
1038 This engraver creates the following layout objects: @rinternals{Fingering}.
1039 @end quotation
1040
1041 In other words, once the @code{FingerEvent}s are interpreted, the
1042 @code{Fingering_engraver} plug-in will process them.
1043 @end ignore
1044
1045 @ignore
1046 @c  I can't figure out what this is supposed to mean.  -gp
1047
1048 The @code{Fingering_engraver} is also listed to create
1049 @rinternals{Fingering} objects,
1050
1051 @c  old info?  it doesn't make any sense to me with our current docs.
1052 This is also the
1053 second bit of information listed under @b{See also} in the Notation
1054 manual.
1055 @end ignore
1056
1057 @ifnothtml
1058 Ladite référence est disponible au format HTML, ce qui rend la navigation bien
1059 plus aisée.  Il est possible soit de la lire en ligne, soit de la télécharger
1060 dans ce format.  La démarche présentée ici sera plus difficle à comprendre
1061 dans un document au format PDF.
1062 @end ifnothtml
1063
1064 Suivons le lien @rinternals{Fingering}.  En haut de la nouvelle page,
1065 on peut lire
1066
1067 @quotation
1068 Fingering objects are created by: @rinternals{Fingering_engraver} and
1069 @rinternals{New_fingering_engraver}.
1070 @end quotation
1071
1072 En d'autres termes, @emph{Les indications de doigtés} 
1073 (@code{Fingering} en anglais) @emph{sont créées par les graveurs
1074 @rinternals{Fingering_engraver} et @rinternals{New_fingering_engraver}.}
1075
1076 En suivant derechef les liens propres à la référence du programme, on suit en fait
1077 le cheminement qui aboutit à la création de la partition :
1078
1079 @itemize @bullet
1080
1081 @item @rinternals{Fingering}:
1082 @rinternals{Fingering} objects are created by:
1083 @rinternals{Fingering_engraver}
1084
1085 @item @rinternals{Fingering_engraver}:
1086 Music types accepted: @rinternals{fingering-event}
1087
1088 @item @rinternals{fingering-event}:
1089 Music event type @code{fingering-event} is in Music expressions named
1090 @rinternals{FingerEvent}
1091 @end itemize
1092
1093 Ce cheminement se produit, bien sûr, en sens inverse : nous sommes ici partis
1094 du résultat, et avons abouti aux évènements (en anglais @q{Events}) engendrés
1095 par le fichier d'entrée.  L'inverse est également possible : on peut partir d'un
1096 évènement, et suivre le cheminement de LilyPond qui aboutit à la création d'un 
1097 ou plusieurs objets graphiques.
1098
1099 La référence du programme peut également se parcourir comme un document normal.
1100 On y trouve des chapitres tels que
1101 @ifhtml
1102 @rinternals{Music definitions},
1103 @end ifhtml
1104 @ifnothtml
1105 @code{Music definitions}
1106 @end ifnothtml
1107 @rinternals{Translation}, ou encore @rinternals{Backend}.  Chaque chapitre
1108 recense toutes les définitions employées, et les propriétés sujettes à 
1109 ajustements.
1110
1111 @c -- what about adding a link to the glossary here ? -vv
1112 @ignore
1113 La Référence du programme n'est pas traduite en français -- notamment du fait
1114 qu'elle est en évolution constante, tout comme LilyPond.  En revanche, les termes
1115 musicaux font l'objet d'un @commentfairelelien{glossaire} fort utile pour les utilisateurs
1116 francophones.
1117 @end ignore
1118
1119
1120 @node Layout interfaces
1121 @subsection Layout interfaces
1122
1123 @cindex interfaces de rendu
1124 @cindex rendu, interfaces de
1125 @cindex objets graphiques
1126
1127 Tous les éléments de notation sont considérés comme des objets graphiques
1128 (en anglais @q{Graphical Object}, d'où le diminutif @emph{Grob}).
1129 Chaque objet est doté d'un certain nombre de propriétés (l'épaisseur du trait,
1130 l'orientation, etc.), et lié à d'autres objets.
1131 Le fonctionnement de ces objets est décrit en détail dans @rinternals{grob-interface}.
1132
1133 Prenons l'exemple des doigtés (en anglais @q{Fingering}).
1134 La page @code{Fingering} de la Référence du programme établit une liste de définitions
1135 propres à ce type d'objets :
1136
1137 @quotation
1138 @code{padding} (dimension, in staff space):
1139
1140 @code{0.5}
1141 @end quotation
1142
1143 @noindent
1144 Ce qui signifie que les doigtés doivent être maintenus à une certaine distance (@emph{padding})
1145 des notes : 0,5 unités @emph{staff-space} (espace de portée).
1146
1147
1148 Chaque objet peut avoir plusieurs attributs, en tant qu'élément typographique
1149 ou musical.  Ainsi, un doigté (objet @q{Fingering}) possède les attributs suivants :
1150
1151
1152 @itemize @bullet
1153 @item
1154 Sa taille ne dépend pas de l'espacement horizontal, contrairement aux liaisons ou ligatures.
1155
1156 @item
1157 C'est du texte -- un texte vraiment court, certes.
1158
1159 @item
1160 Ce texte est imprimé au moyen d'une fonte, contrairement aux liaisons ou ligatures.
1161
1162 @item
1163 Sur l'axe horizontal, le centre de ce symbole doit être aligné avec le centre de la note.
1164
1165 @item
1166 Sur l'axe vertical, le symbole doit être proche de la note et de la portée.
1167
1168 @item
1169 Sur l'axe vertical encore, il doit également s'ordonner avec les éventuels
1170 autres symboles, ponctuations, ou éléments textuels.
1171 @end itemize
1172
1173 Faire appliquer ces différents attributs est le rôle des @emph{interfaces},
1174 que l'on trouve en bas de la page @rinternals{Fingering}.
1175
1176 @quotation
1177 This object supports the following interfaces:
1178 @rinternals{item-interface},
1179 @rinternals{self-alignment-interface},
1180 @rinternals{side-position-interface}, @rinternals{text-interface},
1181 @rinternals{text-script-interface}, @rinternals{font-interface},
1182 @rinternals{finger-interface}, and @rinternals{grob-interface}.
1183 @end quotation
1184
1185 @noindent
1186 En français,
1187
1188 @quotation
1189 Cet objet admet les interfaces suivantes :
1190 @end quotation
1191
1192 Suit la liste des interfaces en question, présentées comme autant de liens,
1193 qui conduisent sur les pages dédiées à chacune d'entre elles.
1194 Chaque interface est dotée d'un certain nombre de propriétés, dont certaines
1195 peuvent être modifiées, et d'autres non (les @q{Internal properties}, ou 
1196 propriétés internes).
1197
1198 Pour aller encore plus loin, plutôt que de simplement parler de l'objet
1199 @code{Fingering}, ce qui ne nous avance pas à grand chose, on peut aller explorer
1200 son âme même, dans les fichiers source de LilyPond (voir
1201 @rlearning{Other sources of information}), en l'occurence le fichier
1202 @file{scm/@/define@/-grobs@/.scm} :
1203
1204 @example
1205 (Fingering
1206   . ((padding . 0.5)
1207      (avoid-slur . around)
1208      (slur-padding . 0.2)
1209      (staff-padding . 0.5)
1210      (self-alignment-X . 0)
1211      (self-alignment-Y . 0)
1212      (script-priority . 100)
1213      (stencil . ,ly:text-interface::print)
1214      (direction . ,ly:script-interface::calc-direction)
1215      (font-encoding . fetaNumber)
1216      (font-size . -5)           ; don't overlap when next to heads.
1217      (meta . ((class . Item)
1218      (interfaces . (finger-interface
1219                     font-interface
1220                     text-script-interface
1221                     text-interface
1222                     side-position-interface
1223                     self-alignment-interface
1224                     item-interface))))))
1225 @end example
1226
1227 @noindent
1228 @dots{}où l'on découvre que l'objet @code{Fingering} n'est rien de plus qu'un
1229 amas de variables et de réglages.  La page de la Référence du programme est
1230 en fait directement engendrée par cette définition.
1231
1232 @node Determining the grob property
1233 @subsection Determining the grob property
1234
1235 Nous voulions changer la position du chiffre @b{2} dans le fragment suivant :
1236
1237 @lilypond[quote,fragment,relative=2,verbatim]
1238 c-2
1239 \stemUp
1240 f
1241 @end lilypond
1242
1243 Dans la mesure où le @b{2} est placé, verticalement, à proximité de la note qui lui
1244 correspond, nous allons devoir trouver l'interface en charge de ce placement, qui se
1245 trouve être @code{side-position-interface}.  Sur la page de cette interface, on
1246 peut lire :
1247
1248 @quotation
1249 @code{side-position-interface}
1250
1251 Position a victim object (this one) next to other objects (the
1252 support).  The property @code{direction} signifies where to put the
1253 victim object relative to the support (left or right, up or down?)
1254 @end quotation
1255
1256 @noindent
1257 Ce qui signifie
1258 @quotation
1259 @code{side-position-interface}
1260
1261 Placer l'objet affecté à proximité d'autres objets.  La propriété
1262 @code{direction} indique où placer l'objet (à droite ou à gauche,
1263 en haut ou en bas).
1264 @end quotation
1265
1266 @cindex padding
1267 @noindent
1268 En-dessous de cette description se trouve décrite la variable @code{padding} :
1269
1270 @quotation
1271 @table @code
1272 @item padding
1273 (dimension, in staff space)
1274
1275 Add this much extra space between objects that are next to each other.
1276 @end table
1277 @end quotation
1278
1279 @noindent
1280 Ce qui signifie
1281 @quotation 
1282 Ajouter tel espace supplémentaire entre des objets proches les uns des
1283 autres.
1284 @end quotation
1285
1286 @noindent
1287 En augmentant la valeur de @code{padding}, on peut donc éloigner le doigté de la
1288 note.  La commande suivante insère trois unités d'espace vide entre la note et le doigté :
1289
1290 @example
1291 \once \override Voice.Fingering #'padding = #3
1292 @end example
1293
1294 En ajoutant cette commande avant la création du doigté (de l'objet @q{Fingering}),
1295 donc avant @code{c2}, on obtient le résultat suivant :
1296
1297 @lilypond[quote,relative=2,fragment,verbatim]
1298 \once \override Voice.Fingering #'padding = #3
1299 c-2
1300 \stemUp
1301 f
1302 @end lilypond
1303
1304
1305 Dans le cas présent, le réglage intervient dans le contexte @code{Voice},
1306 ce qui pouvait également se déduire de la Référence du programme, où la page
1307 du graveur @rinternals{Fingering_engraver} indique :
1308
1309 @quotation
1310 Fingering_engraver is part of contexts: @dots{} @rinternals{Voice}
1311 @end quotation
1312
1313 @noindent
1314 Ce qui signifie
1315 @quotation
1316 Le graveur Fingering_engraver fait partie des contextes : @dots{} @rinternals{Voice}
1317 @end quotation
1318
1319
1320 @node The tweak command
1321 @subsection The @code{\tweak} command
1322
1323 @funindex \tweak
1324
1325 Dans certains cas, on peut passer par un raccourci pour arranger les
1326 objets graphiques.  Lorsqu'un objet est directement engendré par un élément distinct
1327 du fichier source, on peut utiliser la commande @code{\tweak}.
1328
1329 Dans l'accord suivant, les notes sont modifiées une par une :
1330
1331 @lilypond[relative=2,fragment,verbatim,ragged-right]
1332 <
1333   c
1334   \tweak #'color #red d
1335   g
1336   \tweak #'duration-log #1  a
1337 >4-\tweak #'padding #10 -.
1338 @end lilypond
1339
1340 Comme on peut le voir, les propriétés sont ici modifiées directement
1341 en même temps que les objets sont saisis.  Il n'est plus besoin de spécifier ni
1342 le nom de l'objet (@emph{grob}), ni le contexte dans lequel cela doit s'appliquer.
1343
1344 Ce procédé ne marche que pour des objets directement liés aux évènements 
1345 (@rinternals{Event}) du fichier source.  Par exemple :
1346
1347 @itemize @bullet
1348 @item Les têtes de notes au sein d'un accord, qui sont directement engendrées par 
1349 les hauteurs indiquées
1350 @item Les signes d'articulation, engendrés par les indications de ponctuation.
1351 @end itemize
1352
1353 En revanche, les hampes ou les altérations sont engendrées par les têtes de notes,
1354 et non par des évènements dans le fichier source.  De même pour les clés, qui ne
1355 sont pas directement engendrées par le fichier source, mais plutôt par le
1356 changement d'une propriété interne.
1357
1358 En fait, très peu d'objets passent @emph{directement} du code source à la partition.
1359 Une note toute simple, par exemple @code{c4}, fait l'objet d'un traitement et n'est donc
1360 pas directement rendue ; c'est pourquoi le code suivant ne sera d'aucun effet :
1361
1362 @example
1363 \tweak #'color #red c4
1364 @end example
1365
1366 @noindent
1367 Voir pour plus de détails @ref{Displaying music expressions}.
1368
1369
1370 @node Using Scheme code instead of tweak
1371 @subsection Using Scheme code instead of @code{\tweak}
1372
1373 L'inconvénient principal de la commande @code{\tweak} est la rigidité de sa
1374 syntaxe.  Par exemple, le code suivant produit une erreur.
1375
1376 @example
1377 F = \tweak #'font-size #-3 -\flageolet
1378
1379 \relative c'' @{
1380   c4^\F c4_\F
1381 @}
1382 @end example
1383
1384 @noindent
1385 En d'autres termes, @code{\tweak} ne se comporte pas comme une articulation :
1386 il ne peut notamment pas être accolé avec les symboles @samp{^} ou @samp{_}.
1387
1388 C'est en se servant du langage Scheme que l'on peut résoudre ce problème.
1389 Dans cet exemple, on a recours aux méthodes décrites dans @ref{Adding 
1390 articulation to notes (example)}, en particulier quant à l'emploi de
1391 @code{\displayMusic}.
1392
1393 @example
1394 F = #(let ((m (make-music 'ArticulationEvent
1395                           'articulation-type "flageolet")))
1396        (set! (ly:music-property m 'tweaks)
1397              (acons 'font-size -3
1398                     (ly:music-property m 'tweaks)))
1399        m)
1400  
1401 \relative c'' @{
1402   c4^\F c4_\F
1403 @}
1404 @end example
1405
1406 @noindent
1407 Ici les propriétés @code{tweak} de l'objet flageolet nommé
1408 @samp{m} (créé au moyen de @code{make-music}) sont extraites par
1409 @code{ly:music-property}, une nouvelle valeur de la taille de fonte
1410 est ajoutée à la liste de ses propriétés (grâce à la fonction Scheme
1411 @code{acons}), et le résultat de cette opération est renvoyé par @code{set!}.
1412 Le dernier élément, dans ce bloc @code{let}, est la valeur finale de
1413 @samp{m} lui-même.
1414
1415
1416 @node set versus override
1417 @subsection @code{\set} vs. @code{\override}
1418
1419 Si les propriétés peuvent être modifiées de deux façons, par les commandes
1420 @code{\set} et @code{\override}, c'est qu'il y a deux types de propriétés.
1421
1422 Les contextes peuvent avoir des propriétés, dont les noms commencent par une
1423 minuscule puis comprennent une ou plusieurs majuscules (de style
1424 @code{totoTutu}).  Elles ont surtout trait
1425 à la notation des éléments musicaux : par exemple, @code{localKeySignature} permet
1426 de choisir s'il faut ou non imprimer une altération, ou @code{measurePosition} permet
1427 de choisir quand il faut imprimer une barre de mesure.  Ces propriétés de contextes
1428 sont appelées à changer au long de l'interprétation de la partition :
1429 @code{measurePosition} en est un exemple évident.  Ces propriétés doivent
1430 être modifiées avec la commande @code{\set}.
1431
1432 Il existe un type particulier de propriétés : les descriptions
1433 d'éléments.  Ces propriétés, dont les noms commencent par une majuscule, puis comprennent
1434 une ou plusieurs majuscules (de style @code{TotoTata}), contiennent les réglages
1435 @q{par défaut} pour les objets graphiques.  Ces réglages sont sous forme de liste Scheme ; on
1436 peut les consulter dans le fichier @file{scm/@/define@/-grobs@/.scm}.
1437 Les descriptions d'éléments doivent être modifiées avec la commande @code{\override}.
1438
1439 @code{\override} est en fait un raccourci :
1440
1441 @example
1442 \override @var{contexte}.@var{objet} #'@var{propriété} = #@var{valeur}
1443 @end example
1444
1445 @noindent
1446 est plus ou moins l'équivalent de
1447
1448 @c  leave this long line -gp
1449 @example
1450 \set @var{contexte}.@var{objet} #'@var{propriété} = #(cons (cons '@var{propriété} @var{valeur}) <valeur précédente de @var{contexte})
1451 @end example
1452
1453 La valeur de @code{context} (la liste Scheme, ou @q{alist}) sert à initialiser
1454 les propriétés des objets un par un.  Les objets eux-même ont leurs propriétés,
1455 dont les noms, dans la tradition du langage Scheme, comprennent un trait d'union
1456 (@code{toto-titi}).  Ces propriétés internes changent constamment au cours de la mise
1457 en page : en fait, la gravure d'une page n'est autre que le calcul de toutes
1458 ces propriétés, au moyen de fonctions de rappel.
1459
1460 La propriété @code{fontSize} est une exception : c'est un raccourci, qui équivaudrait
1461 à saisir @code{\override @dots{} #'font-size} pour tous les objets
1462 textuels.  Dans la mesure où il s'agit d'une manipulation très
1463 courante, une propriété spéciale a été créée.  Elle doit
1464 être modifiée avec la commande @code{\set}.
1465
1466
1467 @node Difficult tweaks
1468 @subsection Difficult tweaks
1469
1470 Certains réglages sont plus délicats que d'autres.
1471
1472 @itemize @bullet
1473
1474
1475 @item
1476 L'un d'entre eux est l'apparence des objets dits @q{spanner}, qui s'étendent 
1477 horizontalement, tels que les liaisons.  Si, en principe, un seul de ces objets
1478 est créé à la fois et peut donc être modifié de façon habituelle, lorsque ces
1479 objets doivent enjamber un changement de ligne, ils sont dupliqués au début
1480 du ou des systèmes suivants.  Comme ces objets sont des clones de l'objet d'origine,
1481 ils en héritent toutes les propriétés, y compris les éventuelles commandes @code{\override}.
1482
1483
1484 En d'autres termes, une commande @code{\override} affecte toujours les deux extrémités
1485 d'un objet @q{spanner}.  Pour ne modifier que la partie précédant ou suivant le changement
1486 de ligne, il faut intervenir directement dans le processus de mise en page.  
1487 La fonction de rappel @code{after-line-breaking} contient toute l'opération Scheme
1488 effectuée lorsque les sauts de lignes ont été déterminés, et que des objets graphiques
1489 ont été divisés sur des systèmes différents.
1490
1491 Dans l'exemple suivant, on définit une nouvelle opération nommée
1492 @code{my-callback}.  Cette opération
1493
1494 @itemize @bullet
1495 @item
1496 détermine si l'objet a été divisé à l'occasion d'un changement de ligne
1497 @item
1498 si oui, recherche les différents morceaux de l'objet
1499 @item
1500 vérifie si l'objet considéré est bien la deuxième moitié d'un objet divisé
1501 @item
1502 si oui, applique un espacement supplémentaire (@code{extra-offset}).
1503 @end itemize
1504
1505 On ajoute cette procédure à l'objet @rinternals{Tie} (liaison de tenue),
1506 de façon à ce que le deuxième morceau d'une liaison divisée soit rehaussé.
1507
1508 @c KEEP LY
1509 @lilypond[quote,verbatim,ragged-right]
1510 #(define (my-callback grob)
1511   (let* (
1512          ; l'objet a-t-il été divisé ?
1513          (orig (ly:grob-original grob))
1514
1515          ; si oui, rechercher les morceaux frères (siblings)
1516          (siblings (if (ly:grob? orig)
1517                      (ly:spanner-broken-into orig) '() )))
1518
1519    (if (and (>= (length siblings) 2)
1520              (eq? (car (last-pair siblings)) grob))
1521      (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1522
1523 \relative c'' {
1524   \override Tie #'after-line-breaking =
1525   #my-callback
1526   c1 ~ \break c2 ~ c
1527 }
1528 @end lilypond
1529
1530 @noindent
1531 Lorsque cette astuce va être appliquée, notre nouvelle fonction de rappel
1532 @code{after-line-breaking} devra également appeler celle d'origine
1533 (@code{after-line-breaking}), si elle existe.
1534 Ainsi, pour l'utiliser dans le cas d'un crescendo (objet @code{Hairpin}),
1535 il faudra appeler également @code{ly:hairpin::after-line-breaking}.
1536
1537
1538 @item Pour des raisons d'ordre technique, certains objets ne peuvent être modifiés par
1539 @code{\override}.  Parmi ceux-là, les objets @code{NonMusicalPaperColumn}
1540 et @code{PaperColumn}.  La commande @code{\overrideProperty} sert à les modifier, de
1541 façon similaire à @code{\once \override}, mais avec une syntaxe différente :
1542
1543 @example
1544 \overrideProperty
1545 #"Score.NonMusicalPaperColumn"  % Nom de l'objet
1546 #'line-break-system-details     % Nom de la propriété
1547 #'((next-padding . 20))         % valeur
1548 @end example
1549
1550 Notez cependant que la commande @code{\override} peut tout de même être appliquée
1551 à @code{NoteMusicalPaperColumn} et @code{PaperColumn} dans un bloc @code{\context}.
1552
1553 @end itemize