GNU LilyPond – Extension des fonctionnalités: 1.3.3 Doublement d'une note avec liaison (exemple)

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

#### LilyPond — Extension des fonctionnalités v2.24.4 (branche stable).