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 }
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 #})