B.3.4 Funcions de substitució intermèdies
Les funcions de substitució intermèdies contenen una barreja de codi de l’Scheme i del LilyPond dins de l’expressió musical que es retorna.
Algunes instruccions \override
requereixen un argument que
consisteix en una parella de nombres (anomenada una cela cons
a l’Scheme.
La parella es pot passar directament dins de la funció musical,
usant una variable pair?
:
barraManual = #(define-music-function (principi-final) (pair?) #{ \once \override Beam.positions = #principi-final #}) \relative c' { \barraManual #'(3 . 6) c8 d e f }
De forma alternativa, els nombres que composen la parella es pot passar com arguments separats, i el codi de l’Scheme que s’ha usat per crear la parella es pot incloure dins de l’expressió 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 }![]()
Les propietats es mantenen conceptualment utilitzant una pila per
a cada propietat, per a cada grob i per a cada context. Les
funcions musicals poden requerir la sobreescriptura duna o
diverses propietats durant el temps de duració de la funció,
restaurant-les als seus valors previs abans de sortir. No
obstant, les sobreescriptures normals extrauen i descarten el cim
de la pila de propietats actual abans d’introduir un valor a
ella, de manera que el valor anterior de la propietat es perd quan
se sobreescriu. Si es vol preservar el valor anterior, s’ha de
precedir l’ordre \override
amb la paraula clau
\temporary
, així:
\temporary \override …
L’ús de \temporary
fa que s’esborri la propietat
(normalment establerta a un cert valor) pop-first
de la
sobreescriptura, de forma que el valor anterior no s’extrau de la
pila de propietats abans de posar en ella el valor nou. Quan una
ordre \revert
posterior extrau el valor sobreescrit
temporalment, tornarà a emergir el valor anterior.
En altres paraules, una crida a \temporary \override
i a
continuació una altra a \revert
sobre la mateixa propietat,
té un valor net que és nul. De forma semblant, la combinació en
seqüència de \temporary
i \undo
sobre la mateixa
música que conté les sobreescriptures, té un efecte net nul.
Heus aquí un exemple d’una funció musical que utilitza l’exposat
anteriorment. L’ús de \temporary
assegura que els
valors de les propietats cross-staff
i style
es
restauren a la sortida als valors que tenien quan es va cridar a
la funció crossStaff
. Sense \temporary
, a la
sortida s’haurien fixat els valors predeterminats.
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 #})