22.3.3 Cómo evitar la compartición de expresiones musicales

Al escribir funciones musicales, es importante tener en cuenta una regla: las mismas expresiones musicales no se deben compartir en más de un lugar. Como ejemplo, he aquí una función problemática:

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]

El problema con esta función queda claro si se transporta el resultado:

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]

Aunque las notas del bajo son correctas, el acorde no se transporta adecuadamente: de hecho, se transporta dos veces. El motivo de esto es que la expresión musical chord se ha usado dos veces en el resultado de la función, sin copiarlo. Las funciones como \transpose modifican el objeto musical directamente (en el caso de \transpose, cambia la altura de las notas). Si se reutiliza el mismo objeto musical, las modificaciones efectuadas en un lugar donde se usa afecan a los dos lugares, porque contienen el mismo objeto. En este caso, \transpose encuentra el objeto dos veces y por tanto lo transporta dos veces también.

Una forma de arreglar esta función es usar ‘$’ en lugar de ‘#’ para referenciar las variables, lo cual hace una copia. La diferencia entre ‘#’ y ‘$’ se detalla en LilyPond Scheme syntax.

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]

Referencia de la notación de GNU LilyPond v2.25.30 (development-branch).