]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/fr/extending/scheme-tutorial.itely
Merge branch 'master' into translation
[lilypond.git] / Documentation / fr / extending / scheme-tutorial.itely
1 @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*-
2
3 @ignore
4     Translation of GIT committish: e6e64de1da49ff8c6005daa5fd81adc8387b2668
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.11"
12
13 @c Translators: Jean-Charles Malahieude
14
15 @node Tutoriel Scheme
16 @chapter Tutoriel Scheme
17
18 @cindex Scheme
19 @cindex GUILE
20 @cindex Scheme, inclusion de code
21 @cindex accéder à Scheme
22 @cindex évaluation Scheme
23 @cindex LISP
24
25 LilyPond recourt abondamment au langage de programmation Scheme, tant au
26 niveau de la syntaxe de saisie que des mécanismes internes chargés de
27 combiner les différents modules du logiciel.  Les lignes qui suivent
28 constituent un bref aperçu de la manière de saisir des données en
29 Scheme.  Si vous désirez en apprendre plus sur Scheme, n'hésitez pas à
30 vous rendre sur @uref{http://@/www@/.schemers@/.org}.
31
32 Le Scheme utilisé par LilyPond repose sur l'implémentation GNU
33 Guile ; celle-ci se base sur le standard Scheme @qq{R5RS}.  Si
34 votre but est d'apprendre Scheme au travers de LilyPond, sachez que
35 l'utilisation d'une autre implémentation ou d'un autre standard pourrait
36 être source de désagrément.  Vous trouverez plus d'information sur
37 GUILE à la page @uref{http://www.gnu.org/software/guile/} ; le
38 standard Scheme @qq{R5RS} est quant à lui disponible à la page
39 @uref{http://www.schemers.org/Documents/Standards/R5RS/}.
40
41 @menu
42 * Introduction à Scheme::
43 * Scheme et LilyPond::
44 * Construction de fonctions complexes::
45 @end menu
46
47
48 @node Introduction à Scheme
49 @section Introduction à Scheme
50 @translationof Introduction to Scheme
51
52 Nous commencerons par nous intéresser à Scheme et à son fonctionnement,
53 grâce à l'interpréteur GUILE.  Une fois plus à l'aise avec Scheme, nous
54 verrons comment ce langage peut s'intégrer à un fichier LilyPond.
55
56 @menu
57 * Le bac à sable de Scheme::
58 * Scheme et les variables::
59 * Types de données Scheme simples::
60 * Types de données Scheme composites::
61 * Scheme et les calculs::
62 * Scheme et les procédures::
63 * Scheme et les conditions::
64 @end menu
65
66
67 @node Le bac à sable de Scheme
68 @subsection Le bac à sable de Scheme
69 @translationof Scheme sandbox
70
71 L'installation de LilyPond comprend l'implémentation GUILE de Scheme.
72 La plupart des systèmes disposent d'un @qq{bac à sable} Scheme pour
73 effectuer des tests ; vous y accéderez en tapant @qq{guile} dans
74 un terminal.  Certains systèmes, notamment Windows, nécessitent d'avoir
75 auparavant créé la variable d'environnement @code{GUILE_LOAD_PATH} qui
76 devra pointer vers le répertoire @code{../usr/share/guile/1.8} de
77 l'installation de LilyPond -- pour connaître le chemin complet d'accès à
78 ce répertoire, consultez @rlearning{Autres sources de documentation}.
79 Les utilisateurs de Windows peuvent aussi prendre l'option @qq{Exécuter}
80 à partir du menu @qq{Démarrer} puis taper @qq{guile}.
81
82 Néanmoins, tous les paquetages de LilyPond disposent d'un bac à sable
83 Scheme, accessible par la commande :
84 @example
85 lilypond scheme-sandbox
86 @end example
87
88 @noindent
89 Une fois le bac à sable actif, vous obtiendrez l'invite :
90 @lisp
91 guile>
92 @end lisp
93
94 Vous pouvez dès à présent saisir des expressions Scheme pour vous
95 exercer.  Si vous souhaitez pouvoir utiliser la bibliothèque GNU
96 @code{readline}, qui offre une ligne de commande plus élaborée,
97 consultez les informations contenues dans le fichier
98 @file{ly/scheme-sandbox.ly}.  La bibliothèque @var{readline}, dans la
99 mesure où elle est habituellement activée dans vos sessions Guile,
100 devrait être effective y compris dans le bac à sable.
101
102
103 @node Scheme et les variables
104 @subsection Scheme et les variables
105 @translationof Scheme variables
106
107 Une variable Scheme peut contenir n'importe quelle valeur valide en
108 Scheme, y compris une procédure Scheme.
109
110 Une variable Scheme se crée avec la fonction @code{define} :
111
112 @lisp
113 guile> (define a 2)
114 guile>
115 @end lisp
116
117 L'évaluation d'une variable Scheme se réalise en saisissant le nom de
118 cette variable à l'invite de Guile :
119
120 @lisp
121 guile> a
122 2
123 guile>
124 @end lisp
125
126 Une variable Scheme s'affiche à l'écran à l'aide de la fonction
127 @code{display} :
128
129 @lisp
130 guile> (display a)
131 2guile>
132 @end lisp
133
134 @noindent
135 Vous aurez remarqué que la valeur @code{2} et l'invite @code{guile}
136 apparaissent sur une même ligne.  On peut améliorer la présentation à
137 l'aide de la procédure @code{newline} ou bien en affichant un caractère
138 @qq{retour chariot}.
139
140 @lisp
141 guile> (display a)(newline)
142 2
143 guile> (display a)(display "\n")
144 2
145 guile>
146 @end lisp
147
148 Après avoir créé une variable, vous pouvez en modifier la valeur grâce à
149 un @code{set!} :
150
151 @lisp
152 guile> (set! a 12345)
153 guile> a
154 12345
155 guile>
156 @end lisp
157
158 Vous quitterez proprement le bac à sable à l'aide de l'instruction
159 @code{quit} :
160
161 @lisp
162 guile> (quit)
163 @end lisp
164
165
166 @node Types de données Scheme simples
167 @subsection Types de données Scheme simples
168 @translationof Scheme simple data types
169
170 L'un des concepts de base de tout langage est la saisie de données,
171 qu'il s'agisse de nombres, de chaînes de caractères, de listes etc.
172 Voici les différents types de données Scheme simples utilisées
173 couramment dans LilyPond.
174
175 @table @asis
176 @item Booléens
177 Les valeurs booléennes sont vrai ou faux.  En Scheme, ce sera @code{#t}
178 pour vrai, et @code{#f} pour faux.
179 @funindex ##t
180 @funindex ##f
181
182 @item Nombres
183 Les nombres se saisissent le plus communément : @code{1} est le
184 nombre (entier) un, alors que @w{@code{-1.5}} est un nombre à virgule
185 flottante (un nombre non entier).
186
187 @item Chaînes
188 Les chaînes de caractères sont bornées par des guillemets
189 informatiques :
190
191 @example
192 "ceci est une chaîne"
193 @end example
194
195 Une chaîne peut s'étendre sur plusieurs lignes :
196
197 @example
198 "ceci
199 est
200 une chaîne"
201 @end example
202
203 @noindent
204 auquel cas les retours à la ligne seront inclus dans la chaîne.
205
206 Un caractère de retour à la ligne peut s'ajouter dans la chaîne, sous la
207 forme d'un @code{\n}.
208
209 @example
210 "ceci\nest une\nchaîne multiligne"
211 @end example
212
213 Guillemets et obliques inverses dans une chaîne doivent être précédés
214 d'une oblique inverse.  La chaîne @code{\a dit "b"} se saisit donc
215
216 @example
217 "\\a dit \"b\""
218 @end example
219
220 @end table
221
222 Il existe bien d'autres types de données Scheme, dont nous ne parlerons
223 pas ici.  Vous en trouverez une liste exhaustive dans le guide de
224 référence de Guile, à la page
225 @uref{http://www.gnu.org/software/guile/manual/html_node/Simple-Data-Types.html}.
226
227
228 @node Types de données Scheme composites
229 @subsection Types de données Scheme composites
230 @translationof Scheme compound data types
231
232 Scheme prend aussi en charge des types de données composites.  LilyPond
233 utilise beaucoup les paires, listes, listes associatives et tables de
234 hachage.
235
236 @menu
237 * Paires::
238 * Listes::
239 * Listes associatives (alists)::
240 * Tables de hachage::
241 @end menu
242
243
244 @node Paires
245 @unnumberedsubsubsec Paires
246 @translationof Pairs
247
248 Le type de donnée composite fondamental est la paire (@code{pair}).
249 Comme son nom l'indique, il s'agit de lier deux valeurs, à l'aide de
250 l'opérateur @code{cons}.
251
252 @lisp
253 guile> (cons 4 5)
254 (4 . 5)
255 guile>
256 @end lisp
257
258 Vous aurez noté que la paire s'affiche sous la forme de deux éléments
259 bornés par des parenthèses et séparés par une espace, un point
260 (@code{.}) et une autre espace.  Le point n'est en aucune manière un
261 séparateur décimal ; il s'agit de l'indicateur d'une paire.
262
263 Vous pouvez aussi saisir littéralement les valeurs d'une paire, en la
264 faisant précéder d'une apostrophe.
265
266 @lisp
267 guile> '(4 . 5)
268 (4 . 5)
269 guile>
270 @end lisp
271
272 Les deux éléments d'une paire peuvent être constitués de n'importe
273 quelle valeur Scheme valide :
274
275 @lisp
276 guile> (cons #t #f)
277 (#t . #f)
278 guile> '("blah-blah" . 3.1415926535)
279 ("blah-blah" . 3.1415926535)
280 guile>
281 @end lisp
282
283 Les premier et second éléments de la paire sont accessibles à l'aide des
284 procédures Scheme @code{car} et @code{cdr}.
285
286 @lisp
287 guile> (define mypair (cons 123 "hello there")
288 @dots{} )
289 guile> (car mypair)
290 123
291 guile> (cdr mypair)
292 "hello there"
293 guile>
294 @end lisp
295
296 @noindent
297
298 Note : @code{cdr} se prononce @qq{couldeur}, comme l'indiquent Sussman et
299 Abelson -- voir
300 @uref{http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-14.html#footnote_Temp_133}.
301
302
303 @node Listes
304 @unnumberedsubsubsec Listes
305 @translationof Lists
306
307 Autre structure de donnée commune en Scheme : la liste (@emph{list}).
308 Une liste se définit comme étant vide (représentée par @code{'()}) ou
309 une paire dont le @code{cdr} est une liste.
310
311 Il existe plusieurs méthodes pour créer une liste, la plus courante
312 étant l'utilisation de la procédure @code{list} :
313
314 @lisp
315 guile> (list 1 2 3 "abc" 17.5)
316 (1 2 3 "abc" 17.5)
317 @end lisp
318
319 Comme vous le remarquez, une liste s'affiche sous la forme d'une suite
320 d'éléments séparés par une espace, bornée par des parenthèses.
321 Contrairement à une paire, il n'y a pas de point entre les éléments.
322
323 Vous pouvez aussi saisir directement une liste en entourant ses éléments
324 par des parenthèses à la suite d'une apostrophe :
325
326 @lisp
327 guile> '(17 23 "foo" "bar" "bazzle")
328 (17 23 "foo" "bar" "bazzle")
329 @end lisp
330
331 Les listes ont une importance considérable en Scheme.  Certains vont
332 d'ailleurs jusqu'à considérer Scheme comme un dialecte du lisp, où
333 @qq{lisp} serait une abréviation de @qq{List Processing}.  Il est vrai
334 que toute expression Scheme est une liste.
335
336
337 @node Listes associatives (alists)
338 @unnumberedsubsubsec Listes associatives (alists)
339 @translationof Association lists (alists)
340
341 Il existe un type particulier de liste : la @emph{liste associative} --
342 ou @emph{alist}.  Une @emph{alist} permet de stocker des données dans le
343 but de les réutiliser.
344
345 Une liste associative est une liste dont les éléments sont des paires.
346 Le @code{car} de chacun des éléments constitue une clé (@emph{key}) et
347 chaque @code{cdr} une valeur (@emph{value}).  La procédure Scheme
348 @code{assoc} permet de retrouver une entrée de la liste
349 associative ; son @code{cdr} en fournira la valeur :
350
351 @lisp
352 guile> (define mon-alist '((1  . "A") (2 . "B") (3 . "C")))
353 guile> mon-alist
354 ((1 . "A") (2 . "B") (3 . "C"))
355 guile> (assoc 2 mon-alist)
356 (2 . "B")
357 guile> (cdr (assoc 2 mon-alist))
358 "B"
359 guile>
360 @end lisp
361
362 LilyPond recourt abondamment aux @emph{alists} pour stocker des
363 propriétés ou autres données.
364
365
366 @node Tables de hachage
367 @unnumberedsubsubsec Tables de hachage
368 @translationof Hash tables
369
370 Il s'agit d'une structure de données à laquelle LilyPond fait parfois
371 appel.  Une table de hachage (@emph{hash table}) peut se comparer à une
372 matrice ou un tableau dont l'index peut être n'importe quel type de
373 valeur Scheme et ne se limitant pas à des nombres entiers.
374
375 Les tables de hachage sont un moyen plus efficace que les listes
376 associatives lorsqu'il s'agit d'enregistrer de nombreuses données qui ne
377 changeront que peu fréquemment.
378
379 La syntaxe permettant de créer une table de hachage peut paraître
380 complexe, mais vous en trouverez de nombreux exemples dans les sources
381 de LilyPond.
382
383 @lisp
384 guile> (define h (make-hash-table 10))
385 guile> h
386 #<hash-table 0/31>
387 guile> (hashq-set! h 'cle1 "valeur1")
388 "valeur1"
389 guile> (hashq-set! h 'key2 "valeur2")
390 "valeur2"
391 guile> (hashq-set! h 3 "valeur3")
392 "valeur3"
393 @end lisp
394
395 La procédure @code{hashq-ref} permet de récupérer une valeur dans la
396 table de hachage.
397
398 @lisp
399 guile> (hashq-ref h 3)
400 "valeur3"
401 guile> (hashq-ref h 'cle2)
402 "valeur2"
403 guile>
404 @end lisp
405
406 La procédure @code{hashq-get-handle} permet de retrouver à la fois une
407 clé et sa valeur.  Cette procédure a l'avantage de renvoyer @code{#f}
408 lorsque la clé n'existe pas.
409
410 @lisp
411 guile> (hashq-get-handle h 'cle1)
412 (cle1 . "valeur1")
413 guile> (hashq-get-handle h 'zut)
414 #f
415 guile>
416 @end lisp
417
418 @node Scheme et les calculs
419 @subsection Scheme et les calculs
420 @translationof Calculations in Scheme
421
422 @ignore
423 We have been using lists all along.  A calculation, like @code{(+ 1 2)}
424 is also a list (containing the symbol @code{+} and the numbers 1
425 and@tie{}2).  Normally lists are interpreted as calculations, and the
426 Scheme interpreter substitutes the outcome of the calculation.  To enter a
427 list, we stop the evaluation.  This is done by quoting the list with a
428 quote @code{'} symbol.  So, for calculations do not use a quote.
429
430 Inside a quoted list or pair, there is no need to quote anymore.  The
431 following is a pair of symbols, a list of symbols and a list of lists
432 respectively,
433
434 @example
435 #'(stem . head)
436 #'(staff clef key-signature)
437 #'((1) (2))
438 @end example
439 @end ignore
440
441 Scheme permet aussi d'effectuer des calculs.  Il utilise alors un
442 @emph{préfixe}.  Additionner 1 et 2 s'écrira @code{(+ 1 2)} et
443 non @math{1+2} comme on aurait pu s'y attendre.
444
445 @lisp
446 guile> (+ 1 2)
447 3
448 @end lisp
449
450 Les calculs peuvent s'imbriquer ; le résultat d'une fonction peut
451 servir pour un autre calcul.
452
453 @lisp
454 guile> (+ 1 (* 3 4))
455 13
456 @end lisp
457
458 Ces calculs sont un exemple d'évaluation : une expression telle que
459 @code{(* 3 4)} est remplacée par sa valeur, soit @code{12}.
460
461 En matière de calcul, Scheme fait la différence entre des nombres entiers
462 ou non.  Les calculs sur des nombres entiers seront exacts, alors que
463 s'il s'agit de nombres non entiers, les calculs tiendront compte de la
464 précision mentionnée :
465
466 @lisp
467 guile> (/ 7 3)
468 7/3
469 guile> (/ 7.0 3.0)
470 2.33333333333333
471 @end lisp
472
473 Lorsque l'interpréteur Scheme rencontre une expression sous forme de
474 liste, le premier élément de cette liste est considéré en tant que
475 procédure qui prendra en argument le restant de la liste.  C'est la
476 raison pour laquelle, en Scheme, tous les opérateurs sont en préfixe.
477
478 Le fait que le premier élément d'une expression Scheme sous forme de
479 liste ne soit pas un opérateur ou une procédure déclenchera une
480 erreur de la part de l'interpréteur :
481
482 @lisp
483 guile> (1 2 3)
484
485 Backtrace:
486 In current input:
487   52: 0* [1 2 3]
488
489 <unnamed port>:52:1: In expression (1 2 3):
490 <unnamed port>:52:1: Wrong type to apply: 1
491 ABORT: (misc-error)
492 guile>
493 @end lisp
494
495 Vous pouvez constater que l'interpréteur a tenté de considérer @code{1}
496 comme étant un opérateur ou une procédure, ce qu'il n'a pu réaliser.  Il
497 a donc renvoyé l'erreur @qq{Wrong type to apply: 1} (@emph{Application
498 d'un type erroné : 1}).
499
500 C'est pourquoi il est impératif, pour créer une liste, soit d'utiliser
501 l'opérateur consacré (@code{list}), soit de faire précéder la liste
502 d'une apostrophe, de telle sorte que l'interpréteur ne tente pas de
503 l'évaluer.
504
505 @lisp
506 guile> (list 1 2 3)
507 (1 2 3)
508 guile> '(1 2 3)
509 (1 2 3)
510 guile>
511 @end lisp
512
513 Vous pourrez être confronté à cette erreur lorsque vous intégrerez
514 Scheme à LilyPond.
515
516 @ignore
517 The same assignment can be done in completely in Scheme as well,
518
519 @example
520 #(define twentyFour (* 2 twelve))
521 @end example
522
523 @c this next section is confusing -- need to rewrite
524
525 The @emph{name} of a variable is also an expression, similar to a
526 number or a string.  It is entered as
527
528 @example
529 #'twentyFour
530 @end example
531
532 @funindex #'symbol
533 @cindex quoting in Scheme
534
535 The quote mark @code{'} prevents the Scheme interpreter from substituting
536 @code{24} for the @code{twentyFour}.  Instead, we get the name
537 @code{twentyFour}.
538 @end ignore
539
540
541 @node Scheme et les procédures
542 @subsection Scheme et les procédures
543 @translationof Scheme procedures
544
545 Une procédure Scheme est une expression Scheme qui renverra une valeur
546 issue de son exécution.  Les procédures Scheme sont capables de
547 manipuler des variables qui ne sont pas définies en leur sein.
548
549 @menu
550 * Définition de procédures::
551 * Prédicats::
552 * Valeurs de retour::
553 @end menu
554
555
556 @node Définition de procédures
557 @unnumberedsubsubsec Définition de procédures
558 @translationof Defining procedures
559
560 En Scheme, on définit une procédure à l'aide de l'instruction
561 @code{define} :
562
563 @example
564 (define (nom-fonction argument1 argument2@dots{} argumentn)
565  expression-scheme-qui-donnera-une-valeur-en-retour)
566 @end example
567
568 Nous pourrions, par exemple, définir une procédure calculant la moyenne
569 de deux nombres :
570
571 @lisp
572 guile> (define (moyenne x y) (/ (+ x y) 2))
573 guile> moyenne
574 #<procedure moyenne (x y)>
575 @end lisp
576
577 Une fois la procédure définie, on l'appelle en la faisant suivre, dans
578 une liste, des arguments qui doivent l'accompagner.  Calculons
579 maintenant la moyenne de 3 et 12 :
580
581 @lisp
582 guile> (moyenne 3 12)
583 15/2
584 @end lisp
585
586
587 @node Prédicats
588 @unnumberedsubsubsec Prédicats
589 @translationof Predicates
590
591 Une procédure Scheme chargée de retourner une valeur booléenne s'appelle
592 un @qq{prédicat} (@emph{predicate}).  Par convention, plutôt que par
593 nécessité, le nom d'un prédicat se termine par un point
594 d'interrogation :
595
596 @lisp
597 guile> (define (moins-de-dix? x) (< x 10))
598 guile> (moins-de-dix? 9)
599 #t
600 guile> (moins-de-dix? 15)
601 #f
602 @end lisp
603
604
605 @node Valeurs de retour
606 @unnumberedsubsubsec Valeurs de retour
607 @translationof Return values
608
609 Une procédure Scheme doit toujours renvoyer une valeur de retour, en
610 l'occurrence la valeur de la dernière expression exécutée par cette
611 procédure.  La valeur de retour sera une valeur Scheme valide, y compris
612 une structure de donnée complexe ou une procédure.
613
614 On peut avoir besoin de regrouper plusieurs expressions Scheme dans une
615 même procédure.  Deux méthodes permettent de combiner des expressions
616 multiples.  La première consiste à utiliser la procédure @code{begin},
617 qui permet l'évaluation de plusieurs expressions et renvoie la valeur de
618 la dernière expression.
619
620 @lisp
621 guile> (begin (+ 1 2) (- 5 8) (* 2 2))
622 4
623 @end lisp
624
625 Une deuxième méthode consiste à combiner les expressions dans un bloc
626 @code{let}.  Ceci aura pour effet de créer une série de liens, puis
627 d'évaluer en séquence les expressions susceptibles d'inclure ces
628 liens.  La valeur renvoyée par un bloc @emph{let} est la valeur de
629 retour de la dernière clause de ce bloc :
630
631 @lisp
632 guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4))
633 @dots{} (+ (* x y) (/ z x)))
634 508
635 @end lisp
636
637
638 @node Scheme et les conditions
639 @subsection Scheme et les conditions
640 @translationof Scheme conditionals
641
642 @menu
643 * if::
644 * cond::
645 @end menu
646
647
648 @node if
649 @unnumberedsubsubsec if
650 @translationof if
651
652 Scheme dispose d'une procédure @code{if} :
653
654 @example
655 (if expression-test expression-affirmative expression-négative)
656 @end example
657
658 @var{expression-test} est une expression qui renverra une valeur
659 booléenne.  Dans le cas où @var{expression-test} retourne @code{#t}, la
660 procédure @code{if} renvoie la valeur de @var{expression-affirmative},
661 et celle de @var{expression-négative} dans le cas contraire.
662
663 @lisp
664 guile> (define a 3)
665 guile> (define b 5)
666 guile> (if (> a b) "a est plus grand que b" "a n'est pas plus grand que b")
667 "a n'est pas plus grand que b"
668 @end lisp
669
670
671 @node cond
672 @unnumberedsubsubsec cond
673 @translationof cond
674
675 Une autre manière d'introduire une condition en Scheme est d'utiliser
676 l'instruction @code{cond} :
677
678 @example
679 (cond (expression-test-1 expression-résultat-séquence-1)
680       (expression-test-2 expression-résultat-séquence-2)
681       @dots{}
682       (expression-test-n expression-résultat-séquence-n))
683 @end example
684
685 Comme par exemple ici :
686
687 @lisp
688 guile> (define a 6)
689 guile> (define b 8)
690 guile> (cond ((< a b) "a est plus petit que b")
691 @dots{}          ((= a b) "a égale b")
692 @dots{}          ((> a b) "a est plus grand que b"))
693 "a est plus petit que b"
694 @end lisp
695
696
697 @node Scheme et LilyPond
698 @section Scheme et LilyPond
699 @translationof Scheme in LilyPond
700
701 @menu
702 * Syntaxe Scheme dans LilyPond::
703 * Variables LilyPond::
704 * Saisie de variables et Scheme::
705 * Import de code Scheme dans LilyPond::
706 * Propriétés des objets::
707 * Variables LilyPond composites::
708 * Représentation interne de la musique::
709 @end menu
710
711 @node Syntaxe Scheme dans LilyPond
712 @subsection Syntaxe Scheme dans LilyPond
713 @translationof LilyPond Scheme syntax
714
715 @funindex $
716 @funindex #
717
718 L'installation de LilyPond comprenant l'interpréteur Guile, les fichiers
719 source LilyPond peuvent contenir du Scheme.  Vous disposez de plusieurs
720 méthodes pour inclure du Scheme dans vos fichiers LilyPond.
721
722 La méthode la plus simple consiste à insérer un @emph{hash} (le caractère
723 @code{#}, improprement appelé dièse) avant l'expression Scheme.
724
725 Rappelons-nous qu'un fichier source LilyPond est structuré en jetons et
726 expressions, tout comme le langage humain est structuré en mots et
727 phrases.  LilyPond dispose d'un analyseur lexical (appelé @emph{lexer})
728 qui sait identifier les jetons -- nombres, chaînes, éléments Scheme,
729 hauteurs etc. -- ainsi que d'un analyseur syntaxique (appelé
730 @emph{parser}) -- voir 
731 @rcontribnamed{LilyPond grammar, Grammaire de LilyPond}.  Dès lors
732 que le programme sait quelle règle grammaticale particulière doit
733 s'appliquer, il exécute les consignes qui lui sont associées.
734
735 Le recours à un @emph{hash} pour mettre en exergue du Scheme est tout à
736 fait approprié.  Dès qu'il rencontre un @code{#}, l'analyseur lexical
737 passe le relais au lecteur Scheme qui va alors déchiffrer l'intégralité
738 de l'expression Scheme -- ce peut être un identificateur, une expression
739 bornée par des parenthèses ou bien d'autres choses encore.  Une fois
740 cette expression lue, elle est enregistrée en tant que valeur d'un
741 élément grammatical @code{SCM_TOKEN}.  Puisque l'analyseur syntaxique
742 sait comment traiter ce jeton, il charge Guile d'évaluer l'expression
743 Scheme.  Dans la mesure où le @emph{parser} requiert une lecture en
744 avance de la part du @emph{lexer} pour prendre une décision, cette
745 distinction entre lecture et évaluation -- @emph{lexer} et @emph{parser}
746 -- révèle toute sa pertinence lorsqu'il s'agit d'exécuter conjointement
747 des expressions LilyPond et des expressions Scheme.  C'est la raison
748 pour laquelle nous vous recommandons, dans toute la mesure du possible,
749 d'utiliser un signe @emph{hash} lorsque vous faites appel à Scheme.
750
751 Une autre manière de faire appel à l'interpréteur Scheme à partir de
752 LilyPond consiste à introduire une expression Scheme par un caractère
753 dollar au lieu d'un caractère dièse -- un @code{$} au lieu
754 d'un @code{#}.  En pareil cas, LilyPond évalue le code dès sa lecture
755 par l'analyseur lexical, vérifie le type d'expression Scheme qui en
756 résulte et détermine un type de jeton (l'un des @code{xxx_IDENTIFIER} de
757 la grammaire) qui lui corresponde, puis en fait une copie qui servira à
758 traiter la valeur de ce jeton.  Lorsque la valeur de l'expression est
759 @emph{void}, autrement dit une valeur Guile @code{*unspecified*} (pour
760 @emph{non spécifiée}), aucune information n'est transmise à l'analyseur
761 grammatical.
762
763 C'est, en réalité, la manière dont LilyPond opère lorsque vous rappelez
764 une variable ou une fonction par son nom -- au travers d'un @code{\nom}
765 --, à la seule différence que sa finalité est déterminée par l'analyseur
766 lexical de LilyPond sans consultation du lecteur Scheme ; le nom de
767 la variable rappelée doit donc être en corrélation avec le mode LilyPond
768 actif à ce moment là.
769
770 L'immédiateté de l'opérateur @code{$} peut entraîner des effets
771 indésirables dont nous reparlerons à la rubrique
772 @ref{Saisie de variables et Scheme} ; aussi est-il préférable
773 d'utiliser un @code{#} dès que l'analyseur grammatical le supporte.
774 Dans le cadre d'une expression musicale, une expression qui aura été
775 créée à l'aide d'un @code{#} sera interprétée comme étant de la musique.
776 Elle ne sera cependant pas recopiée avant utilisation.  Si la structure
777 qui l'abrite devait être réutilisée, un appel expicite à
778 @code{ly:music-deep-copy} pourrait être requis.
779
780 @funindex $@@
781 @funindex #@@
782
783 Les opérateurs @code{$@@} et @code{#@@} agissent comme des « colleurs de
784 liste » : leur fonction consiste à insérer tous les éléments d'un liste
785 dans le contexte environnant.
786
787 Examinons à présent du vrai code Scheme.  Nous pouvons définir des
788 procédures Scheme au milieu d'un fichier source LilyPond :
789
790 @example
791 #(define (moyenne a b c) (/ (+ a b c) 3))
792 @end example
793
794 Pour mémoire, vous noterez que les commentaires LilyPond (@code{%} ou
795 @code{%@{ %@}}) ne peuvent s'utiliser dans du code Scheme, même si
796 celui-ci se trouve au sein d'un fichier LilyPond.  Ceci tient au fait
797 que l'expression Scheme est lue par l'interpréteur Guile, et en aucune
798 façon par l'analyseur lexical de LilyPond.  Voici comment introduire des
799 commentaires dans votre code Scheme :
800
801 @example
802 ; ceci n'est qu'une simple ligne de commentaire
803
804 #!
805   Ceci constitue un bloc de commentaire (non imbricable)
806   dans le style Guile.
807   En fait, les Schemeurs les utilisent très rarement,
808   et vous n'en trouverez jamais dans le code source
809   de LilyPond.
810 !#
811 @end example
812
813 Dans la suite de notre propos, nous partons du principe que les données
814 sont incluses dans un fichier musical, aussi toutes les expressions
815 Scheme seront introduites par un @code{#}.
816
817 Toutes les expressions Scheme de haut niveau incluses dans un fichier
818 LilyPond peuvent se combiner en une expression Scheme unique à l'aide de
819 la clause @code{begin} :
820
821 @example
822 #(begin
823   (define foo 0)
824   (define bar 1))
825 @end example
826
827
828 @node Variables LilyPond
829 @subsection Variables LilyPond
830 @translationof LilyPond variables
831
832 Les variables LilyPond sont enregistrées en interne sous la forme de
833 variables Scheme.  Ainsi,
834
835 @example
836 douze = 12
837 @end example
838
839 @noindent
840 est équivalant à
841
842 @example
843 #(define douze 12)
844 @end example
845
846 Ceci a pour conséquence que toute variable LilyPond peut être utilisée
847 dans une expression Scheme.  Par exemple, nous pourrions dire
848
849 @example
850 vingtQuatre = #(* 2 douze)
851 @end example
852
853 @noindent
854 ce qui aurait pour conséquence que le nombre 24 sera stocké dans la
855 variable LilyPond (et Scheme) @code{vingtQuatre}.
856
857 La façon habituelle de faire référence à une variable LilyPond consiste
858 à la rappeler à l'aide d'une oblique inverse -- autrement dit saisir
859 @code{\vingtQuatre}.  Dans la mesure où ceci, pour la plupart des types
860 internes de LilyPond y compris les expressions musicales, aura pour
861 effet d'en recopier la valeur, les fonctions musicales n'ont pas pour
862 habitude de créer une copie du matériau qu'elles vont modifier.  De
863 fait, une expression musicale introduite par @code{#} ne devrait pas
864 contenir de matériau inexistant auparavant ou bien littéralement
865 recopié, mais plutôt une référence explicite.
866
867
868 @node Saisie de variables et Scheme
869 @subsection Saisie de variables et Scheme
870 @translationof Input variables and Scheme
871
872 Le format de saisie prend en charge la notion de variable -- ou
873 identificateur.  Dans l'exemple suivant, une expression musicale se voit
874 attribuer un identificateur qui portera le nom de @code{traLaLa}.
875
876 @example
877 traLaLa = @{ c'4 d'4 @}
878 @end example
879
880 @noindent
881
882 Une variable a aussi une portée.  Dans l'exemple suivant, le bloc
883 @code{\layout} contient une variable @code{traLaLa} tout à fait
884 indépendante de l'autre @code{\traLaLa}.
885
886 @example
887 traLaLa = @{ c'4 d'4 @}
888 \layout @{ traLaLa = 1.0 @}
889 @end example
890
891 Dans les faits, chaque fichier a un domaine de compétence, et les
892 différents blocs @code{\header}, @code{\midi} et @code{\layout} ont leur
893 propre champ de compétence, imbriqué dans ce domaine principal.
894
895 Variables et champs de compétence sont implémentés par le système de
896 modules de Guile.  Un module anonyme Scheme est attaché à chacun de ces
897 domaines.  Une assertion telle que
898
899 @example
900 traLaLa = @{ c'4 d'4 @}
901 @end example
902
903 @noindent
904 est convertie, en interne, en une définition Scheme :
905
906 @example
907 (define traLaLa @var{valeur Scheme de `@code{@dots{}}'})
908 @end example
909
910 Cela signifie que variables LilyPond et variables Scheme peuvent tout à
911 fait se mélanger.  Dans l'exemple suivant, un fragment musical est
912 stocké dans la variable @code{traLaLa} puis dupliqué à l'aide de Scheme.
913 Le résultat est alors importé dans un bloc @code{\score} au moyen d'une
914 seconde variable @code{twice}.
915
916 @lilypond[verbatim]
917 traLaLa = { c'4 d'4 }
918
919 #(define newLa (map ly:music-deep-copy
920   (list traLaLa traLaLa)))
921 #(define twice
922   (make-sequential-music newLa))
923
924 \twice
925 @end lilypond
926
927 @c Due to parser lookahead
928
929 Cet exemple est particulièrement intéressant.  L'assignation
930 n'interviendra qu'une fois que l'analyseur grammatical aura l'assurance
931 que rien du type de @code{\addlyrics} ne suit ; il doit donc
932 vérifier ce qui vient après.  Le @emph{parser} lit le @code{#} et
933 l'expression Scheme qui le suit @strong{sans} l'évaluer, de telle sorte
934 qu'il peut procéder à l'assignation, et @strong{ensuite} exécuter le
935 code Scheme sans problème.
936
937
938 @node Import de code Scheme dans LilyPond
939 @subsection Import de code Scheme dans LilyPond
940 @translationof Importing Scheme in LilyPond
941
942 @funindex $
943 @funindex #
944
945 L'exemple précédent illustre la manière @qq{d'exporter} une expression
946 musicale à partir des saisies et à destination de l'interpréteur Scheme.
947 L'inverse est aussi réalisable : en la plaçant derrière un @code{$}, une
948 valeur Scheme sera interprétée comme si elle avait été saisie en
949 syntaxe LilyPond.  Au lieu de définir @code{\twice}, nous aurions tout
950 aussi bien pu écrire
951
952 @example
953 @dots{}
954 $(make-sequential-music (list newLa))
955 @end example
956
957 Vous pouvez utiliser @code{$} suivi d'une expression Scheme partout où
958 vous auriez utilisé @code{\@var{nom}}, dès lors que vous aurez assigné à
959 cette expression Scheme le nom de variable @var{nom}.  La substitution
960 intervenant au niveau de l'analyseur lexical (le @emph{lexer}), LilyPond
961 ne saurait faire la différence.
962
963 Cette manière de procéder comporte cependant un inconvénient au niveau
964 de la temporisation.  Si nous avions défini @code{newLa} avec un
965 @code{$} plutôt qu'un @code{#}, la définition Scheme suivante aurait
966 échoué du fait que @code{traLaLa} n'était pas encore défini.  Pour plus
967 d'information quant au problème de synchronisation, voir la rubrique
968 @ref{Syntaxe Scheme dans LilyPond}.
969
970 @funindex $@@
971 @funindex #@@
972
973 Une autre façon de procéder serait de recourir aux « colleurs de liste »
974 @code{$@@} et @code{#@@} dont la fonction est d'insérer les éléments
975 d'une liste dans le contexte environnant.  Grâce à ces opérateurs, la
976 dernière partie de notre fonction pourrait s'écrire ainsi :
977
978 @example
979 @dots{}
980 @{ #@@newLa @}
981 @end example
982
983 Ici, chaque élément de la liste stockée dans @code{newLa} est pris à
984 son tour et inséré dans la liste, tout comme si nous avions écrit
985
986 @example
987 @{ #(premier newLa) #(deuxième newLa) @}
988 @end example
989
990 Dans ces deux dernières formes, le code Scheme est évalué alors même que
991 le code initial est en cours de traitement, que ce soit par le
992 @emph{lexer} ou par le @emph{parser}.  Si le code Scheme ne doit être
993 exécuté que plus tard, consultez la rubrique
994 @ref{Fonctions Scheme fantômes}, ou stockez le dans une procédure comme
995 ici :
996
997 @example
998 #(define (nopc)
999   (ly:set-option 'point-and-click #f))
1000
1001 @dots{}
1002 #(nopc)
1003 @{ c'4 @}
1004 @end example
1005
1006 @knownissues
1007 L'imbrication de variables Scheme et LilyPond n'est pas possible
1008 avec l'option @option{--safe}.
1009
1010
1011 @node Propriétés des objets
1012 @subsection Propriétés des objets
1013 @translationof Object properties
1014
1015 Les propriétés des objets sont stockées dans LilyPond sous la forme
1016 d'enchaînements de listes associatives, autrement dit des listes de
1017 listes associatives.  Une propriété se détermine par l'ajout de valeurs
1018 en début de liste de cette propriété.  Les caractéristiques d'une
1019 propriété s'ajustent donc à la lecture des différentes valeurs des
1020 listes associatives.
1021
1022 La modification d'une valeur pour une propriété donnée requiert
1023 l'assignation d'une valeur de la liste associative, tant pour la clé que
1024 la valeur associée.  Voici comment procéder selon la syntaxe de
1025 LilyPond :
1026
1027 @example
1028 \override Stem.thickness = #2.6
1029 @end example
1030
1031 Cette instruction ajuste l'apparence des hampes.  Une entrée
1032 @w{@code{'(thickness . 2.6)}} de la @emph{alist} est ajoutée à la liste
1033 de la propriété de l'objet @code{Stem}.  @code{thickness} devant
1034 s'exprimer en unité d'épaisseur de ligne, les hampes auront donc une
1035 épaisseur de 2,6 ligne de portée, et à peu près le double de leur
1036 épaisseur normale.  Afin de faire la distinction entre les variables que
1037 vous définissez au fil de vos fichiers -- tel le @code{vingtQuatre} que
1038 nous avons vu plus haut -- et les variables internes des objets, nous
1039 parlerons de @qq{propriétés} pour ces dernières, et de @qq{variables}
1040 pour les autres.  Ainsi, l'objet hampe possède une propriété
1041 @code{thickness}, alors que @code{vingtQuatre} est une variable.
1042
1043 @cindex propriétés ou variables
1044 @cindex variables ou propriétés
1045
1046 @c  todo -- here we're getting interesting.  We're now introducing
1047 @c  LilyPond variable types.  I think this deserves a section all
1048 @c  its own
1049
1050
1051 @node Variables LilyPond composites
1052 @subsection Variables LilyPond composites
1053 @translationof LilyPond compound variables
1054
1055 @menu
1056 * Décalages (offsets)::
1057 * Fractions::
1058 * Étendues (extents)::
1059 * Propriété en alists::
1060 * Chaînes d'alist::
1061 @end menu
1062
1063
1064 @node Décalages (offsets)
1065 @unnumberedsubsubsec Décalages (@emph{offsets})
1066 @translationof Offsets
1067
1068 Les décalages (@emph{offset}) sur deux axes (coordonnées X et Y) sont
1069 stockés sous forme de @emph{paires}. Le @code{car} de l'offset
1070 correspond à l'abscisse (coordonnée X) et le @code{cdr} à l'ordonnée
1071 (coordonnée Y).
1072
1073 @example
1074 \override TextScript.extra-offset = #'(1 . 2)
1075 @end example
1076
1077 Cette clause affecte la paire @code{(1 . 2)} à la propriété
1078 @code{extra-offset} de l'objet @code{TextScript}.  Ces nombres sont
1079 exprimés en espace de portée.  La commande aura donc pour effet de
1080 déplacer l'objet d'un espace de portée vers la droite, et de deux
1081 espaces vers le haut.
1082
1083 Les procédures permettant de manipuler les offsets sont regroupées dans
1084 le fichier @file{scm/lily-library.scm}.
1085
1086
1087 @node Fractions
1088 @unnumberedsubsubsec Fractions
1089 @translationof Fractions
1090
1091 Les fractions, tel que LilyPond les utilise, sont aussi stockées sous
1092 forme de @emph{paire}.  Alors que Scheme est tout à fait capable de
1093 représenter des nombres rationnels, vous conviendrez que, musicalement
1094 parlant, @samp{2/4} et @samp{1/2} ne se valent pas ; nous devrons
1095 donc pouvoir les distinguer.  Dans le même ordre d'idée, LilyPond ne
1096 connaît pas les @qq{fractions} négatives.  Pour ces raisons, @code{2/4}
1097 en LilyPond correspond à @code{(2 . 4)} en Scheme, et @code{#2/4} en
1098 LilyPond correspond à @code{1/2} en Scheme.
1099
1100
1101 @node Étendues (extents)
1102 @unnumberedsubsubsec Étendues (@emph{extents})
1103 @translationof Extents
1104
1105 Les paires permettent aussi de stocker des intervalles qui représentent
1106 un ensemble de nombres compris entre un minimum (le @code{car}) et un
1107 maximum (le @code{cdr}).  Ces intervalles stockent l'étendue, tant au
1108 niveau horizontal (X) que vertical (Y) des objets imprimables.  En
1109 matière d'étendue sur les X, le @code{car} correspond à la coordonnée de
1110 l'extrémité gauche, et le @code{cdr} à la coordonnée de l'extrémité
1111 droite.  En matière d'étendue sur les Y, le @code{car} correspond à la
1112 coordonnée de l'extrémité basse, et le @code{cdr} à la coordonnée de
1113 l'extrémité haute.
1114
1115 Les procédures permettant de manipuler les offsets sont regroupées dans
1116 le fichier @file{scm/lily-library.scm}.  Nous vous recommandons
1117 l'utilisation de ces procédures dans toute la mesure du possible afin
1118 d'assurer la cohérence du code.
1119
1120
1121 @node Propriété en alists
1122 @unnumberedsubsubsec Propriété en @emph{alists}
1123 @translationof Property alists
1124
1125 Les propriétés en @emph{alists} sont des structures de données
1126 particulières à LilyPond.  Il s'agit de listes associatives dont les
1127 clés sont des propriétés et les valeurs des expressions Scheme
1128 fournissant la valeur requise pour cette propriété.
1129
1130 Les propriétés LilyPond sont des symboles Scheme, à l'instar de
1131 @code{'thickness}.
1132
1133
1134 @node Chaînes d'alist
1135 @unnumberedsubsubsec Chaînes d'@emph{alist}
1136 @translationof Alist chains
1137
1138 Une chaîne d'@emph{alist} est une liste contenant les listes
1139 associatives d'une propriété.
1140
1141 L'intégralité du jeu de propriétés qui doivent s'appliquer à un objet
1142 graphique est en fait stocké en tant que chaîne d'@emph{alist}.  Afin
1143 d'obtenir la valeur d'une propriété particulière qu'un objet graphique
1144 devrait avoir, on examinera chacune des listes associatives de la
1145 chaîne, à la recherche d'une entrée contenant la clé de cette propriété.
1146 Est renvoyée la première entrée d'@emph{alist} trouvée, sa valeur étant
1147 la valeur de la propriété.
1148
1149 L'obtention des valeurs de propriété des objets graphiques se réalise en
1150 principe à l'aide de la procédure Scheme @code{chain-assoc-get}.
1151
1152
1153 @node Représentation interne de la musique
1154 @subsection Représentation interne de la musique
1155 @translationof Internal music representation
1156
1157 Dans les entrailles du programme, la musique se présente comme une liste
1158 Scheme.  Cette liste comporte les différents éléments qui affecteront la
1159 sortie imprimable.  L'analyse grammaticale (l'opération @emph{parsing})
1160 est le processus chargé de convertir la musique représentée par le code
1161 LilyPond en présentation interne Scheme.
1162
1163 L'analyse d'une expression musicale se traduit par un jeu d'objets
1164 musicaux en Scheme.  Une objet musical est déterminé par le temps qu'il
1165 occupe, que l'on appelle @emph{durée}.  Les durées s'expriment par des
1166 nombres rationnels représentant la longueur d'un objet musical par
1167 rapport à la ronde.
1168
1169 Un objet musical dispose de trois types :
1170 @itemize
1171 @item
1172 un nom de musique : Toute expression musicale a un nom.  Par exemple,
1173 une note amène à un @rinternals{NoteEvent}, un @code{\simultaneous} à un
1174 @rinternals{SimultaneousMusic}.  Une liste exhaustive des différentes
1175 expressions est disponible dans la référence des propriétés internes, à
1176 la rubrique @rinternals{Music expressions}.
1177
1178 @item
1179 un @qq{type} ou interface : Tout nom de musique dispose de
1180 plusieurs types ou interfaces.  Ainsi, une note est tout à la fois un
1181 @code{event}, un @code{note-event}, un @code{rhythmic-event} et un
1182 @code{melodic-event}.  Les différentes classes musicales sont
1183 répertoriées à la rubrique @rinternals{Music classes} de la référence
1184 des propriétés internes.
1185
1186 @item
1187 un objet C++ : Tout objet musical est représenté par un objet de la
1188 classe C++ @code{Music}.
1189 @end itemize
1190
1191 L'information réelle d'une expression musicale est enregistrée sous
1192 forme de propriétés.  Par exemple, un @rinternals{NoteEvent} dispose des
1193 propriétés @code{pitch} et @code{duration}, respectivement chargées de
1194 stocker la hauteur et la durée de cette note.  Les différentes
1195 propriétés sont répertoriées à la rubrique @rinternals{Music properties}
1196 de la référence des propriétés internes.
1197
1198 Une expression composite est un objet musical dont les propriétés
1199 contiennent d'autres objets musicaux.  S'il s'agit d'une liste d'objets,
1200 elle sera stockée dans la propriété @code{elements} d'un objet
1201 musical ; s'il n'y a qu'un seul objet @qq{enfant}, il sera stocké
1202 dans la propriété @code{element}.  Ainsi, par exemple, les enfants de
1203 @rinternals{SequentialMusic} iront dans @code{elements}, alors que
1204 l'argument unique de @rinternals{GraceMusic} ira dans @code{element}.
1205 De même, le corps d'une répétition ira dans la propriété @code{element}
1206 d'un @rinternals{RepeatedMusic}, les alternatives quant à elles dans la
1207 propriété @code{elements}.
1208
1209
1210 @node Construction de fonctions complexes
1211 @section Construction de fonctions complexes
1212 @translationof Building complicated functions
1213
1214 Nous allons voir dans cette partie les moyens dont vous disposez pour
1215 obtenir les informations qui vous permettront de créer vos propres
1216 fonctions musicales complexes.
1217
1218 @menu
1219 * Affichage d'expressions musicales::
1220 * Propriétés musicales::
1221 * Doublement d'une note avec liaison (exemple)::
1222 * Ajout d'articulation à des notes (exemple)::
1223 @end menu
1224
1225
1226 @node Affichage d'expressions musicales
1227 @subsection Affichage d'expressions musicales
1228 @translationof Displaying music expressions
1229
1230 @cindex stockage interne
1231 @cindex expression musicale, affichage
1232 @cindex représentation interne, affichage
1233 @cindex displayMusic
1234 @funindex \displayMusic
1235
1236 Lorsque l'on veut écrire une fonction musicale, il est intéressant
1237 d'examiner comment une expression musicale est représentée en interne.
1238 Vous disposez à cet effet de la fonction musicale @code{\displayMusic}.
1239
1240 @example
1241 @{
1242   \displayMusic @{ c'4\f @}
1243 @}
1244 @end example
1245
1246 @noindent
1247 affichera
1248
1249 @example
1250 (make-music
1251   'SequentialMusic
1252   'elements
1253   (list (make-music
1254           'NoteEvent
1255           'articulations
1256           (list (make-music
1257                   'AbsoluteDynamicEvent
1258                   'text
1259                   "f"))
1260           'duration
1261           (ly:make-duration 2 0 1/1)
1262           'pitch
1263           (ly:make-pitch 0 0 0))))
1264 @end example
1265
1266 Par défaut, LilyPond affichera ces messages sur la console, parmi toutes
1267 les autres informations.  Vous pouvez, afin de les isoler et de garder
1268 le résultat des commandes @code{\display@{TRUC@}}, rediriger la sortie
1269 vers un fichier :
1270
1271 @example
1272 lilypond file.ly >display.txt
1273 @end example
1274
1275 Un peu de Scheme combiné à notre code LilyPond, et les seules
1276 informations qui nous intéressent se retrouveront directement dans un
1277 fichier indépendant :
1278
1279 @example
1280 @{
1281   #(with-output-to-file "display.txt"
1282       (lambda () #@{ \displayMusic @{ c'4\f @} #@}))
1283 @}
1284 @end example
1285
1286 L'information sera encore plus lisible après un peu de mise en forme :
1287
1288 @example
1289 (make-music 'SequentialMusic
1290   'elements (list
1291              (make-music 'NoteEvent
1292                'articulations (list
1293                                (make-music 'AbsoluteDynamicEvent
1294                                  'text
1295                                  "f"))
1296                'duration (ly:make-duration 2 0 1/1)
1297                'pitch    (ly:make-pitch 0 0 0))))
1298 @end example
1299
1300 Une séquence musicale @code{@{ @dots{} @}} se voit attribuer le nom de
1301 @code{SequentialMusic}, et les expressions qu'elle contient sont
1302 enregistrées en tant que liste dans sa propriété @code{'elements}.  Une
1303 note est représentée par un objet @code{NoteEvent} -- contenant les
1304 propriétés de durée et hauteur -- ainsi que l'information qui lui est
1305 attachée -- en l'occurrence un @code{AbsoluteDynamicEvent} ayant une
1306 propriété @code{text} de valeur @code{"f"} -- et stockée dans sa
1307 propriété @code{articulations}.
1308
1309 @funindex{\void}
1310 La fonction @code{\displayMusic} renvoie la musique qu'elle
1311 affiche ; celle-ci sera donc aussi interprétée.  L'insertion d'une
1312 commande @code{\void} avant le @code{\displayMusic} permet de
1313 s'affranchir de la phase d'interprétation.
1314
1315
1316 @node Propriétés musicales
1317 @subsection Propriétés musicales
1318 @translationof Music properties
1319
1320 Nous abordons ici les propriétés @emph{music}, et non pas les propriétés
1321 @emph{context} ou @emph{layout}.
1322
1323 Partons de cet exemple simple@tie{}:
1324
1325 @example
1326 someNote = c'
1327 \displayMusic \someNote
1328 ===>
1329 (make-music
1330   'NoteEvent
1331   'duration
1332   (ly:make-duration 2 0 1/1)
1333   'pitch
1334   (ly:make-pitch 0 0 0))
1335 @end example
1336
1337 L'objet @code{NoteEvent} est la représentation brute de @code{someNote}.
1338 Voyons ce qui se passe lorsque nous plaçons ce @notation{c'} dans une
1339 construction d'accord :
1340
1341 @example
1342 someNote = <c'>
1343 \displayMusic \someNote
1344 ===>
1345 (make-music
1346   'EventChord
1347   'elements
1348   (list (make-music
1349           'NoteEvent
1350           'duration
1351           (ly:make-duration 2 0 1/1)
1352           'pitch
1353           (ly:make-pitch 0 0 0))))
1354 @end example
1355
1356 L'objet @code{NoteEvent} est maintenant le premier objet de la propriété
1357 @code{'elements} de @code{someNote}.
1358
1359 @code{\displayMusic} utilise la fonction @code{display-scheme-music}
1360 pour afficher la représentation en Scheme d'une expression musicale :
1361
1362 @example
1363 #(display-scheme-music (first (ly:music-property someNote 'elements)))
1364 ===>
1365 (make-music
1366   'NoteEvent
1367   'duration
1368   (ly:make-duration 2 0 1/1)
1369   'pitch
1370   (ly:make-pitch 0 0 0))
1371 @end example
1372
1373 La hauteur de la note est accessible au travers de la propriété
1374 @code{'pitch} de l'objet @code{NoteEvent} :
1375
1376 @example
1377 #(display-scheme-music
1378    (ly:music-property (first (ly:music-property someNote 'elements))
1379                       'pitch))
1380 ===>
1381 (ly:make-pitch 0 0 0)
1382 @end example
1383
1384 La hauteur de la note se modifie en définissant sa propriété
1385 @code{'pitch}@tie{}:
1386
1387 @funindex \displayLilyMusic
1388
1389 @example
1390 #(set! (ly:music-property (first (ly:music-property someNote 'elements))
1391                           'pitch)
1392        (ly:make-pitch 0 1 0)) ;; set the pitch to d'.
1393 \displayLilyMusic \someNote
1394 ===>
1395 d'
1396 @end example
1397
1398
1399 @node Doublement d'une note avec liaison (exemple)
1400 @subsection Doublement d'une note avec liaison (exemple)
1401 @translationof Doubling a note with slurs (example)
1402
1403 Supposons que nous ayons besoin de créer une fonction transformant une
1404 saisie @code{a} en @w{@code{@{ a( a) @}}}.  Commençons par examiner
1405 comment le résultat est représenté en interne.
1406
1407 @example
1408 \displayMusic@{ a'( a') @}
1409 ===>
1410 (make-music
1411   'SequentialMusic
1412   'elements
1413   (list (make-music
1414           'NoteEvent
1415           'articulations
1416           (list (make-music
1417                   'SlurEvent
1418                   'span-direction
1419                   -1))
1420           'duration
1421           (ly:make-duration 2 0 1/1)
1422           'pitch
1423           (ly:make-pitch 0 5 0))
1424         (make-music
1425           'NoteEvent
1426           'articulations
1427           (list (make-music
1428                   'SlurEvent
1429                   'span-direction
1430                   1))
1431           'duration
1432           (ly:make-duration 2 0 1/1)
1433           'pitch
1434           (ly:make-pitch 0 5 0))))
1435 @end example
1436
1437 Mauvaise nouvelle ! Les expressions @code{SlurEvent} doivent
1438 s'ajouter @qq{à l'intérieur} de la note -- dans sa propriété
1439 @code{articulations}.
1440
1441 Examinons à présent la saisie :
1442
1443 @example
1444 \displayMusic a'
1445 ===>
1446 (make-music
1447   'NoteEvent
1448   'duration
1449   (ly:make-duration 2 0 1/1)
1450   'pitch
1451   (ly:make-pitch 0 5 0))))
1452 @end example
1453
1454 Nous aurons donc besoin, dans notre fonction, de cloner cette expression
1455 -- de telle sorte que les deux notes constituent la séquence -- puis
1456 d'ajouter un @code{SlurEvent} à la propriété @code{'articulations} de
1457 chacune d'elles, et enfin réaliser un @code{SequentialMusic} de ces deux
1458 éléments @code{NoteEvent}.  En tenant compte du fait que, dans le cadre
1459 d'un ajout, une propriété non définie est lue @code{'()} (une liste
1460 vide), aucune vérification n'est requise avant d'introduire un nouvel
1461 élément en tête de la propriété @code{articulations}.
1462
1463 @example
1464 doubleSlur = #(define-music-function (parser location note) (ly:music?)
1465          "Renvoie : @{ note ( note ) @}.
1466          `note' est censé être une note unique."
1467          (let ((note2 (ly:music-deep-copy note)))
1468            (set! (ly:music-property note 'articulations)
1469                  (cons (make-music 'SlurEvent 'span-direction -1)
1470                        (ly:music-property note 'articulations)))
1471            (set! (ly:music-property note2 'articulations)
1472                  (cons (make-music 'SlurEvent 'span-direction 1)
1473                        (ly:music-property note2 'articulations)))
1474            (make-music 'SequentialMusic 'elements (list note note2))))
1475 @end example
1476
1477
1478 @node Ajout d'articulation à des notes (exemple)
1479 @subsection Ajout d'articulation à des notes (exemple)
1480 @translationof Adding articulation to notes (example)
1481
1482 Le moyen d'ajouter une articulation à des notes consiste à fusionner
1483 deux expressions musicales en un même contexte.  L'option de réaliser
1484 nous-mêmes une fonction musicale à cette fin nous offre l'avantage de
1485 pouvoir alors ajouter une articulation, telle qu'une instruction de
1486 doigté, individuellement à l'une des notes d'un accord, ce qui est
1487 impossible dans le cadre d'une simple fusion de musique indépendante.
1488
1489 Un @code{$variable} au milieu de la notation @code{#@{ @dots{} #@}} se
1490 comporte exactement comme un banal @code{\variable} en notation LilyPond
1491 traditionnelle.  Nous savons déjà que
1492
1493 @example
1494 @{ \musique -. -> @}
1495 @end example
1496
1497 @noindent
1498 n'est pas admis par LilyPond.  Nous pourrions tout à fait contourner ce
1499 problème en attachant l'articulation à un accord vide,
1500
1501 @example
1502 @{ << \musique <> -. -> >> @}
1503 @end example
1504
1505 @noindent
1506 mais, pour les besoins de la démonstration, nous allons voir comment
1507 réaliser ceci en Scheme.  Commençons par examiner une saisie simple et
1508 le résultat auquel nous désirons aboutir :
1509
1510 @example
1511 %  saisie
1512 \displayMusic c4
1513 ===>
1514 (make-music
1515   'NoteEvent
1516   'duration
1517   (ly:make-duration 2 0 1/1)
1518   'pitch
1519   (ly:make-pitch -1 0 0))))
1520 =====
1521 %  résultat attendu
1522 \displayMusic c4->
1523 ===>
1524 (make-music
1525   'NoteEvent
1526   'articulations
1527   (list (make-music
1528           'ArticulationEvent
1529           'articulation-type
1530           "accent"))
1531   'duration
1532   (ly:make-duration 2 0 1/1)
1533   'pitch
1534   (ly:make-pitch -1 0 0))
1535 @end example
1536
1537 Nous voyons qu'une note (@code{c4}) est représentée par une expression
1538 @code{NoteEvent}.  Si nous souhaitons ajouter une articulation
1539 @notation{accent}, nous devrons ajouter une expression
1540 @code{ArticulationEvent} à la propriété @code{articulations} de
1541 l'expression @code{NoteEvent}.
1542
1543 Construisons notre fonction en commençant par
1544
1545 @example
1546 (define (ajoute-accent note-event)
1547   "Ajoute un accent (ArticulationEvent) aux articulations de `note-event',
1548   qui est censé être une expression NoteEvent."
1549   (set! (ly:music-property note-event 'articulations)
1550         (cons (make-music 'ArticulationEvent
1551                 'articulation-type "accent")
1552               (ly:music-property note-event 'articulations)))
1553   note-event)
1554 @end example
1555
1556 La première ligne est la manière de définir une fonction en Scheme : la
1557 fonction Scheme a pour nom @code{ajoute-accent} et elle comporte une
1558 variable appelée @code{note-event}.  En Scheme, le type d'une variable
1559 se déduit la plupart de temps de par son nom -- c'est d'ailleurs une
1560 excellente pratique que l'on retrouve dans de nombreux autres langages.
1561
1562 @example
1563 "Ajoute un accent@dots{}"
1564 @end example
1565
1566 @noindent
1567 décrit ce que fait la fonction.  Bien que ceci ne soit pas primordial,
1568 tout comme des noms de variable évidents, tâchons néanmoins de prendre
1569 de bonnes habitudes dès nos premiers pas.
1570
1571 Vous pouvez vous demander pourquoi nous modifions directement
1572 l'événement note plutôt que d'en manipuler une copie -- on pourrait
1573 utiliser @code{ly:music-deep-copy} à cette fin.  La raison en est qu'il
1574 existe un contrat tacite : les fonctions musicales sont autorisées
1575 à modifier leurs arguments -- ils sont générés en partant de zéro (comme
1576 les notes que vous saisissez) ou déjà recopiés (faire référence à une
1577 variable musicale avec @samp{\name} ou à de la musique issue
1578 d'expressions Scheme @samp{$(@dots{})} aboutit à une copie).  Dans la
1579 mesure où surmultiplier les copies serait contre productif, la valeur de
1580 retour d'une fonction musicale n'est @strong{pas} recopiée.  Afin de
1581 respecter ce contrat, n'utilisez pas un même argument à plusieurs
1582 reprises, et n'oubliez pas que le retourner compte pour une utilisation.
1583
1584 Dans un exemple précédent, nous avons construit de la musique en
1585 répétant un certain argument musical.  Dans ce cas là, l'une des
1586 répétitions se devait d'être une copie.  Dans le cas contraire,
1587 certaines bizarreries auraient pu survenir.  Par exemple, la présence
1588 d'un @code{\relative} ou d'un @code{\transpose}, après plusieurs
1589 répétitions du même élément, entraînerait des @qq{relativisations} ou
1590 transpositions en cascade.  Si nous les assignons à une variable
1591 musicale, l'enchaînement est rompu puisque la référence à @samp{\nom}
1592 créera une nouvelle copie sans toutefois prendre en considération
1593 l'identité des éléments répétés.
1594
1595 Cette fonction n'étant pas une fonction musicale à part entière, elle
1596 peut s'utiliser dans d'autres fonctions musicales.  Il est donc sensé de
1597 respecter le même contrat que pour les fonctions musicales :
1598 l'entrée peut être modifiée pour arriver à une sortie, et il est de la
1599 responsabilité de l'appelant d'effectuer des copies s'il a réellement
1600 besoin de l'argument dans son état originel.  Vous constaterez, à la
1601 lecture des fonctions propres à LilyPond, comme @code{music-map}, que ce
1602 principe est toujours respecté.
1603
1604 Revenons à nos moutons@dots{} Nous disposons maintenant d'un
1605 @code{note-event} que nous pouvons modifier, non pas grâce à un
1606 @code{ly:music-deep-copy}, mais plutôt en raison de notre précédente
1607 réflexion.  Nous ajoutons @notation{l'accent} à la liste de ses
1608 propriétés @code{'articulations}.
1609
1610 @example
1611 (set! emplacement nouvelle-valeur)
1612 @end example
1613
1614 L'emplacement est ce que nous voulons ici définir.  Il s'agit de la
1615 propriété @code{'articulations} de l'expression @code{note-event}.
1616
1617 @example
1618 (ly:music-property note-event 'articulations)
1619 @end example
1620
1621 La fonction @code{ly:music-property} permet d'accéder aux propriétés
1622 musicales -- les @code{'articulations}, @code{'duration}, @code{'pitch}
1623 etc. que @code{\displayMusic} nous a indiquées.  La nouvelle valeur sera
1624 l'ancienne propriété @code{'articulations}, augmentée d'un
1625 élément : l'expression @code{ArticulationEvent}, que nous
1626 recopions à partir des informations de @code{\displayMusic}.
1627
1628 @example
1629 (cons (make-music 'ArticulationEvent
1630         'articulation-type "accent")
1631       (ly:music-property result-event-chord 'articulations))
1632 @end example
1633
1634 @code{cons} permet d'ajouter un élément en tête de liste sans pour
1635 autant modifier la liste originale.  C'est exactement ce que nous
1636 recherchons : la même liste qu'auparavant, plus la nouvelle
1637 expression @code{ArticulationEvent}.  L'ordre au sein de la propriété
1638 @code{'articulations} n'a ici aucune importance.
1639
1640 Enfin, après avoir ajouté l'articulation @notation{accent} à sa
1641 propriété @code{articulations}, nous pouvons renvoyer le
1642 @code{note-event}, ce que réalise la dernière ligne de notre fonction.
1643
1644 Nous pouvons à présent transformer la fonction @code{ajoute-accent} en
1645 fonction musicale, à l'aide d'un peu d'enrobage syntaxique et mention du
1646 type de son unique argument @qq{réel}.
1647
1648 @example
1649 ajouteAccent = #(define-music-function (parser location note-event)
1650                                         (ly:music?)
1651   "Ajoute un accent (ArticulationEvent) aux articulations de `note-event',
1652   qui est censé être une expression NoteEvent."
1653   (set! (ly:music-property note-event 'articulations)
1654         (cons (make-music 'ArticulationEvent
1655                 'articulation-type "accent")
1656               (ly:music-property note-event 'articulations)))
1657   note-event)
1658 @end example
1659
1660 Par acquis de conscience, vérifions que tout ceci fonctione :
1661
1662 @example
1663 \displayMusic \ajouteAccent c4
1664 @end example
1665
1666
1667
1668 @ignore
1669 @menu
1670 * Tweaking with Scheme::
1671 @end menu
1672
1673 @c @nod e Tweaking with Scheme
1674 @c @sectio n Tweaking with Scheme
1675
1676 We have seen how LilyPond output can be heavily modified using
1677 commands like
1678 @code{\override TextScript.extra-offset = ( 1 . -1)}.  But
1679 we have even more power if we use Scheme.  For a full explanation
1680 of this, see the @ref{Scheme tutorial}, and
1681 @ref{Interfaces for programmers}.
1682
1683 We can use Scheme to simply @code{\override} commands,
1684
1685 TODO Find a simple example
1686 @c This isn't a valid example with skylining
1687 @c It works fine without padText  -td
1688 @end ignore
1689
1690 @ignore
1691 @lilypond[quote,verbatim,ragged-right]
1692 padText = #(define-music-function (parser location padding) (number?)
1693 #{
1694   \once \override TextScript.padding = #padding
1695 #})
1696
1697 \relative c''' {
1698   c4^"piu mosso" b a b
1699   \padText #1.8
1700   c4^"piu mosso" d e f
1701   \padText #2.6
1702   c4^"piu mosso" fis a g
1703 }
1704 @end lilypond
1705 @end ignore
1706
1707 @ignore
1708 We can use it to create new commands:
1709
1710 @c Check this is a valid example with skylining
1711 @c It is - 'padding still works
1712
1713
1714 @lilypond[quote,verbatim,ragged-right]
1715 tempoPadded = #(define-music-function (parser location padding tempotext)
1716   (number? markup?)
1717 #{
1718   \once \override Score.MetronomeMark.padding = #padding
1719   \tempo \markup { \bold #tempotext }
1720 #})
1721
1722 \relative c'' {
1723   \tempo \markup { "Low tempo" }
1724   c4 d e f g1
1725   \tempoPadded #4.0 "High tempo"
1726   g4 f e d c1
1727 }
1728 @end lilypond
1729
1730
1731 Even music expressions can be passed in:
1732
1733 @lilypond[quote,verbatim,ragged-right]
1734 pattern = #(define-music-function (parser location x y) (ly:music? ly:music?)
1735 #{
1736   #x e8 a b $y b a e
1737 #})
1738
1739 \relative c''{
1740   \pattern c8 c8\f
1741   \pattern {d16 dis} { ais16-> b\p }
1742 }
1743 @end lilypond
1744 @end ignore