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