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

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

Extender LilyPond v2.25.27 (development-branch).