Extender LilyPond: A.3.3 Duplicar una nota con ligaduras (ejemplo)

### A.3.3 Duplicar una nota con ligaduras (ejemplo)

Supongamos que queremos crear una función que convierte una entrada como `a` en `a( a)`. Comenzamos examinando la representación interna de la música con la que queremos terminar.

>     \displayMusic{ a'( a') }
>     ===>
>     (make-music
>       'SequentialMusic
>       'elements
>       (list (make-music
>               'EventChord
>               'elements
>               (list (make-music
>                       'NoteEvent
>                       'duration
>                       (ly:make-duration 2 0 1 1)
>                       'pitch
>                       (ly:make-pitch 0 5 0))
>                     (make-music
>                       'SlurEvent
>                       'span-direction
>                       -1)))
>             (make-music
>               'EventChord
>               'elements
>               (list (make-music
>                       'NoteEvent
>                       'duration
>                       (ly:make-duration 2 0 1 1)
>                       'pitch
>                       (ly:make-pitch 0 5 0))
>                     (make-music
>                       'SlurEvent
>                       'span-direction
>                       1)))))

Las malas noticias son que las expresiones `SlurEvent` se deben añadir ‘dentro’ de la nota (o para ser más exactos, dentro de la expresión `EventChord`).

Ahora examinamos la entrada,

>     (make-music
>       'SequentialMusic
>       'elements
>       (list (make-music
>               'EventChord
>               'elements
>               (list (make-music
>                       'NoteEvent
>                       'duration
>                       (ly:make-duration 2 0 1 1)
>                       'pitch
>                       (ly:make-pitch 0 5 0))))))

Así pues, en nuestra función, tenemos que clonar esta expresión (de forma que tengamos dos notas para construir la secuencia), añadir `SlurEvent` a la propiedad `'elements` de cada una de ellas, y por último hacer una secuencia `SequentialMusic` con los dos `EventChords`.

>     doubleSlur = #(define-music-function (parser location note) (ly:music?)
>              "Return: { note ( note ) }.
>              `note' is supposed to be an EventChord."
>              (let ((note2 (ly:music-deep-copy note)))
>                (set! (ly:music-property note 'elements)
>                      (cons (make-music 'SlurEvent 'span-direction -1)
>                            (ly:music-property note 'elements)))
>                (set! (ly:music-property note2 'elements)
>                      (cons (make-music 'SlurEvent 'span-direction 1)
>                            (ly:music-property note2 'elements)))
>                (make-music 'SequentialMusic 'elements (list note note2))))

Otros idiomas: English, deutsch.

#### LilyPond — Extender