2.3.4 Fonctions de substitution intermédiaires
Une fonction de substitution intermédiaire est une fonction dont l’expression musicale résultante mélangera du code Scheme au code LilyPond.
Certaines commandes \override
nécessitent un argument
supplémentaire constitué d’une paire de nombres, appelée cons
cell en Scheme – que l’on pourrait traduire par « construction de
cellule ».
Cette paire peut se mentionner directement dans la fonction musicale à
l’aide d’une variable pair?
:
manualBeam = #(define-music-function (beg-end) (pair?) #{ \once \override Beam.positions = #beg-end #}) \relative c' { \manualBeam #'(3 . 6) c8 d e f }
Autre manière de procéder, les nombres formant la paire sont transmis comme arguments séparés ; le code Scheme chargé de créer la paire pourra alors être inclus dans l’expression musicale :
manualBeam = #(define-music-function (beg end) (number? number?) #{ \once \override Beam.positions = #(cons beg end) #}) \relative c' { \manualBeam #3 #6 c8 d e f }
L’entretien des propriétés peut se voir comme un empilement par
propriété par objet par contexte. Les fonctions musicales peuvent
nécessiter des dérogations pour une ou plusieurs propriétés pour la
durée de la fonction, puis de revenir aux valeurs précédentes avant de
quitter. Néanmoins, une dérogation normale va retirer de la pile – ou
dépiler – et supprimer le sommet de la pile de la propriété avant d’y
ajouter quoi que ce soit – ou empiler – ; la valeur précédente de la
propriété est de fait perdue. Lorsque la valeur antérieure doit être
préservée, l’instruction \override
devra être préfixée d’un
\temporary
, comme ceci :
\temporary \override …
L’utilisation d’un \temporary
a pour effet d’effacer la propriété
pop-first
(commence par dépiler normalement activée) de la
dérogation ; la valeur antérieure ne sera alors pas supprimée de la pile
de la propriété avant d’y empiler la nouvelle valeur. Lorsqu’un
\revert
viendra par la suite supprimer la valeur dérogatoire
temporaire, réapparaitra la valeur antérieure.
En d’autres termes, un \revert
qui suit un \temporary
\override
pour la même propriété n’apporte rien. Ce principe est aussi
valable pour un couple \temporary
et \undo
sur la même
musique contenant des dérogations.
Voici un exemple de fonction musicale utilisant cette fonctionnalité. La
présence du \temporary
permet de s’assurer qu’en sortant de la
fonction, les propriétés cross-staff
et style
retrouveront
les valeurs qu’elles avaient avant que ne soit appelée la fonction
crossStaff
. En l’absence de \temporary
, ces propriétés
auraient retrouvé leurs valeurs par défaut à la sortie de la fonction.
crossStaff = #(define-music-function (notes) (ly:music?) (_i "Create cross-staff stems") #{ \temporary \override Stem.cross-staff = #cross-staff-connect \temporary \override Flag.style = #'no-flag #notes \revert Stem.cross-staff \revert Flag.style #})