22.3.4 Funciones de sustitución y escritura de octava relativa
Cuando se aplica \relative a una expresión musical,
atraviesa su busqueda de notas con su altura, y modifica las
alturas en el orden en que las va encontrando, cambiando la octava
de cada altura de acuerdo con sus marcas de octava (‘'’ y
‘,’) y la altura de la nota anterior. Cuando se escribem
funciones de sustitución, esto puede dar lugar a una situación en
que una expresión musical resulta ‘relativizada’ de una forma
inesperada porque la salida de la función usa los parámetros
varias veces y/o en un orden distinto. Considere esta función y
cómo su salida reacciona al \relative:
simpleAccompaniment = #(define-music-function (bass-1 bass-2 chord) (ly:music? ly:music? ly:music?) #{ $bass-1 $chord $bass-2 $chord #}) \relative { \clef bass \simpleAccompaniment c g <e' g> \simpleAccompaniment d g, <f' g> }![]()
En este ejemplo, la salida es la misma que la de
\relative { \clef bass c <e' g> g <e' g> d <f' g> g, <f' g> }![]()
Sin embargo, este no es el resultado deseado cuando se usa la
función \simpleAccompaniment. La nota g, es
relativa a la primera nota del acorde que la precede, <e'
g>, aunque aparece después de c en la entrada. Claramente
las alturas tendrían que ser relativas de acuerdo al orden en que
se escriben al usar la función, no en el orden en que aparecen en
la salida de la función. Esto se puede conseguir usando el macro
de Scheme make-relative. Sus argumentos son: una lista de
variables, una expresión de referencia, y una expresión musical
principal. La expresión de referencia tiene el propósito de
servir como maqueta de cómo las variables se escribieron en la
entrada. Casi siempre puede ser una expresión simple hecha con
#{ … #} conteniendo las variables en orden. Tenga
cuidado de no hacer copias en la expresión de referencia
(concretamente, use ‘#’ y no ‘$’). El ejemplo anterior
se puede arreclar usando make-relative de esta forma:
simpleAccompaniment = #(define-music-function (bass-1 bass-2 chord) (ly:music? ly:music? ly:music?) (make-relative (bass-1 bass-2 chord) #{ #bass-1 #bass-2 #chord #} #{ $bass-1 $chord $bass-2 $chord #})) \relative { \clef bass \simpleAccompaniment c g <e' g> \simpleAccompaniment d g, <f' g> }![]()
![[image of music]](../40/lily-1a430c36.png)
![[image of music]](../d4/lily-8c847c2e.png)
![[image of music]](../09/lily-f59490cc.png)