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