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