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