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

[image of music]

Dans cet exemple, le résultat est identique à

\relative {
  \clef bass
  c <e' g> g <e' g>
  d <f' g>  g, <f' g>
}

[image of music]

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

[image of music]


GNU LilyPond – Manuel de notation v2.25.17 (branche de développement).