Comment éviter le partage d’expressions musicales

Lors de l’écriture de fonctions musicales, il est important de respecter la règle suivante : une même expression musicale de doit pas se retrouver à plusieurs endroits. Voici, à titre d’exemple, une fonction problématique :

simpleAccompaniment =
#(define-music-function
   (bass-1 bass-2 chord) (ly:music? ly:music? ly:music?)
   #{
     #bass-1 #chord #bass-2 #chord
   #})

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

[image of music]

Le problème avec cette fonction est évident si le résultat est transposé :

simpleAccompaniment =
#(define-music-function
   (bass-1 bass-2 chord) (ly:music? ly:music? ly:music?)
   #{
     #bass-1 #chord #bass-2 #chord
   #})

\transpose c e {
  \clef bass
  \simpleAccompaniment c g, <e g>
  \simpleAccompaniment d g, <f g>
}

[image of music]

Alors que les notes de basse sont correctes, l’accord n’est pas transposé comme il faut – il est en fait transposé deux fois. La raison tient au fait que l’expressin musiclae chord est utilisé deux fois dans le résultat de la fonction sansn le recopier. Les fonctions telles que \transpose modifient directement l’objet musical – dans le cas de \transpose, les hauteurs sont changées. Lorsqu’un même objet musical est réutilisé, les modifications appliquées à l’un des endroits où il est utilisé affectent les deux puisqu’ils concernent le même objet. Dans le cas présent, \transpose rencontre l’objet deux fois, donc le transpose deux fois.

L’un des moyens de corriger cette fonction consiste à utiliser ‘$’ au lieu de ‘#’ pour référencer les variables, ce qui en réalise une copie. La différence entre ‘#’ et ‘$’ est abordée dans Syntaxe Scheme dans LilyPond.

simpleAccompaniment =
#(define-music-function
   (bass-1 bass-2 chord) (ly:music? ly:music? ly:music?)
   #{
     $bass-1 $chord $bass-2 $chord
   #})

\transpose c e {
  \clef bass
  \simpleAccompaniment c g, <e g>
  \simpleAccompaniment d g, <f g>
}

[image of music]


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