2.7 Fonctions de rappel

Certaines propriétés, entre autres thickness ou direction, peuvent voir leur valeur figée à l’aide d’un \override comme ici :

\override Stem #'thickness = #2.0

Une procédure Scheme peut aussi se charger de modifier des propriétés :

\override Stem #'thickness = #(lambda (grob)
    (if (= UP (ly:grob-property grob 'direction))
        2.0
        7.0))
c b a g b a g b

[image of music]

Dans ce cas, la procédure est exécutée dès que la valeur de la propriété est nécessaire au processus de mise en forme.

La majeure partie du procédé typographique consiste en la réalisation de tels rappels (callbacks en anglais). Entre autres propriétés utilisant particulièrement des rappels, nous mentionnerons

stencil

Routine d’impression, construisant le dessin du symbole

X-offset

Routine effectuant le positionnement horizontal

X-extent

Routine calculant la largeur d’un objet

La procédure prend un unique argument, en l’occurrence l’objet graphique (le grob).

Dans le cas où la routine doit faire appel à plusieurs arguments, le grob en cours peut s’insérer à l’aide d’un grob enchâssé. Voici, à titre d’illustration, un réglage pour AccidentalSuggestion :

`(X-offset .
  ,(ly:make-simple-closure
    `(,+
        ,(ly:make-simple-closure
           (list ly:self-alignment-interface::centered-on-x-parent))
      ,(ly:make-simple-closure
           (list ly:self-alignment-interface::x-aligned-on-self)))))

Ici, aussi bien ly:self-alignment-interface::x-aligned-on-self que ly:self-alignment-interface::centered-on-x-parent font appel à l’argument grob. La fonction + a pour effet d’additionner les résultats. L’ensemble est inclus dans un ly:make-simple-closure de telle sorte que l’addition s’exécute de façon correcte

Dans les faits, l’utilisation d’une unique procédure en tant que valeur d’une propriété revient à écrire

(ly:make-simple-closure (ly:make-simple-closure (list proc)))

Le ly:make-simple-closure intérieur fournit le grob en argument à la procédure proc, l’extérieur s’assure que le résultat de la fonction sera bien renvoyé, non pas l’objet simple-closure.

Au sein d’un callback, le meilleur moyen d’évaluer un markup consiste à utiliser la fonction grob-interpret-markup, comme ici :

my-callback = #(lambda (grob)
                 (grob-interpret-markup grob (markup "foo")))

Autres langues : English, deutsch, español.
About automatic language selection.

LilyPond — Extension des fonctionnalités