A.3.3 Duplicació una nota amb lligadures (exemple)
Suposem que volem crear una funció que converteix una entrada com
a a { a( a) }. Comencem examinant la
representació interna de la música amb la que volem terminar.
\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))))
La mala notícia és que les expressions SlurEvent s’han
d’afegir ‘dins’ de la nota (dins de la propietat
articulations).
Ara examinem l’entrada.
\displayMusic a' ===> (make-music 'NoteEvent 'duration (ly:make-duration 2 0 1/1) 'pitch (ly:make-pitch 0 5 0))))
Així doncs, en la nostra funció, hem de clonar aquesta expressió
(de forma que tinguem dues notes per construir la seqüència),
afegir SlurEvent a la propietat 'articulations de
cada una d’elles, i per últim fer una seqüència
SequentialMusic amb els dos elements NoteEvent.
Per afegir a una propietat, és útil saber que una propietat no
establerta es llegeix com a '(), la llista buida, així que
no es requereix cap comprovació especial abans que posem un altre
element endavant de la propietat articulations.
doubleSlur = #(define-music-function (note) (ly:music?)
"Return: { note ( note ) }.
`note' se suposa que és un nota única."
(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))))