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>
}
[image of music]

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>
}
[image of music]

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]

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