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