]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/fr/extending/programming-interface.itely
Doc-fr: updates EL, LM, NR, usage
[lilypond.git] / Documentation / fr / extending / programming-interface.itely
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
2
3 @ignore
4     Translation of GIT committish: 47c20999a49c7c77167089761a4dd964884e53fe
5
6     When revising a translation, copy the HEAD committish of the
7     version that you are working on.  For details, see the Contributors'
8     Guide, node Updating translation committishes..
9 @end ignore
10
11 @c \version "2.17.6"
12
13 @c Translators: Valentin Villenave, Jean-Charles Malahieude
14 @c Translation checkers: Gilles Thibault
15
16 @node Interfaces pour programmeurs
17 @chapter Interfaces pour programmeurs
18 @translationof Interfaces for programmers
19
20 Scheme permet de réaliser des affinages très pointus.  Si vous ne
21 connaissez rien de Scheme, vous en aurez un aperçu au travers de notre
22 @ref{Tutoriel Scheme}.
23
24 @menu
25 * Blocs de code LilyPond::
26 * Fonctions Scheme::
27 * Fonctions musicales::
28 * Fonctions événementielles::
29 * Fonctions pour markups::
30 * Contextes pour programmeurs::
31 * Fonctions de rappel::
32 * Code Scheme intégré::
33 * Retouches complexes::
34 @end menu
35
36
37 @node Blocs de code LilyPond
38 @section Blocs de code LilyPond
39 @translationof LilyPond code blocks
40
41 @cindex code, blocs LilyPond
42 @cindex LilyPond, bloc de code
43
44 @funindex #@{ @dots{} #@}
45 @funindex $
46 @funindex #
47
48 L'utilisation de Scheme pour créer des expressions musicales peut
49 s'avérer ardue, principalement à cause des imbrications et de la
50 longueur du code Scheme qui en résulte.  Dans le cas de tâches
51 simples, on peut toutefois contourner une partie du problème en
52 utilisant des blocs de code LilyPond, ce qui autorise la syntaxe
53 habituelle de LilyPond au sein même de Scheme.
54
55 Les blocs de code LilyPond ressemblent à
56
57 @example
58   #@{ @var{du code LilyPond} #@}
59 @end example
60
61 En voici un exemple basique :
62
63 @lilypond[verbatim,quote]
64 ritpp = #(define-event-function (parser location) ()
65   #{ ^"rit." \pp #}
66 )
67
68 { c'4 e'4\ritpp g'2 }
69 @end lilypond
70
71 Les blocs de code LilyPond peuvent s'utiliser partout où vous pouvez
72 écrire du code Scheme.  Le lecteur Scheme est en fait quelque peu adapté
73 pour accepter des blocs de code LilyPond ; il est capable de traiter des
74 expressions Scheme intégrées débutant par @code{$} ou @code{#}.
75
76 @cindex parser (fonction argument)
77 @cindex location
78
79 Le lecteur Scheme extrait le bloc de code LilyPond et déclenche un appel
80 à l'analyseur grammatical de LilyPond (le @code{parser}) qui réalise en
81 temps réel l'interprétation de ce bloc de code LilyPond.  Toute
82 expression Scheme imbriquée est exécutée dans l'environnement lexical du
83 bloc de code LilyPond, de telle sorte que vous avez accès aux variables
84 locales et aux paramètres de la fonction au moment même où le bloc de
85 code LilyPond est écrit.  Les variables définies dans d'autres modules
86 Scheme, tels ceux contenant les blocs @code{\header} ou @code{\layout},
87 ne sont pas accessibles en tant que variables Scheme (préfixées par
88 un @code{#}) mais en tant que variables LilyPond (préfixées par
89 un @code{\}).
90
91 Lorsque l'emplacement (@code{location} -- voir @ref{Fonctions Scheme})
92 fait référence à un endroit valide dans la source -- ce qui est en
93 général le cas au sein de fonctions musicales ou Scheme --, toute la
94 musique générée au sein de ce bloc de code voit son @code{origine}
95 établie à cet @emph{emplacement}.
96
97 Un bloc de code LilyPond peut contenir tout ce que vous pourriez mettre
98 à droite de l'assignation.  Par ailleurs, un bloc LilyPond vide
99 correspond à une expression fantôme, et un bloc LilyPond de multiples
100 événements musicaux sera transformé en une expression de musique
101 séquentielle.
102
103
104 @node Fonctions Scheme
105 @section Fonctions Scheme
106 @translationof Scheme functions
107
108 @cindex Scheme, fonctions (syntaxe LilyPond)
109
110 Les @emph{fonctions Scheme} sont des procédures Scheme chargées de créer
111 des expressions Scheme à partir de code rédigé selon la syntaxe de
112 LilyPond.  Elles peuvent être appelées en de nombreux endroits, à l'aide
113 d'un @code{#}, où spécifier une valeur en syntaxe Scheme est autorisé.
114 Bien que Scheme dispose de fonctions en propre, nous nous intéresserons,
115 au fil des paragraphes qui suivent, aux fonctions @emph{syntaxiques},
116 autrement dit des fonctions qui reçoivent des arguments libellés dans la
117 syntaxe de LilyPond.
118
119 @menu
120 * Définition de fonctions Scheme::
121 * Utilisation de fonctions Scheme::
122 * Fonctions Scheme fantômes::
123 @end menu
124
125 @node Définition de fonctions Scheme
126 @subsection Définition de fonctions Scheme
127 @translationof Scheme function definitions
128
129 @funindex define-scheme-function
130
131 D'une manière générale, une fonction Scheme se définit ainsi :
132
133 @example
134 fonction =
135 #(define-scheme-function
136      (parser location @var{arg1} @var{arg2} @dots{})
137      (@var{type1?} @var{type2?} @dots{})
138    @var{corps})
139 @end example
140
141 @noindent
142
143
144 @multitable @columnfractions .33 .66
145 @item @code{parser}
146 @tab doit être littéralement @code{parser}, de telle sorte que
147 l'analyseur grammatical puisse accéder aux blocs de code LilyPond
148 (@code{#@{}@dots{}@code{#@}}).
149
150 @item @code{location}
151 @tab doit être littéralement @code{location}, de telle sorte que soit
152 accessible l'emplacement de l'objet dans la source, aux fins de
153 transmettre aux messages d'erreur les fichier et numéro de ligne.
154
155 @item @code{@var{argN}}
156 @tab @var{n}ième argument
157
158 @item @code{@var{typeN?}}
159 @tab un @emph{type de prédicat} Scheme pour lequel @code{@var{argN}}
160 devra retourner @code{#t}.  Certains de ces prédicats, comme nous le
161 verrons plus loin, bénéficient d'un traitement particulier de la part du
162 @emph{parser}.  De même existe une forme spécifique --
163 @code{(@emph{prédicat?} @emph{default})} -- qui permet de fournir des
164 argument optionnels.  En l'absence d'argument réel au moment de l'appel
165 de la fonction, c'est la valeur par défaut qui lui sera substituée.  Les
166 valeurs par défaut sont évaluées dès l'apparition de la définition, y
167 compris dans le cas de blocs de code LilyPond ; vous devrez donc,
168 si ces valeurs par défaut ne peuvent être déterminées que plus tard,
169 mentionner une valeur spéciale que vous reconnaîtrez facilement.
170 Lorsque vous mentionnez un prédicat entre parenthèses sans toutefois
171 fournir sa valeur par défaut, celle-ci sera considérée comme étant
172 @code{#f}.  Les valeurs par défaut d'un @code{prédicat?} ne sont
173 vérifiées ni au moment de la définition, ni à l'exécution ; il est
174 de votre ressort de gérer les valeurs que vous spécifiez.  Une valeur
175 par défaut constituée d'une expression musicale est recopiée dès la
176 définition de @code{origin} vers le paramètre @code{location}.
177
178 @item @code{@var{corps}}
179 @tab une séquence de formules Scheme évaluées dans l'ordre, la dernière
180 servant de valeur de retour de la fonction. Il peut contenir des blocs
181 de code LilyPond, enchâssés dans des accolades et @emph{hashes} --
182 @w{@code{#@{@dots{}#@}}} -- comme indiqué à la rubrique
183 @ref{Blocs de code LilyPond}.  Au sein d'un bloc de code LilyPond, un
184 @code{#} permet de référencer des arguments de la fonction -- tel
185 @samp{#arg1} -- ou d'ouvrir une expression Scheme contenant les
186 arguments de la fonction -- par exemple @w{@samp{#(cons arg1 arg2)}}.
187 Dans le cas où une expression Scheme introduite par @code{#} ne vous
188 permet pas de parvenir à vos fins, vous pourriez devoir revenir à une
189 expression Scheme « immédiate » à l'aide d'un @code{$}, comme
190 @samp{$music}.
191
192 Lorsque votre fonction retourne une expression musicale, lui est
193 attribuée la valeur @code{origin}.
194 @end multitable
195
196 @noindent
197 Certains types de prédicat font l'objet d'un traitement spécial de la
198 part de l'analyseur grammatical, dans la mesure où il n'a aucun autre
199 moyen de reconnaître efficacement les arguments.  Il s'agit, à l'heure
200 actuelle, de @code{ly:pitch?} et @code{ly:duration?}.
201
202 Pour tous les autres prédicats, la recevabilité des arguments est
203 déterminée par un appel effectif au prédicat après que LilyPond les a
204 déjà converti en expression Scheme.  Par voie de conséquence, l'argument
205 peut tout à fait se libeller en syntaxe Scheme -- introduite par un
206 @code{#} ou en tant que résultat d'un appel à une fonction Scheme.  Par
207 ailleurs, LilyPond convertira en Scheme un certain nombre de
208 constructions purement LilyPond avant même d'en avoir vérifié le
209 prédicat.  C'est notamment le cas de la musique, des
210 @emph{postévénements}, des chaînes simples (avec ou sans guillemets),
211 des nombres, des @emph{markups} et listes de @emph{markups}, ainsi que
212 des blocs @emph{score}, @emph{book}, @emph{bookpart}, ou qui définissent
213 un contexte ou un format de sortie.
214
215 Il existe certaines formes d'expression, comme la plupart du temps où la
216 musique n'est pas bornée par des accolades, où LilyPond doit lire
217 au-delà de cette même expression afin d'en déterminer la fin.  Si une
218 telle expression devait, après évaluation du prédicat, faire l'objet
219 d'un argument optionnel, LilyPond n'aurait aucun moyen, à partir du
220 moment où il aura décidé que l'expression ne correspond pas au
221 paramètre, de @qq{revenir en arrière}.  C'est la raison pour laquelle
222 certaines formes musicales devraient être bornées par des accolades pour
223 que LilyPond puisse les reconnaître efficacement.  Il existe d'autres
224 situations pour lesquelles LilyPond lèvera toute ambiguïté grâce aux
225 fonctions de prédicat : un @samp{-3} est-il un @emph{postévénement}
226 de type doigté ou un nombre négatif@tie{}?  Un @code{"a" 4} en mode
227 paroles est-il une chaîne suivie d'un nombre ou bien un événement
228 syllabe de durée @code{4} ?  LilyPond répondra à ces questions
229 après consultation du prédicat.  Pour toutes ces raisons, nous vous
230 enjoignons à éviter d'utiliser des prédicats permissifs tel que
231 @code{scheme?}, dès que vous voulez les utiliser dans un but particulier
232 plutôt que dans une fonction de portée générale.
233
234 Les différents types des prédicat propres à LilyPond sont recensés à
235 l'annexe @ruser{Types de prédicats prédéfinis}.
236
237 @seealso
238 Manuel de notation :
239 @ruser{Types de prédicats prédéfinis}.
240
241 Fichiers d'initialisation :
242 @file{lily/music-scheme.cc},
243 @file{scm/c++.scm},
244 @file{scm/lily.scm}.
245
246
247 @node Utilisation de fonctions Scheme
248 @subsection Utilisation de fonctions Scheme
249 @translationof Scheme function usage
250
251 Vous pouvez appeler une fonction Scheme pratiquement partout où une
252 expression Scheme derrière un @code{#} peut prendre place.  Vous appelez
253 une fonction Scheme en faisant précéder son nom d'un @code{\}, et en le
254 faisant suivre de ses arguments.  Lorsqu'un prédicat d'argument
255 optionnel ne correspond pas à un argument, LilyPond l'ignore ainsi que
256 tous les arguments optionnels qui suivent, les remplaçant par leur
257 valeur par défaut, et @qq{sauvegarde} en tant que prochain argument
258 obligatoire l'argument qui ne correspondait pas.  Dans la mesure où
259 l'argument sauvegardé doit servir, les argument optionnels ne sont en
260 fait pas considérés comme optionnels, sauf à être suivis d'un argument
261 obligatoire.
262
263 Une exception cependant à cette règle : le fait de donner un
264 @code{\default} en tant qu'argument optionnel aura pour résultat que cet
265 argument et tous les autres arguments optionnels qui suivent seront
266 ignorés et remplacés par leur valeur par défaut.  Il en va de même
267 lorsqu'aucun argument obligatoire ne suit, du fait que @code{\default}
268 ne requiert pas de sauvegarde.  C'est d'ailleurs ainsi que fonctionnent
269 les commandes @code{mark} et @code{key}, qui retrouvent leur
270 comportement par défaut lorsque vous les faites suivre d'un
271 @code{\default}.
272
273 En plus de là où une expression Scheme est requise, il y a quelques
274 endroits où des expressions @code{#} sont acceptées et évaluées
275 uniquement pour leurs effets annexes.  Il s'agit, dans la plupart des
276 cas, d'endroits où une affectation serait tout à fait envisageable.
277
278 Dans la mesure où il n'est pas bon de renvoyer une valeur qui pourrait
279 être mal interprétée dans certains contextes, nous vous enjoignons à
280 utiliser des fonctions Scheme normales uniquement dans les cas où vous
281 renvoyez toujours une valeur utile, et une fonction fantôme -- voir
282 @ref{Fonctions Scheme fantômes} -- dans le cas contraire.
283
284
285 @node Fonctions Scheme fantômes
286 @subsection Fonctions Scheme fantômes
287 @translationof Void scheme functions
288
289 @cindex @emph{void}, fonction
290 @cindex fantôme, fonction
291
292 @funindex define-void-function
293 @funindex \void
294
295 Il arrive qu'une procédure soit exécutée pour réaliser une action, non
296 pour renvoyer une valeur.  Certains langages de programmation, tels
297 le C et Scheme, utilisent des fonctions dans les deux cas et se
298 débarrassent tout bonnement de la valeur renvoyée ; en règle
299 générale, il suffit que l'expression fasse office de déclaration, et
300 d'ignorer le résultat.  C'est futé, mais pas sans risque d'erreur :
301 la plupart des compilateurs C actuels déclenchent un avertissement si
302 l'on se débarrasse de certaines expressions non @emph{void}.  Pour de
303 nombreuses fonctions réalisant une action, les standards Scheme
304 déclarent que la valeur de retour est indéfinie.  L'interpréteur Guile
305 qu'utilise le Scheme de LilyPond dispose d'une valeur unique
306 @code{*unspecified*} qu'il retourne alors, en règle générale -- notamment
307 lorsqu'on utilise @code{set!} directement sur une variable -- mais
308 malheureusement pas toujours.
309
310 Une fonction LilyPond définie à l'aide de la clause
311 @code{define-void-function} vous apporte l'assurance que c'est cette
312 valeur spéciale -- la seule valeur qui satisfasse au prédicat
313 @code{void?} -- qui sera retournée.
314
315 @example
316 noPointAndClick =
317 #(define-void-function
318      (parser location)
319      ()
320    (ly:set-option 'point-and-click #f))
321 ...
322 \noPointAndClick   % desactive le "pointer-cliquer"
323 @end example
324
325 L'utilisation d'un préfixe @code{\void} permet ainsi d'évaluer une
326 expression pour ses effets annexes sans interprétation d'une quelconque
327 valeur de retour :
328
329 @example
330 \void #(hashq-set! une-table une-clé une-valeur)
331 @end example
332
333 Vous serez alors assuré que LilyPond ne tentera pas d'affecter un sens à
334 la valeur de retour, à quelque endroit qu'elle ressorte.  Ceci est aussi
335 opérationnel dans le cadre de fonctions musicales telles que
336 @code{\displayMusic}.
337
338
339 @node Fonctions musicales
340 @section Fonctions musicales
341 @translationof Music functions
342
343 @cindex musicale, fonction
344
345 Les @emph{fonctions musicales} sont des procédures Scheme capables de
346 créer automatiquement des expressions musicales ; elles permettent
347 de grandement simplifier un fichier source.
348
349 @menu
350 * Définition de fonctions musicales::
351 * Utilisation de fonctions musicales::
352 * Fonctions de substitution simple::
353 * Fonctions de substitution intermédiaires::
354 * De l'usage des mathématiques dans les fonctions::
355 * Fonctions dépourvues d'argument::
356 * Fonctions musicales fantômes::
357 @end menu
358
359
360 @node Définition de fonctions musicales
361 @subsection Définition de fonctions musicales
362 @translationof Music function definitions
363
364 @cindex fonction musicale, définition
365
366 @funindex define-music-function
367
368 Une fonction musicale se définit ainsi :
369
370 @example
371 fonction =
372 #(define-music-function
373      (parser location @var{arg1} @var{arg2} @dots{})
374      (@var{type1?} @var{type2?} @dots{})
375    @var{corps})
376 @end example
377
378 @noindent
379 de manière similaire aux @ref{Définition de fonctions Scheme, fonctions
380 Scheme}.  La plupart du temps, le @code{corps} sera constitué d'un
381 @ref{Blocs de code LilyPond, bloc de code Lilypond}.
382
383 Les différents types des prédicat sont recensés à l'annexe
384 @ruser{Types de prédicats prédéfinis}.
385
386 @seealso
387 Manuel de notation :
388 @ruser{Types de prédicats prédéfinis}.
389
390 Fichiers d'initialisation :
391 @file{lily/music-scheme.cc},
392 @file{scm/c++.scm},
393 @file{scm/lily.scm}.
394
395
396 @node Utilisation de fonctions musicales
397 @subsection Utilisation de fonctions musicales
398 @translationof Music function usage
399
400 Une fonction musicale peut prendre place en différents endroits.
401 Certaines restrictions s'appliqueront selon l'endroit où elle est
402 utilisée, de telle sorte que l'analyse syntaxique soit sans ambiguïté.
403 Le résultat renvoyé par une fonction musicale doit être compatible avec
404 le contexte dans lequel elle est appelée.
405
406 @itemize
407 @item
408 Dans une expression musicale de haut niveau@tie{}: aucune restriction.
409
410 @item
411 En tant que post-événement, explicitement introduit par un indicateur de
412 positionnement -- à savoir @code{-}, @code{^}, ou@tie{}@code{_}.  Notez
413 bien que le renvoi d'un post-événement est valide lorsque la fonction
414 musicale est appelée comme de la musique normale ; ceci amène à un
415 résultat ressemblant à
416 @example
417 s 1*0-\fonction
418 @end example
419
420 Dans ce cas particulier, vous ne pouvez utiliser une expression musicale
421 @emph{ouverte} en tant que dernier argument -- argument qui se
422 composerait d'une expression musicale susceptible d'accepter des
423 post-événements additionnels.
424
425 @item
426 En tant que partie d'un accord.  L'expression musicale renvoyée doit
427 être du type @code{rhythmic-event}, et plus particulièrement un
428 @code{NoteEvent}.
429 @end itemize
430
431 @noindent
432 Les règles spécifiques en matière d'arguments de fin rendent possible
433 l'écriture de fonctions polymorphes telles que @code{\tweak}, qui
434 peuvent s'appliquer à différentes constructions.
435
436
437 @node Fonctions de substitution simple
438 @subsection Fonctions de substitution simple
439 @translationof Simple substitution functions
440
441 Une fonction de substitution simple renvoie une expression musicale
442 écrite au format LilyPond et contient des arguments au format de
443 l'expression résultante.  Vous en trouverez une description détaillée à
444 la rubrique @ruser{Exemples de fonction de substitution}.
445
446
447 @node Fonctions de substitution intermédiaires
448 @subsection Fonctions de substitution intermédiaires
449 @translationof Intermediate substitution functions
450
451 Une fonction de substitution intermédiaire est une fonction dont
452 l'expression musicale résultante mélangera du code Scheme au code
453 LilyPond.
454
455 Certaines commandes @code{\override} nécessitent un argument
456 supplémentaire constitué d'une paire de nombres, appelée @emph{cons
457 cell} en Scheme -- que l'on pourrait traduire par @qq{construction de
458 cellule}.
459
460 Cette paire peut se mentionner directement dans la fonction musicale à
461 l'aide d'une variable @code{pair?} :
462
463 @example
464 manualBeam =
465 #(define-music-function
466      (parser location beg-end)
467      (pair?)
468    #@{
469      \once \override Beam.positions = #beg-end
470    #@})
471
472 \relative c' @{
473   \manualBeam #'(3 . 6) c8 d e f
474 @}
475 @end example
476
477 Autre manière de procéder, les nombres formant la paire sont transmis
478 comme arguments séparés ; le code Scheme chargé de créer la paire
479 pourra alors être inclus dans l'expression musicale :
480
481 @lilypond[quote,verbatim,ragged-right]
482 manualBeam =
483 #(define-music-function
484      (parser location beg end)
485      (number? number?)
486    #{
487      \once \override Beam.positions = #(cons beg end)
488    #})
489
490 \relative c' {
491   \manualBeam #3 #6 c8 d e f
492 }
493 @end lilypond
494
495 @funindex \temporary
496 @cindex temporaire, dérogation (override)
497 @cindex dérogation temporaire (override)
498 @cindex propriétés, retour à la valeur précédente
499
500 L'entretien des propriétés peut se voir comme un empilement par
501 propriété par objet par contexte.  Les fonctions musicales peuvent
502 nécessiter des dérogatoins pour une ou plusieurs propriétés pour la
503 durée de la fonction, puis de revenir aux valeurs précédentes avant de
504 quitter.  Néanmoins, une dérogation normale va retirer de la pile -- ou
505 dépiler -- et supprimer le sommet de la pile de la propriété avant
506 d'y ajouter quoi que ce soit -- ou empiler -- ; la valeur précédente de
507 la propriété est de fait perdue.  Lorsque la valeur antérieure doit être
508 préservée, l'instruction @code{\override} devra être préfixée d'un
509 @code{\temporary}, comme ceci :
510
511 @example
512 \temporary \override @dots{}
513 @end example
514
515 L'utilisation d'un @code{\temporary} a pour effet d'effacer la propriété
516 @code{pop-first} (@emph{commence par dépiler} normalement activée) de la
517 dérogation ; la valeur antérieure ne sera alors pas supprimée de la pile
518 de la propriété avant d'y empiler la nouvelle valeur.  Lorsqu'un
519 @code{\revert} viendra par la suite supprimer la valeur dérogatoire
520 temporaire, réapparaitra la valeur antérieure.
521
522 En d'autres termes, un @code{\revert} qui suit un @code{\temporary
523 \override} pour la même propriété n'apporte rien.  Ce principe est aussi
524 valable pour une couple @code{\temporary} et @code{\undo} sur la même
525 musique contenant des dérogations.
526
527 Voici un exemple de fonction musicale utilisant cette fonctionnalité.
528 La présence du @code{\temporary} permet de s'assurer qu'en sortant de la
529 fonction, les propriétés @code{cross-staff} et @code{style} retrouveront
530 les valeurs qu'elles avaient que ne soit appelée la fonction
531 @code{crossStaff}.  En l'absence de @code{\temporary}, ces propriétés
532 auraient retrouvé leurs valeurs par défaut à la sortie de la fonction.
533
534 @example
535 crossStaff =
536 #(define-music-function (parser location notes) (ly:music?)
537   (_i "Create cross-staff stems")
538   #@{
539   \temporary \override Stem.cross-staff = #cross-staff-connect
540   \temporary \override Flag.style = #'no-flag
541   #notes
542   \revert Stem.cross-staff
543   \revert Flag.style
544 #@})
545 @end example
546
547
548 @node De l'usage des mathématiques dans les fonctions
549 @subsection De l'usage des mathématiques dans les fonctions
550 @translationof Mathematics in functions
551
552 Une fonction musicale peut requérir, en plus d'une simple substitution,
553 une part de programmation en Scheme.
554
555 @lilypond[quote,verbatim,ragged-right]
556 AltOn =
557 #(define-music-function
558      (parser location mag)
559      (number?)
560    #{
561      \override Stem.length = #(* 7.0 mag)
562      \override NoteHead.font-size =
563        #(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
564    #})
565
566 AltOff = {
567   \revert Stem.length
568   \revert NoteHead.font-size
569 }
570
571 \relative c' {
572   c2 \AltOn #0.5 c4 c
573   \AltOn #1.5 c c \AltOff c2
574 }
575 @end lilypond
576
577 @noindent
578 Cette fonction pourrait tout à fait être réécrite de telle sorte qu'elle
579 s'applique à une expression musicale :
580
581 @lilypond[quote,verbatim,ragged-right]
582 withAlt =
583 #(define-music-function
584      (parser location mag music)
585      (number? ly:music?)
586    #{
587      \override Stem.length = #(* 7.0 mag)
588      \override NoteHead.font-size =
589        #(inexact->exact (* (/ 6.0 (log 2.0)) (log mag)))
590      #music
591      \revert Stem.length
592      \revert NoteHead.font-size
593    #})
594
595 \relative c' {
596   c2 \withAlt #0.5 { c4 c }
597   \withAlt #1.5 { c c } c2
598 }
599 @end lilypond
600
601
602 @node Fonctions dépourvues d'argument
603 @subsection Fonctions dépourvues d'argument
604 @translationof Functions without arguments
605
606 Dans la plupart des cas, une fonction dépourvue d'argument devrait
607 être créée à l'aide d'une variable :
608
609 @example
610 dolce = \markup@{ \italic \bold dolce @}
611 @end example
612
613 Il peut, dans certains cas particuliers, s'avérer utile de créer une
614 fonction sans argument comme ici,
615
616 @example
617 displayBarNum =
618 #(define-music-function
619      (parser location)
620      ()
621    (if (eq? #t (ly:get-option 'display-bar-numbers))
622        #@{ \once \override Score.BarNumber.break-visibility = ##f #@}
623        #@{#@}))
624 @end example
625
626 @noindent
627 de manière à pouvoir afficher les numéros de mesure grâce à un appel à
628 cette fonction.  En pareil cas, vous devrez invoquer @command{lilypond}
629 en respectant la syntaxe
630
631 @example
632 lilypond -d display-bar-numbers MONFICHIER.ly
633 @end example
634
635
636 @node Fonctions musicales fantômes
637 @subsection Fonctions musicales fantômes
638 @translationof Void music functions
639
640 Une fonction musicale doit renvoyer une expression musicale.  Toutefois,
641 une fonction musicale peut n'être exécutée que dans le but d'en retenir
642 les effets annexes ; vous devrez alors utiliser une procédure
643 @code{define-void-function}.  Il peut cependant arriver que vous ayez
644 besoin d'une fonction qui, selon le cas, produise ou non (comme dans
645 l'exemple de la rubrique précédente) une expression musicale.
646 L'utilisation d'un @code{#@{ #@}} vous permettra de renvoyer une
647 expression musicale @code{void}.
648
649
650 @node Fonctions événementielles
651 @section Fonctions événementielles
652 @translationof Event functions
653
654 @funindex define-event-function
655 @cindex événementielle, fonction
656
657 L'utilisation d'une fonction musicale pour placer un événement requiert
658 l'insertion d'un indicateur de position, ce qui peut ne pas correspondre
659 à la syntaxe de la construction à remplacer.  C'est par exemple le cas
660 lorsque vous voulez écrire une commande de nuance, instruction qui
661 ne comporte habituellement pas d'indicateur de positionnement, comme
662 dans @code{c'\pp}.  Voici de quoi vous permettre de mentionner n'importe
663 quelle nuance :
664
665 @lilypond[quote,verbatim,ragged-right]
666 dyn=#(define-event-function (parser location arg) (markup?)
667          (make-dynamic-script arg))
668 \relative c' { c\dyn pfsss }
669 @end lilypond
670
671 Vous pourriez obtenir le même résultat avec une fonction musicale, à
672 ceci près que chaque appel à la fonction devra être précédé d'un
673 indicateur de positionnement, comme @code{c-\dyn pfsss}.
674
675
676 @node Fonctions pour markups
677 @section Fonctions pour @emph{markups}
678 @translationof Markup functions
679
680 Les @emph{markups} sont implémentés au travers de fonctions Scheme
681 spécifiques qui produisent des objets @code{Stencil} comprenant un
682 certain nombre d'arguments.
683
684 @menu
685 * Construction d'un markup en Scheme::
686 * Fonctionnement interne des markups::
687 * Définition d'une nouvelle commande de markup::
688 * Définition d'une nouvelle commande de liste de markups::
689 @end menu
690
691
692 @node Construction d'un markup en Scheme
693 @subsection Construction d'un @emph{markup} en Scheme
694 @translationof Markup construction in Scheme
695
696 @cindex définition d'une commande markup
697
698 La macro @code{markup} construit en Scheme des expressions @emph{markup}
699 tout en disposant d'une syntaxe proche de celle de LilyPond.  Par exemple,
700 @example
701 (markup #:column (#:line (#:bold #:italic "hello" #:raise 0.4 "world")
702                   #:larger #:line ("foo" "bar" "baz")))
703 @end example
704
705 @noindent
706 est équivalent à
707 @example
708 #@{ \markup \column @{ \line @{ \bold \italic "hello" \raise #0.4 "world" @}
709                   \larger \line @{ foo bar baz @} @} #@}
710 @end example
711
712 @noindent
713 Vous pouvez constater les principales règles de traduction entre les
714 syntaxes respectives de LilyPond et de Scheme en matière de
715 @emph{markup}.  Bien que le passage en syntaxe LilyPond grâce à
716 @code{#@{ @dots{} #@}} apporte de la souplesse, nous allons voir comment
717 utiliser la macro @code{markup} en Scheme exclusivement.
718
719 @quotation
720 @multitable @columnfractions .3 .3
721 @item @b{LilyPond} @tab @b{Scheme}
722 @item @code{\markup markup1} @tab @code{(markup markup1)}
723 @item @code{\markup @{ markup1 markup2 ... @}} @tab
724         @code{(markup markup1 markup2 ... )}
725 @item @code{\commande-markup} @tab @code{#:commande-markup}
726 @item @code{\variable} @tab @code{variable}
727 @item @code{\center-column @{ ... @}} @tab @code{#:center-column ( ... )}
728 @item @code{chaîne} @tab @code{"chaîne"}
729 @item @code{#argument-scheme} @tab @code{argument-scheme}
730 @end multitable
731 @end quotation
732
733 L'intégralité du langage Scheme est accessible à l'intérieur même de la
734 macro @code{markup}.  Vous pouvez ainsi appeler des fonctions à partir
735 de @code{markup} pour manipuler des chaînes de caractères, ce qui est
736 particulièrement pratique lorsque vous créez votre propre commande de
737 @emph{markup} -- voir
738 @ref{Définition d'une nouvelle commande de markup}. 
739
740 @knownissues
741 L'argument @var{markup-list} des commandes @code{#:line},
742 @code{#:center} ou @code{#:column} ne saurait être une variable ni le
743 résultat de l'appel à une fonction.
744
745 @lisp
746 (markup #:line (fonction-qui-retourne-des-markups))
747 @end lisp
748
749 @noindent
750 n'est pas valide.  Il vaut mieux, en pareil cas, utiliser les fonctions
751 @code{make-line-markup}, @code{make-center-markup} ou
752 @code{make-column-markup} :
753
754 @lisp
755 (markup (make-line-markup (fonction-qui-retourne-des-markups)))
756 @end lisp
757
758
759 @node Fonctionnement interne des markups
760 @subsection Fonctionnement interne des @emph{markups}
761 @translationof How markups work internally
762
763 Dans un @emph{markup} tel que
764
765 @example
766 \raise #0.5 "text example"
767 @end example
768
769 @noindent
770 @code{\raise} représente en fait la fonction @code{raise-markup}.
771 L'expression @emph{markup} est enregistrée sous la forme
772
773 @example
774 (list raise-markup 0.5 (list simple-markup "text example"))
775 @end example
776
777 Lorsque ce @emph{markup} est converti en objets imprimables (stencils),
778 la fonction @code{raise-markup} est appelée ainsi :
779
780 @example
781 (apply raise-markup
782        @var{\layout objet}
783        @var{liste des alists de propriété}
784        0.5
785        @var{le @emph{markup} "text example"})
786 @end example
787
788 La fonction @code{raise-markup} commence par créer le stencil pour la
789 chaîne @code{text example}, puis remonte ce stencil d'un demi espace de
790 portée.  Il s'agit là d'un exemple relativement simple, et nous en
791 aborderons de plus complexes au fil des paragraphes suivants ;
792 d'autres exemples se trouvent directement dans le fichier
793 @file{scm/define-markup-commands.scm}.
794
795
796 @node Définition d'une nouvelle commande de markup
797 @subsection Définition d'une nouvelle commande de @emph{markup}
798 @translationof New markup command definition
799
800 Nous allons étudier dans ce qui suit la manière de définir une nouvelle
801 commande de @emph{markup}.
802
803 @menu
804 * Syntaxe d'une commande markup::
805 * Attribution de propriétés::
806 * Exemple commenté::
807 * Adaptation d'une commande incorporée::
808 @end menu
809
810
811 @node Syntaxe d'une commande markup
812 @unnumberedsubsubsec Syntaxe d'une commande @emph{markup}
813 @translationof Markup command definition syntax
814
815 Une commande de @emph{markup} personnalisée se définit à l'aide de la
816 macro Scheme @code{define-markup-command}, placée en tête de fichier.
817
818 @lisp
819 (define-markup-command (@var{nom-commande} @var{layout} @var{props} @var{arg1} @var{arg2} ...)
820     (@var{arg1-type?} @var{arg2-type?} ...)
821     [ #:properties ((@var{propriété1} @var{valeur-par-défaut1})
822                     ...) ]
823   ..corps de la commande..)
824 @end lisp
825
826 Quelques commentaires sur les arguments :
827
828 @table @code
829 @item @var{nom-commande}
830 le nom que vous attribuez à votre commande de @emph{markup}.
831 @item layout
832 la définition du @qq{layout} -- son formatage.
833 @item props
834 une liste de listes associatives, comprenant toutes les propriétés actives.
835 @item @var{argi}
836 le @var{ième} argument de la commande.
837 @item @var{argi-type?}
838 un type de prédicat pour le @var{ième} argument.
839 @end table
840
841 Si la commande utilise des propriétés à partir des arguments
842 @code{props}, le mot-clé @code{#:properties} permet de spécifier ces
843 différentes propriétés ainsi que leur valeur par défaut.
844
845 Les arguments se distinguent selon leur type :
846 @itemize
847 @item un @emph{markup}, correspondant au type de prédicat
848 @code{markup?}@tie{};
849 @item une liste de @emph{markups}, correspondant au type de prédicat
850 @code{markup-list?}@tie{};
851 @item tout autre objet Scheme, correspondant au types de prédicat tels
852 que @code{list?}, @code{number?}, @code{boolean?}, etc.
853 @end itemize
854
855 Il n'existe aucune restriction quant à l'ordre des arguments fournis à
856 la suite des arguments @code{layout} et @code{props}.  Néanmoins, les
857 fonctions @emph{markup} qui ont en dernier argument un @emph{markup} ont
858 ceci de particulier qu'elles peuvent s'appliquer à des listes de
859 @emph{markups} ; ceci résultera en une liste de @emph{markups} où
860 tous les éléments de la liste originelle se verront appliquer cette
861 fonction @emph{markup} avec ses arguments de tête.
862
863 La réplication des arguments de tête dans le but d'appliquer une
864 fonction @emph{markup} à une liste de markups est économique,
865 principalement lorsqu'il s'agit d'arguments Scheme.  Vous éviterez
866 ainsi d'éventuelles pertes de performance en utilisant des arguments
867 Scheme en tant qu'arguments principaux d'une fonction @emph{markup} dont
868 le dernier argument est un @emph{markup}.
869
870
871 @node Attribution de propriétés
872 @unnumberedsubsubsec Attribution de propriétés
873 @translationof On properties
874
875 Les arguments @code{layout} et @code{props} d'une commande de
876 @emph{markup} fournissent un contexte à l'interprétation du
877 @emph{markup} : taille de fonte, longueur de ligne etc.
878
879 L'argument @code{layout} permet d'accéder aux propriétés définies dans
880 les blocs @code{\paper}, grâce à la fonction
881 @code{ly:output-def-lookup}.  Par exemple, la longueur de ligne,
882 identique à celle de la partition, est lue au travers de
883
884 @example
885 (ly:output-def-lookup layout 'line-width)
886 @end example
887
888 L'argument @code{props} rend certaines propriétés accessibles aux
889 commandes de @emph{markup}.  Il en va ainsi lors de l'interprétation
890 d'un @emph{markup} de titre d'ouvrage : toutes les variables
891 définies dans le bloc @code{\header} sont automatiquement ajoutées aux
892 @code{props}, de telle sorte que le @emph{markup} de titrage de
893 l'ouvrage pourra accéder aux différents champs titre, compositeur etc.
894 Ceci permet aussi de configurer le comportement d'une commande de
895 @emph{markup} : la taille des fontes, par exemple, est lue à
896 partir de @code{props} plutôt que grâce à un argument @code{font-size}.
897 La fonction appelant une commande de @emph{markup} peut altérer la
898 valeur de la propriété taille des fontes et donc en modifier le
899 comportement.  L'utilisation du mot-clé @code{#:properties}, attaché à
900 @code{define-markup-command}, permet de spécifier les propriétés devant
901 être lues parmi les arguments @code{props}.
902
903 L'exemple proposé à la rubrique suivante illustre comment, au sein d'une
904 commande de @emph{markup}, accéder aux différentes propriétés et les
905 modifier.
906
907
908 @node Exemple commenté
909 @unnumberedsubsubsec Exemple commenté
910 @translationof A complete example
911
912 Nous allons, dans cet exemple, nous attacher à encadrer du texte avec un
913 double liseré.
914
915 Commençons par construire quelque chose d'approximatif à l'aide d'un
916 simple @emph{markup}.  La lecture de @ruser{Commandes pour markup} nous
917 indique la commande @code{\box}, qui semble ici appropriée.
918
919 @lilypond[quote,verbatim,ragged-right]
920 \markup \box \box HELLO
921 @end lilypond
922
923 Dans un souci d'esthétique, nous aimerions que le texte et les
924 encadrements ne soient pas autant accolés.  Selon la documentation de
925 @code{\box}, cette commande utilise la propriété @code{box-padding},
926 fixée par défaut à 0,2.  Cette même documentation nous indique
927 aussi comment la modifier :
928
929 @lilypond[quote,verbatim,ragged-right]
930 \markup \box \override #'(box-padding . 0.6) \box A
931 @end lilypond
932
933 L'espacement des deux liserés est cependant toujours trop réduit ;
934 modifions le à son tour :
935
936 @lilypond[quote,verbatim,ragged-right]
937 \markup \override #'(box-padding . 0.4) \box
938      \override #'(box-padding . 0.6) \box A
939 @end lilypond
940
941 Vous conviendrez que recopier une telle définition de @emph{markup}
942 deviendra vite fastidieux.  C'est pourquoi nous écrivons la commande de
943 @emph{markup} @code{double-box} qui prendra un seul argument -- le
944 texte.  Cette commande se chargera de dessiner les encadrements, en
945 tenant compte des espacements.
946
947 @lisp
948 #(define-markup-command (double-box layout props text) (markup?)
949   "Dessine un double encadrement autour du texte."
950   (interpret-markup layout props
951     #@{\markup \override #'(box-padding . 0.4) \box
952             \override #'(box-padding . 0.6) \box @{ #text @}#@}))
953 @end lisp
954
955 ou bien son équivalent
956
957 @lisp
958 #(define-markup-command (double-box layout props text) (markup?)
959   "Dessine un double encadrement autour du texte."
960   (interpret-markup layout props
961     (markup #:override '(box-padding . 0.4) #:box
962             #:override '(box-padding . 0.6) #:box text)))
963 @end lisp
964
965 @code{text} est le nom de l'argument de notre commande, et
966 @code{markup?} son type -- l'argument sera identifié comme étant un
967 @emph{markup}.  La fonction @code{interpret-markup}, utilisée dans la
968 plupart des commandes de @emph{markup}, construira un stencil à partir
969 de @code{layout}, @code{props} et un @emph{markup}.  Dans la seconde
970 variante, ce @emph{markup} sera construit à l'aide de la macro Scheme
971 @code{markup} -- voir @ref{Construction d'un markup en Scheme}.  La
972 transformation d'une expression @code{\markup} en expression Scheme est
973 des plus triviales.
974
975 Notre commande personnalisée s'utilise ainsi :
976
977 @example
978 \markup \double-box A
979 @end example
980
981 Il serait intéressant de rendre cette commande @code{double-box} plus
982 souple@tie{}:  les valeurs de @code{box-padding} sont figées et ne
983 peuvent être modifiées à l'envie.  Pareillement, il serait bien de
984 distinguer l'espacement entre les encadrements de l'espacement entre le
985 texte et ses encadrements.  Nous allons donc introduire une propriété
986 supplémentaire, que nous appellerons @code{inter-box-padding}, chargée
987 de gérer l'espacement des encadrements ; @code{box-padding} ne
988 servira alors que pour l'espacement intérieur.  Voici le code adapté à
989 ces évolutions :
990
991 @lisp
992 #(define-markup-command (double-box layout props text) (markup?)
993   #:properties ((inter-box-padding 0.4)
994                 (box-padding 0.6))
995   "Dessine un double encadrement autour du texte."
996   (interpret-markup layout props
997     #@{\markup \override #`(box-padding . ,inter-box-padding) \box
998                \override #`(box-padding . ,box-padding) \box
999                @{ #text @} #@}))
1000 @end lisp
1001
1002 Ainsi que son équivalent à partir de la macro @emph{markup} :
1003
1004 @lisp
1005 #(define-markup-command (double-box layout props text) (markup?)
1006   #:properties ((inter-box-padding 0.4)
1007                 (box-padding 0.6))
1008   "Dessine un double encadrement autour du texte."
1009   (interpret-markup layout props
1010     (markup #:override `(box-padding . ,inter-box-padding) #:box
1011             #:override `(box-padding . ,box-padding) #:box text)))
1012 @end lisp
1013
1014 C'est ici le mot-clé @code{#:properties} qui permet de lire les
1015 propriétés @code{inter-box-padding} et @code{box-padding} à partir de
1016 l'argumenet @code{props}@tie{}; on leur a d'ailleurs fourni des valeurs
1017 par défaut au cas où elles ne seraient pas définies.
1018
1019 Ces valeurs permettront alors d'adapter les propriétés de
1020 @code{box-padding} utilisées par les deux commandes @code{\box}.  Vous
1021 aurez remarqué, dans l'argument @code{\override}, la présence de
1022 l'apostrophe inversée (@code{`}) et de la virgule ; elles vous
1023 permettent d'insérer une valeur variable au sein d'une expression
1024 littérale.
1025
1026 Notre commande est maintenant prête à servir dans un @emph{markup}, et
1027 les encadrements sont repositionnables.
1028
1029 @lilypond[quote,verbatim,ragged-right]
1030 #(define-markup-command (double-box layout props text) (markup?)
1031   #:properties ((inter-box-padding 0.4)
1032                 (box-padding 0.6))
1033   "Draw a double box around text."
1034   (interpret-markup layout props
1035     #{\markup \override #`(box-padding . ,inter-box-padding) \box
1036               \override #`(box-padding . ,box-padding) \box
1037               { #text } #}))
1038
1039 \markup \double-box A
1040 \markup \override #'(inter-box-padding . 0.8) \double-box A
1041 \markup \override #'(box-padding . 1.0) \double-box A
1042 @end lilypond
1043
1044
1045 @node Adaptation d'une commande incorporée
1046 @unnumberedsubsubsec Adaptation d'une commande incorporée
1047 @translationof Adapting builtin commands
1048
1049 Le meilleur moyen de construire ses propres commandes de @emph{markup}
1050 consiste à prendre exemple sur les commandes déjà incorporées.  La
1051 plupart des commandes de @emph{markup} fournies avec LilyPond sont
1052 répertoriées dans le fichier @file{scm/define-markup-commands.scm}.
1053
1054 Nous pourrions, par exemple, envisager d'adapter la commande
1055 @code{\draw-line} pour dessiner plutôt une ligne double.  Voici comment
1056 est définie la commande @code{\draw-line}, expurgée de sa
1057 documentation :
1058
1059 @lisp
1060 (define-markup-command (draw-line layout props dest)
1061   (number-pair?)
1062   #:category graphic
1063   #:properties ((thickness 1))
1064   "..documentation.."
1065   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
1066                thickness))
1067         (x (car dest))
1068         (y (cdr dest)))
1069     (make-line-stencil th 0 0 x y)))
1070 @end lisp
1071
1072 Avant de définir notre propre commande basée sur l'une de celles
1073 fournies par LilyPond, commençons par en recopier la définition, puis
1074 attribuons lui un autre nom.  Le mot-clé @code{#:category} peut être
1075 supprimé sans risque ; il ne sert que lors de la génération de la
1076 documentation et n'est d'aucune utilité pour une commande personnalisée.
1077
1078 @lisp
1079 (define-markup-command (draw-double-line layout props dest)
1080   (number-pair?)
1081   #:properties ((thickness 1))
1082   "..documentation.."
1083   (let ((th (* (ly:output-def-lookup layout 'line-thickness)
1084                thickness))
1085         (x (car dest))
1086         (y (cdr dest)))
1087     (make-line-stencil th 0 0 x y)))
1088 @end lisp
1089
1090 Nous ajoutons ensuite une propriété pour gérer l'écart entre les deux
1091 lignes, que nous appelons @code{line-gap}, et lui attribuons une valeur
1092 par défaut de 6 dixièmes :
1093
1094 @lisp
1095 (define-markup-command (draw-double-line layout props dest)
1096   (number-pair?)
1097   #:properties ((thickness 1)
1098                 (line-gap 0.6))
1099   "..documentation.."
1100   ...
1101 @end lisp
1102
1103 Nous ajoutons enfin le code qui dessinera nos deux lignes.  Deux appels
1104 à @code{make-line-stencil} permettrons de dessiner les lignes dont nous
1105 regrouperons les stencils à l'aide de @code{ly:stencil-add} :
1106
1107 @lilypond[quote,verbatim,ragged-right]
1108 #(define-markup-command (my-draw-line layout props dest)
1109   (number-pair?)
1110   #:properties ((thickness 1)
1111                 (line-gap 0.6))
1112   "..documentation.."
1113   (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
1114                 thickness))
1115          (dx (car dest))
1116          (dy (cdr dest))
1117          (w (/ line-gap 2.0))
1118          (x (cond ((= dx 0) w)
1119                   ((= dy 0) 0)
1120                   (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy))))))))
1121          (y (* (if (< (* dx dy) 0) 1 -1)
1122                (cond ((= dy 0) w)
1123                      ((= dx 0) 0)
1124                      (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx))))))))))
1125      (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y))
1126                      (make-line-stencil th (- x) (- y) (- dx x) (- dy y)))))
1127
1128 \markup \my-draw-line #'(4 . 3)
1129 \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)
1130 @end lilypond
1131
1132
1133 @node Définition d'une nouvelle commande de liste de markups
1134 @subsection Définition d'une nouvelle commande de liste de @emph{markups}
1135 @translationof New markup list command definition
1136
1137 Une commande traitant une liste de @emph{markups} se définit à l'aide de
1138 la macro Scheme @code{define-markup-list-command}, de manière analogue à
1139 la macro @code{define-markup-command} abordée à la rubrique
1140 @ref{Définition d'une nouvelle commande de markup} à ceci près que cette
1141 dernière renvoie un seul stencil, non une liste de stencils.
1142
1143 Dans l'exemple suivant, nous définissons @code{\paragraph}, une commande
1144 de liste de @emph{markups}, qui renverra une liste de lignes justifiées
1145 dont la première sera indentée.  La largeur de l'alinéa sera récupérée
1146 par l'argument @code{props}.
1147
1148 @example
1149 #(define-markup-list-command (paragraph layout props args) (markup-list?)
1150    #:properties ((par-indent 2))
1151    (interpret-markup-list layout props
1152      #@{\markuplist \justified-lines @{ \hspace #par-indent #args @} #@}))
1153 @end example
1154
1155 La version purement Scheme est un peu plus complexe :
1156 @example
1157 #(define-markup-list-command (paragraph layout props args) (markup-list?)
1158    #:properties ((par-indent 2))
1159    (interpret-markup-list layout props
1160      (make-justified-lines-markup-list (cons (make-hspace-markup par-indent)
1161                                              args))))
1162 @end example
1163
1164 En dehors des habituels arguments @code{layout} et @code{props}, la
1165 commande de liste de @emph{markups} @code{paragraph} prend en argument
1166 une liste de @emph{markups} appelé @code{args}.  Le prédicat des listes
1167 de @emph{markups} est @code{markup-list?}.
1168
1169 Pour commencer, la fonction récupère la taille de l'alinéa, propriété
1170 ici dénommée @code{par-indent}, à partir de la liste de propriétés
1171 @code{props}.  En cas d'absence, la valeur par défaut sera
1172 de @code{2}.  Ensuite est créée une liste de lignes justifiées
1173 grâce à la commande prédéfinie @code{\justified-lines}, liée à la
1174 fonction @code{make-justified-lines-markup-list}.  Un espace horizontal
1175 est ajouté en tête, grâce à @code{\hspace} ou à la fonction
1176 @code{make-hspace-markup}.  Enfin, la liste de @emph{markups} est
1177 interprétée par la fonction @code{interpret-markup-list}.
1178
1179 Voici comment utiliser cette nouvelle commande de liste de
1180 @emph{markups}@tie{}:
1181 @example
1182 \markuplist @{
1183   \paragraph @{
1184     The art of music typography is called \italic @{(plate) engraving.@}
1185     The term derives from the traditional process of music printing.
1186     Just a few decades ago, sheet music was made by cutting and stamping
1187     the music into a zinc or pewter plate in mirror image.
1188   @}
1189   \override-lines #'(par-indent . 4) \paragraph @{
1190     The plate would be inked, the depressions caused by the cutting
1191     and stamping would hold ink.  An image was formed by pressing paper
1192     to the plate.  The stamping and cutting was completely done by
1193     hand.
1194   @}
1195 @}
1196 @end example
1197
1198
1199 @node Contextes pour programmeurs
1200 @section Contextes pour programmeurs
1201 @translationof Contexts for programmers
1202
1203 @menu
1204 * Évaluation d'un contexte::
1205 * Application d'une fonction à tous les objets de mise en forme::
1206 @end menu
1207
1208
1209 @node Évaluation d'un contexte
1210 @subsection Évaluation d'un contexte
1211 @translationof Context evaluation
1212
1213 @cindex appel de code durant l'interprétation
1214 @funindex \applyContext
1215
1216 Un contexte peut être modifié, au moment même de son interprétation, par
1217 du code Scheme.  La syntaxe consacrée en pareil cas est
1218 @example
1219 \applyContext @var{fonction}
1220 @end example
1221
1222 @code{@var{fonction}} est constitué d'une fonction Scheme comportant un
1223 unique argument : le contexte au sein duquel la commande
1224 @code{\applyContext} est appelée.  Les lignes de code qui suivent auront
1225 pour effet d'afficher à l'écran, en cours de compilation, le numéro de
1226 mesure en cours.
1227
1228 @example
1229 \applyContext
1230   #(lambda (x)
1231     (format #t "\nNous en sommes à la mesure ~a.\n"
1232      (ly:context-property x 'currentBarNumber)))
1233 @end example
1234
1235
1236 @node Application d'une fonction à tous les objets de mise en forme
1237 @subsection Application d'une fonction à tous les objets de mise en forme
1238 @translationof Running a function on all layout objects
1239
1240 @cindex appel de code sur des objets de mise en forme
1241 @funindex \applyOutput
1242
1243 La manière la plus souple d'affiner un objet consiste à utiliser la
1244 commande @code{\applyOutput}.  Celle-ci va insérer un événement
1245 (@rinternals{ApplyOutputEvent}) dans le contexte spécifié.  Elle répond
1246 à la syntaxe
1247 @example
1248 \applyOutput @var{Contexte} @var{procédure}
1249 @end example
1250
1251 @noindent
1252 où @code{@var{procédure}} est une fonction Scheme à trois arguments.
1253
1254 Lors de l'interprétation de cette commande, la fonction
1255 @code{@var{procédure}} est appelée pout tout objet de rendu appartenant
1256 au contexte @code{@var{Contexte}} à cet instant précis, avec les
1257 arguments suivants :
1258 @itemize
1259 @item l'objet de rendu en lui-même,
1260 @item le contexte au sein duquel cet objet est créé,
1261 @item et le contexte dans lequel @code{\applyOutput} est effectué.
1262 @end itemize
1263
1264 De plus, ce qui est à l'origine de l'objet de rendu -- l'expression
1265 musicale ou l'objet qui l'a générée -- se retrouve en tant que propriété
1266 d'objet @code{cause}.  Il s'agit, pour une tête de note, d'un événement
1267 @rinternals{NoteHead}, et d'un objet @rinternals{Stem} pour une hampe.
1268
1269 Voici une fonction utilisable avec la commande
1270 @code{\applyOutput} : elle @qq{blanchit} la tête des notes se
1271 trouvant sur la ligne médiane ou bien directement à son contact.
1272
1273 @lilypond[quote,verbatim,ragged-right]
1274 #(define (blanker grob grob-origin context)
1275    (if (and (memq 'note-head-interface (ly:grob-interfaces grob))
1276             (< (abs (ly:grob-property grob 'staff-position)) 2))
1277        (set! (ly:grob-property grob 'transparent) #t)))
1278
1279 \relative c' {
1280   a'4 e8 <<\applyOutput #'Voice #blanker a c d>> b2
1281 }
1282 @end lilypond
1283
1284 La @var{procédure} sera interprétée au niveau @code{Score}
1285 (partition) ou @code{Staff} dès lors que vous utiliserez l'une des
1286 syntaxes
1287
1288 @example
1289 \applyOutput #'Score #@var{procédure}
1290 \applyOutput #'Staff #@var{procédure}
1291 @end example
1292
1293
1294 @node Fonctions de rappel
1295 @section Fonctions de rappel
1296 @translationof Callback functions
1297
1298 Certaines propriétés, entre autres @code{thickness} ou @code{direction},
1299 peuvent voir leur valeur figée à l'aide d'un @code{\override} comme
1300 ici@tie{}:
1301
1302 @example
1303 \override Stem.thickness = #2.0
1304 @end example
1305
1306 Une procédure Scheme peut aussi se charger de modifier des
1307 propriétés@tie{}:
1308
1309 @lilypond[fragment,verbatim,quote,relative=2]
1310 \override Stem.thickness = #(lambda (grob)
1311     (if (= UP (ly:grob-property grob 'direction))
1312         2.0
1313         7.0))
1314 c b a g b a g b
1315 @end lilypond
1316
1317 @noindent
1318 Dans ce cas, la procédure est exécutée dès que la valeur de la propriété
1319 est nécessaire au processus de mise en forme.
1320
1321 La majeure partie du procédé typographique consiste en la réalisation de
1322 tels rappels (@emph{callbacks} en anglais).  Entre autres propriétés
1323 utilisant particulièrement des rappels, nous mentionnerons
1324
1325 @table @code
1326 @item stencil
1327   Routine d'impression, construisant le dessin du symbole
1328 @item X-offset
1329   Routine effectuant le positionnement horizontal
1330 @item X-extent
1331   Routine calculant la largeur d'un objet
1332 @end table
1333
1334 La procédure prend un unique argument, en l'occurrence l'objet graphique
1335 (le @emph{grob}).
1336
1337 Dans le cas où la routine doit faire appel à plusieurs arguments, le
1338 @emph{grob} en cours peut s'insérer à l'aide d'un @emph{grob} enchâssé.
1339 Voici, à titre d'illustration, un réglage pour
1340 @code{AccidentalSuggestion} :
1341
1342 @example
1343 `(X-offset .
1344   ,(ly:make-simple-closure
1345     `(,+
1346         ,(ly:make-simple-closure
1347            (list ly:self-alignment-interface::centered-on-x-parent))
1348       ,(ly:make-simple-closure
1349            (list ly:self-alignment-interface::x-aligned-on-self)))))
1350 @end example
1351
1352 @noindent
1353 Ici, aussi bien @code{ly:self-alignment-interface::x-aligned-on-self}
1354 que @code{ly:self-alignment-interface::centered-on-x-parent} font appel
1355 à l'argument @emph{grob}.  La fonction @code{+} a pour effet
1356 d'additionner les résultats.  L'ensemble est inclus dans un
1357 @code{ly:make-simple-closure} de telle sorte que l'addition s'exécute de
1358 façon correcte
1359
1360 Dans les faits, l'utilisation d'une unique procédure en tant que valeur
1361 d'une propriété revient à écrire
1362
1363 @example
1364 (ly:make-simple-closure (ly:make-simple-closure (list @var{proc})))
1365 @end example
1366
1367 @noindent
1368 Le @code{ly:make-simple-closure} intérieur fournit le @emph{grob} en
1369 argument à la procédure @var{proc}, l'extérieur s'assure que le résultat
1370 de la fonction sera bien renvoyé, non pas l'objet @code{simple-closure}.
1371
1372 Au sein d'un @emph{callback}, le meilleur moyen d'évaluer un
1373 @emph{markup} consiste à utiliser la fonction
1374 @code{grob-interpret-markup}, comme ici :
1375
1376 @example
1377 my-callback = #(lambda (grob)
1378                  (grob-interpret-markup grob (markup "foo")))
1379 @end example
1380
1381
1382 @node Code Scheme intégré
1383 @section Code Scheme intégré
1384 @translationof Inline Scheme code
1385
1386 À REVOIR : l'exemple de cette rubrique n'est pas des plus judicieux puisque
1387 @example
1388 F = -\tweak font-size #-3 -\flageolet
1389 @end example
1390 (notez le @samp{-} qui qualifie d'événement postérieur) fonctionne
1391 correctement dans ce cas d'espèce.  En attendant un remaniement de cette
1392  section, faisons comme si nous l'ignorions.
1393
1394 L'inconvénient principal de la commande @code{\tweak} est la rigidité de
1395 sa syntaxe.  Par exemple, le code suivant produit une erreur.
1396
1397 @example
1398 F = \tweak font-size #-3 -\flageolet
1399
1400 \relative c'' @{
1401   c4^\F c4_\F
1402 @}
1403 @end example
1404
1405 @noindent
1406 En d'autres termes, @code{\tweak} ne se comporte pas comme une
1407 articulation : il ne peut notamment pas être accolé avec les
1408 symboles @samp{^} ou @samp{_}.
1409
1410 C'est en se servant du langage Scheme que l'on peut résoudre ce
1411 problème.  Dans cet exemple, on a recours aux méthodes décrites dans
1412 @ref{Ajout d'articulation à des notes (exemple)}, en
1413 particulier quant à l'emploi de @code{\displayMusic}.
1414
1415 @example
1416 F = #(let ((m (make-music 'ArticulationEvent
1417                           'articulation-type "flageolet")))
1418        (set! (ly:music-property m 'tweaks)
1419              (acons 'font-size -3
1420                     (ly:music-property m 'tweaks)))
1421        m)
1422
1423 \relative c'' @{
1424   c4^\F c4_\F
1425 @}
1426 @end example
1427
1428 @noindent
1429 Ici les propriétés @code{tweak} de l'objet flageolet nommé
1430 @samp{m} (créé au moyen de @code{make-music}) sont extraites par
1431 @code{ly:music-property}, une nouvelle valeur de la taille de fonte
1432 est ajoutée à la liste de ses propriétés (grâce à la fonction Scheme
1433 @code{acons}), et le résultat de cette opération est renvoyé par
1434 @code{set!}.  Le dernier élément, dans ce bloc @code{let}, est la valeur
1435 finale de @samp{m} lui-même.
1436
1437
1438 @node Retouches complexes
1439 @section Retouches complexes
1440 @translationof Difficult tweaks
1441
1442 Certains réglages sont plus délicats que d'autres.
1443
1444 @itemize
1445 @item
1446 L'un d'entre eux est l'apparence des objets dits @qq{extenseurs}
1447 (@emph{spanner}), qui s'étendent horizontalement, tels que les liaisons.
1448 Si, en principe, un seul de ces objets est créé à la fois et peut donc
1449 être modifié de façon habituelle, lorsque ces objets doivent enjamber un
1450 changement de ligne, ils sont dupliqués au début du ou des systèmes
1451 suivants.  Comme ces objets sont des clones de l'objet d'origine, ils en
1452 héritent toutes les propriétés, y compris les éventuelles commandes
1453 @code{\override}.
1454
1455 En d'autres termes, une commande @code{\override} affecte toujours les
1456 deux extrémités d'un objet @emph{spanner}.  Pour ne modifier que la
1457 partie précédant ou suivant le changement de ligne, il faut intervenir
1458 directement dans le processus de mise en page.
1459 La fonction de rappel @code{after-line-breaking} contient toute
1460 l'opération Scheme effectuée lorsque les sauts de lignes ont été
1461 déterminés, et que des objets graphiques ont été divisés sur des
1462 systèmes différents.
1463
1464 Dans l'exemple suivant, on définit une nouvelle opération nommée
1465 @code{my-callback}.  Cette opération
1466
1467 @itemize
1468 @item
1469 détermine si l'objet a été divisé à l'occasion d'un changement de ligne
1470 @item
1471 dans l'affirmative, recherche les différents morceaux de l'objet
1472 @item
1473 vérifie si l'objet considéré est bien la deuxième moitié d'un objet
1474 divisé
1475 @item
1476 dans l'affirmative, applique un espacement supplémentaire
1477 (@code{extra-offset}).
1478 @end itemize
1479
1480 On ajoute cette procédure à l'objet @rinternals{Tie} (liaison de tenue),
1481 de façon à ce que le deuxième morceau d'une liaison divisée soit
1482 rehaussé.
1483
1484 @c KEEP LY
1485 @lilypond[quote,verbatim,ragged-right]
1486 #(define (my-callback grob)
1487    (let* (
1488           ;; l'objet a-t-il été divisé ?
1489           (orig (ly:grob-original grob))
1490
1491           ;; si oui, rechercher les morceaux frères (siblings)
1492           (siblings (if (ly:grob? orig)
1493                         (ly:spanner-broken-into orig)
1494                         '())))
1495
1496      (if (and (>= (length siblings) 2)
1497               (eq? (car (last-pair siblings)) grob))
1498          (ly:grob-set-property! grob 'extra-offset '(-2 . 5)))))
1499
1500 \relative c'' {
1501   \override Tie.after-line-breaking =
1502   #my-callback
1503   c1 ~ \break
1504   c2 ~ c
1505 }
1506 @end lilypond
1507
1508 @noindent
1509 Lorsque cette astuce va être appliquée, notre nouvelle fonction de
1510 rappel @code{after-line-breaking} devra également appeler celle
1511 d'origine (@code{after-line-breaking}), si elle existe.  Ainsi, pour
1512 l'utiliser dans le cas d'un crescendo (objet @code{Hairpin}), il faudra
1513 également appeler @code{ly:spanner::kill-zero-spanned-time}.
1514
1515
1516 @item
1517 Pour des raisons d'ordre technique, certains objets ne peuvent être
1518 modifiés par @code{\override}.  Parmi ceux-là, les objets
1519 @code{NonMusicalPaperColumn} et @code{PaperColumn}.  La commande
1520 @code{\overrideProperty} sert à les modifier, de façon similaire à
1521 @code{\once \override} mais avec une syntaxe différente :
1522
1523 @example
1524 \overrideProperty
1525 Score.NonMusicalPaperColumn      % Nom de l'objet
1526   . line-break-system-details    % Nom de la propriété
1527   . next-padding                 % Nom de la sous-propriété (optionnel)
1528   . #20                          % Valeur
1529 @end example
1530
1531 Notez toutefois que la commande @code{\override} peut tout de même être
1532 appliquée à @code{NonMusicalPaperColumn} et @code{PaperColumn} dans un
1533 bloc @code{\context}.
1534
1535 @end itemize
1536
1537
1538 @node Interfaces LilyPond Scheme
1539 @chapter Interfaces LilyPond Scheme
1540 @translationof LilyPond Scheme interfaces
1541
1542 Ce chapitre aborde les différents outils fournis par LilyPond à
1543 l'intention des programmeurs en Scheme désireux d'obtenir des
1544 informations à partir et autour des fluxs de musique.
1545
1546 TODO -- figure out what goes in here and how to organize it