5.7.5 Trucos avanzados con Scheme

Aunque es posible hacer muchas cosas con las instrucciones \override y \tweak , tenemos una forma incluso más poderosa de modificar el funcionamiento de LilyPond, a través de un interface programable hacia las operaciones internas de LilyPond. Se puede incorporar código escrito en el lenguaje de programación Scheme, directamente en el mecanismo de funcionamiento de LilyPond. Por supuesto, para hacer esto se necesitan al menos unos conocimientos básicos de programación en Scheme, y damos una introducción en el Tutorial de Scheme.

Como ejemplo que ilustra una de las muchas posibilidades, en lugar de dar a una propiedad un valor constante, se puede establecer al resultado de un procedimiento de Scheme que se invoca cada vez que LilyPond accede a esta propiedad. La propiedad se puede establecer dinámicamente a un valor determinado por el procedimiento en el momento en que se invoca. En este ejemplo damos a las cabezas de las notas un color que depende de su posición dentro del pentagrama.

#(define (color-notehead grob)
   "Color the notehead according to its position on the staff."
   (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 {
  % Arrange to obtain color from color-notehead procedure
  \override NoteHead.color = #color-notehead
  a2 b | c2 d | e2 f | g2 a |
}

[image of music]

Se pueden encontrar ejemplos adicionales que muestran la utilización de estos interfaces programables, en Funciones de callback.


Manual de aprendizaje de GNU LilyPond v2.25.22 (development-branch).