22.3.3 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’expression musicale chord est utilisé deux
fois dans le résultat de la fonction sans 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]](../dc/lily-9107a2ec.png)
![[image of music]](../5d/lily-8c956ec6.png)
![[image of music]](../41/lily-1f5d0006.png)