Extender LilyPond: B.3.4 Funciones de sustitución intermedias

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

#### LilyPond — Extender v2.22.2 (rama estable).