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))))

Extender LilyPond v2.25.32 (development-branch).