Liaison de prolongation aplatie
La fonction flared-tie ici présentée permet de dessiner une
liaison de prolongation constituée de lignes droites. Elle est sensée
remplacer la fonction par défaut de dessin des liaisons de tenue – elle
remplace l’argument stencil de l’objet Tie.
L’argument de cette fonction flared-tie est une liste de paires
de coordonnées qui spécifient des points additionnels entre l’entame et
la terminaison afin de déterminer l’étendue des lignes de la liaison.
L’entame et la terminaison sont identiques à ceux de la liaison
originelle. La valeur des abscisses et ordonnées sont des multiples de
largeur et de la hauteur de la boîte englobante de la liaison originelle
(tout en tenant compte de son positionnement) ; par voie de conséquence,
le premier point a pour coordonnée (0,0), et le dernier point (1,0).
La fonction flare-tie définit un raccourci pour l’obtention d’une
liaison aplatie. Des ajustements plus poussés sont possibles, en
apportant des dérogations à Tie.details.height-limit ou à l’aide
de la fonction \shape. La définition personnalisée peut aussi se
modifier à la volée.
#(define ((flared-tie coords) grob) (define (pair-to-list pair) (list (car pair) (cdr pair))) (define (normalize-coords goods x y dir) (map (lambda (coord) (cons (* x (car coord)) (* y dir (cdr coord)))) goods)) (define (my-c-p-s points thick) (make-connected-path-stencil points thick 1.0 1.0 #f #f)) ;; Calling `ly:tie::print` and assigning its return value to a ;; variable in this outer `let` triggers LilyPond to position the ;; tie, allowing us to extract its extents. We only proceed, ;; however, if the tie doesn't get discarded (for whatever reason). (let ((sten (ly:tie::print grob))) (if (grob::is-live? grob) (let* ((layout (ly:grob-layout grob)) (line-thickness (ly:output-def-lookup layout 'line-thickness)) (thickness (ly:grob-property grob 'thickness 0.1)) (used-thick (* line-thickness thickness)) (dir (ly:grob-property grob 'direction)) (xex (ly:stencil-extent sten X)) (yex (ly:stencil-extent sten Y)) (lenx (interval-length xex)) (leny (interval-length yex)) (xtrans (car xex)) (ytrans (if (> dir 0)(car yex) (cdr yex))) ;; Add last point. (coord-list (append coords '((1.0 . 0.0)))) (uplist (map pair-to-list (normalize-coords coord-list lenx (* leny 2) dir)))) (ly:stencil-translate (my-c-p-s uplist used-thick) (cons xtrans ytrans))) '()))) % Define a default tie shape consisting of three straight lines. #(define flare-tie (flared-tie '((0.1 . 0.3) (0.9 . 0.3)))) \relative c' { a4~ a \once \override Tie.stencil = #flare-tie a4~ a \break <a c e a c e a c e>~ q \once \override Tie.stencil = #flare-tie q~ q\break <>^\markup \small \typewriter "height-limit = 14" \override Tie.details.height-limit = 14 a'4~ a \once \override Tie.stencil = #flare-tie a4~ a \break <>^\markup \small \typewriter "height-limit = 0.5" \override Tie.details.height-limit = 0.5 a4~ a \once \override Tie.stencil = #flare-tie a4~ a \break \revert Tie.details.height-limit <>^\markup \small \typewriter "\shape #'((0 . 0) (0 . -1) (0 . -1) (0 . 0))" \shape #'((0 . 0) (0 . -1) (0 . -1) (0 . 0)) Tie a4~ a \once \override Tie.stencil = #flare-tie \shape #'((0 . 0) (0 . -1) (0 . -1) (0 . 0)) Tie a4~ a \break <>^\markup \small \typewriter "#(flared-tie '((0.2 . 2) (0.5 . -3) (0.8 . 1))" \once \override Tie.stencil = #(flared-tie '((0.2 . 2) (0.5 . -3) (0.8 . 1))) a4~ a <>_\markup \small \typewriter "#(flared-tie '((0.5 . 2)))" \once \override Tie.stencil = #(flared-tie '((0.5 . 2))) a'4~ a }