Adaptación de instrucciones incorporadas
Una buena manera de comenzar a escribir una instrucción de marcado nueva, es seguir el ejemplo de otra instrucción ya incorporada. Casi todas las instrucciones de marcado que están incorporadas en LilyPond se pueden encontrar en el archivo scm/define-markup-commands.scm.
Por ejemplo, querríamos adaptar la instrucción \draw-line
,
para que trace una línea doble. La instrucción \draw-line
está definida como sigue (se han suprimido los comentarios de
documentación):
(define-markup-command (draw-line layout props dest) (number-pair?) #:category graphic #:properties ((thickness 1)) "…documentación…" (let ((th (* (ly:output-def-lookup layout 'line-thickness) thickness)) (x (car dest)) (y (cdr dest))) (make-line-stencil th 0 0 x y)))
Para definir una instrucción nueva basada en otra existente,
copie la definición y cámbiele el nombre. La palabra clave
#:category
se puede eliminar sin miedo, pues sólo se
utiliza para generar documentación de LilyPond, y no tiene
ninguna utilidad para las instrucciones de marcado definidas por
el usuario.
(define-markup-command (draw-double-line layout props dest) (number-pair?) #:properties ((thickness 1)) "…documentación…" (let ((th (* (ly:output-def-lookup layout 'line-thickness) thickness)) (x (car dest)) (y (cdr dest))) (make-line-stencil th 0 0 x y)))
A continuación se añade una propiedad para establecer la
separación entre las dos líneas, llamada line-gap
, con un
valor predeterminado de p.ej. 0.6:
(define-markup-command (draw-double-line layout props dest) (number-pair?) #:properties ((thickness 1) (line-gap 0.6)) "…documentación…" …
Finalmente, se añade el código para trazar las dos líneas. Se
usan dos llamadas a make-line-stencil
para trazar las
líneas, y los sellos resultantes se combinan usando
ly:stencil-add
:
#(define-markup-command (my-draw-line layout props dest) (number-pair?) #:properties ((thickness 1) (line-gap 0.6)) "..documentation.." (let* ((th (* (ly:output-def-lookup layout 'line-thickness) thickness)) (dx (car dest)) (dy (cdr dest)) (w (/ line-gap 2.0)) (x (cond ((= dx 0) w) ((= dy 0) 0) (else (/ w (sqrt (+ 1 (* (/ dx dy) (/ dx dy)))))))) (y (* (if (< (* dx dy) 0) 1 -1) (cond ((= dy 0) w) ((= dx 0) 0) (else (/ w (sqrt (+ 1 (* (/ dy dx) (/ dy dx)))))))))) (ly:stencil-add (make-line-stencil th x y (+ dx x) (+ dy y)) (make-line-stencil th (- x) (- y) (- dx x) (- dy y))))) \markup \my-draw-line #'(4 . 3) \markup \override #'(line-gap . 1.2) \my-draw-line #'(4 . 3)