B.3.4 Funciones de sustitución intermedias

Las funciones de sustitución intermedias contienen una mezcla de código de Scheme y de LilyPond dentro de la expresión musical que se devuelve.

Algunas instrucciones \override requieren un argumento que consiste en una pareja de números (llamada una célula cons en Scheme).

La pareja se puede pasar directamente dentro de la función musical, usando una variable pair?:

barraManual =
#(define-music-function
     (principio-final)
     (pair?)
   #{
     \once \override Beam.positions = #principio-final
   #})

\relative c' {
  \barraManual #'(3 . 6) c8 d e f
}

De forma alternativa, los números que componen la pareja se pueden pasar como argumentos separados, y el código de Scheme que se ha usado para crear la pareja se puede incluir dentro de la expresión musical:

manualBeam =
#(define-music-function
     (beg end)
     (number? number?)
   #{
     \once \override Beam.positions = #(cons beg end)
   #})

\relative c' {
  \manualBeam #3 #6 c8 d e f
}

[image of music]

Las propiedades se mantienen conceptualmente utilizando una pila por cada propiedad, por cada grob y por cada contexto. Las funciones musicales pueden requerir la sobreescritura de una o varias propiedades durante el tiempo de duración de la función, restaurándolas a sus valores previos antes de salir. Sin embargo, las sobreescrituras normales extraen y descartan la cima de la pila de propiedades actual antes de introducir un valor en ella, de manera que el valor anterior de la propiedad se pierde cuando se sobreescribe. Si se quiere preservar el valor anterior, hay que preceder la instrucción \override con la palabra clave \temporary, así:

\temporary \override …

El uso de \temporary hace que se borre la propiedad (normalmente fijada a un cierto valor) pop-first de la sobreescritura, de forma que el valor anterior no se extrae de la pila de propiedades antes de poner en ella el valor nuevo. Cuando una instrucción \revert posterior extrae el valor sobreescrito temporalmente, volverá a emerger el valor anterior.

En otras palabras, una llamada a \temporary \override y a continuación otra a \revert sobre la misma propiedad, tiene un valor neto que es nulo. De forma similar, la combinación en secuencia de \temporary y \undo sobre la misma música que contiene las sobreescrituras, tiene un efecto neto nulo.

He aquí un ejemplo de una función musical que utiliza lo expuesto anteriormente. El uso de \temporary asegura que los valores de las propiedades cross-staff y style se restauran a la salida a los valores que tenían cuando se llamó a la función crossStaff. Sin \temporary, a la salida se habrían fijado los valores predeterminados.

crossStaff =
#(define-music-function (notes) (ly:music?)
  (_i "Create cross-staff stems")
  #{
  \temporary \override Stem.cross-staff = #cross-staff-connect
  \temporary \override Flag.style = #'no-flag
  #notes
  \revert Stem.cross-staff
  \revert Flag.style
#})

LilyPond — Extender v2.23.82 (rama de desarrollo).