5.7.5 Modifiche avanzate con Scheme

Anche se molte cose sono possibili con i comandi \override e \tweak, un modo ancor più potente di modificare l’azione di LilyPond è resa possibile da un interfaccia programmabile al funzionamento interno di LilyPond. Il codice scritto nel linguaggio di programmazione Scheme può essere incorporato direttamente nel funzionamento interno di LilyPond. Ovviamente, per farlo è necessaria almeno una conoscenza di base della programmazione in Scheme; abbiamo scritto un’introduzione in Scheme tutorial.

Come esempio di una delle tante possibilità, invece di impostare una proprietà su un valore costante, si può impostare su una procedura Scheme che viene poi chiamata ogni volta che LilyPond accede a quella proprietà. La proprietà può essere poi impostata dinamicamente su un valore determinato dalla procedura nel momento in cui viene chiamata. In questo esempio coloriamo le teste delle note in base alla loro posizione sul rigo.

#(define (color-notehead grob)
   "Colora le teste di nota in base alla loro posizione sul rigo."
   (let ((mod-position (modulo (ly:grob-property grob 'staff-position)
                               7)))
     (case mod-position
       ;;   Return rainbow colors
       ((1) (x11-color 'red    ))  ; for C
       ((2) (x11-color 'orange ))  ; for D
       ((3) (x11-color 'yellow ))  ; for E
       ((4) (x11-color 'green  ))  ; for F
       ((5) (x11-color 'blue   ))  ; for G
       ((6) (x11-color 'purple ))  ; for A
       ((0) (x11-color 'violet ))  ; for B
       )))

\relative {
  % Fa sì che il colore sia preso dalla procedura color-notehead
  \override NoteHead.color = #color-notehead
  a2 b | c2 d | e2 f | g2 a |
}

[image of music]

Altri esempi che mostrano l’uso di queste interfacce programmabili si trovano in Callback functions.


Manuale di apprendimento di LilyPond v2.25.22 (development-branch).