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> }![]()
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> }![]()
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]](../dc/lily-9107a2ec.png)
![[image of music]](../5d/lily-8c956ec6.png)
![[image of music]](../41/lily-1f5d0006.png)