Fonctions de subsitution et octave relative
Lorsque \relative
s’applique à une expression musicale, celle-ci
est parcourue à la recherche de notes, et les hauteurs sont modifiées
dans leur ordre d’apparition, l’octave de chaque hauteur étant changée
selon sa marque d’octaviation (‘'’ et ‘,’) et la hauteur qui
précède. Dans le cadre d’une fonction substitutive, ceci peut mener à
des situations où la musique est « relativisée » de manière surprenante
parce que le résultat de la fonction utilise les paramètres plusieurs
fois ou dans un ordre différent. Examinons la fonction suivante et
comment son résultat réagit au \relative
.
simpleAccompaniment = #(define-music-function (bass-1 bass-2 chord) (ly:music? ly:music? ly:music?) #{ $bass-1 $chord $bass-2 $chord #}) \relative { \clef bass \simpleAccompaniment c g <e' g> \simpleAccompaniment d g, <f' g> }
Dans cet exemple, le résultat est identique à
\relative { \clef bass c <e' g> g <e' g> d <f' g> g, <f' g> }
Ce n’est toutefois pas le résultat auquel on s’attendrait à
l’utilisation la fonction \simpleAccompaniment
. La hauteur
g,
est relative à la première hauteur de l’accord qui précède,
<e' g>
, bien qu’il soit libellé après le c
de la source.
De toute évidence, les hauteurs devraient être relatives selon l’ordre
dans lequel elles sont transmises à la fonction, non pas selon leur
ordre d’apparition en sortie de la fonction. Le moyen d’y parvenir est
un recours à la fonction Scheme make-relative
. Ses arguments
sont : une liste de variables, une expression de référence, et une
expression musicale principale. L’expression de référence est réputée
être une représentation de la façon dont les variables auront été
saisies. Il s’agit la plupart du temps d’une simple expression de la
forme #{ … #}
contenant les variables dans l’ordre.
Attention à ne pas réaliser de copie dans l’expression de référence –
en particulier, il faut y utiliser ‘#’, pas ‘$’. L’exemple
précédent peut se corriger à l’aide de make-relative
de la
maniière suivante :
simpleAccompaniment = #(define-music-function (bass-1 bass-2 chord) (ly:music? ly:music? ly:music?) (make-relative (bass-1 bass-2 chord) #{ #bass-1 #bass-2 #chord #} #{ $bass-1 $chord $bass-2 $chord #})) \relative { \clef bass \simpleAccompaniment c g <e' g> \simpleAccompaniment d g, <f' g> }