1.3.3 Doublement d’une note avec liaison (exemple)
Supposons que nous ayons besoin de créer une fonction transformant une
saisie a
en { a( a) }
. Commençons par examiner
comment le résultat est représenté en interne.
\displayMusic{ a'( a') } ===> (make-music 'SequentialMusic 'elements (list (make-music 'NoteEvent 'articulations (list (make-music 'SlurEvent 'span-direction -1)) 'duration (ly:make-duration 2 0 1/1) 'pitch (ly:make-pitch 0 5 0)) (make-music 'NoteEvent 'articulations (list (make-music 'SlurEvent 'span-direction 1)) 'duration (ly:make-duration 2 0 1/1) 'pitch (ly:make-pitch 0 5 0))))
Mauvaise nouvelle ! Les expressions SlurEvent
doivent
s’ajouter « à l’intérieur » de la note – dans sa propriété
articulations
.
Examinons à présent la saisie :
\displayMusic a' ===> (make-music 'NoteEvent 'duration (ly:make-duration 2 0 1/1) 'pitch (ly:make-pitch 0 5 0))))
Nous aurons donc besoin, dans notre fonction, de cloner cette expression
– de telle sorte que les deux notes constituent la séquence – puis
d’ajouter un SlurEvent
à la propriété 'articulations
de
chacune d’elles, et enfin réaliser un SequentialMusic
de ces deux
éléments NoteEvent
. En tenant compte du fait que, dans le cadre
d’un ajout, une propriété non définie est lue '()
(une liste
vide), aucune vérification n’est requise avant d’introduire un nouvel
élément en tête de la propriété articulations
.
doubleSlur = #(define-music-function (note) (ly:music?) "Renvoie : { note ( note ) }. `note' est censé être une note unique." (let ((note2 (ly:music-deep-copy note))) (set! (ly:music-property note 'articulations) (cons (make-music 'SlurEvent 'span-direction -1) (ly:music-property note 'articulations))) (set! (ly:music-property note2 'articulations) (cons (make-music 'SlurEvent 'span-direction 1) (ly:music-property note2 'articulations))) (make-music 'SequentialMusic 'elements (list note note2))))