B.3.4 Funcions de substitució intermèdies (Extender LilyPond)

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

#### Extender LilyPond v2.26.0 (stable-branch).

- Appendix A Tutorial de l’Scheme
  - A.1 Introducció a l’Scheme
    - A.1.1 Banc de sorra de l’Scheme
    - A.1.2 Variables de l’Scheme
    - A.1.3 Tipus de dades simples de l’Scheme
    - A.1.4 Tipus de dades compostes de l’Scheme
      - Parelles
      - Llistes
      - Llistes associatives (llistes-A)
      - Taules de hash
    - A.1.5 Càlculs a l’Scheme
    - A.1.6 Procediments de l’Scheme
      - Definició de procediments
      - Predicats
      - Valors de retorn
    - A.1.7 Condicionals de l’Scheme
      - if
      - cond
  - A.2 Scheme dins del LilyPond
    - A.2.1 Sintaxi de l’Scheme del LilyPond
    - A.2.2 Variables del LilyPond
    - A.2.3 Variables d’entrada i l’Scheme
    - A.2.4 Importació de l’Scheme dins del LilyPond
    - A.2.5 Propietats dels objectes
    - A.2.6 Variables del LilyPond compostes
      - Desplaçaments
      - Fraccions
      - Dimensions
      - Llistes-A de propietats
      - Cadenes de llistes-A
    - A.2.7 Representació interna de la música
  - A.3 Construcció de funcions complicades
    - A.3.1 Presentació de les expressions musicals
    - A.3.2 Propietats musicals
    - A.3.3 Duplicació una nota amb lligadures (exemple)
    - A.3.4 Afegir articulacions a les notes (exemple)
- B Interfícies per a programadors
  - B.1 Blocs de codi del LilyPond
  - B.2 Funcions de l’Scheme
    - B.2.1 Definició de funcions de l’Scheme
    - B.2.2 Ús de les funcions de l’Scheme
    - B.2.3 Funcions de l’Scheme buides
  - B.3 Funcions musicals
    - B.3.1 Definicions de funcions musicals
    - B.3.2 Ús de les funcions musicals
    - B.3.3 Funcions de substitució senzilles
    - B.3.4 Funcions de substitució intermèdies
    - B.3.5 Matemàtiques dins de les funcions
    - B.3.6 Funcions sense arguments
    - B.3.7 Funcions musicals buides
  - B.4 Funcions d’esdeveniments
  - B.5 Funcions de marcatge
    - B.5.1 Construcció d’elements de marcatge a l’Scheme
    - B.5.2 Com funcionen internament els elements de marcatge
    - B.5.3 Definició d’una ordre nova de marcatge
      - Sintaxi de la definició d’ordre de marcatge
      - Quant a les propietats
      - Un exemple complet
      - Adaptació d’ordres incorporades
    - B.5.4 Definició de noves ordres de llista de marcatge
  - B.6 Contextos per a programadors
    - B.6.1 Avaluació de contextos
    - B.6.2 Execució d’una funció sobre tots els objectes de la presentació
  - B.7 Funcions de callback
  - B.8 Ajustaments difícils
- C Interfícies de l’Scheme del LilyPond
- Appendix D GNU Free Documentation License
- Appendix E Índex del LilyPond