Hi Harm, > currently I'm trying to add crosses to the start and end of arbitrary Glissandi. > So far it works for unbroken and broken single-staff Glissando, as > well as for unbroken cross-staff Glissando. > Alas, I'm stuck for broken cross-staff Glissando. > Attached are the files with the already done steps. > > Any hints?
A diffent approach: You could simply extract the positions from the stencil itself. Simply pass the original stencil to your procedure: %%% glissandoX = #(define-music-function (proc)(procedure?) #{ \override Glissando.stencil = #(grob-transformer 'stencil (lambda (grob orig) (apply ly:stencil-add orig (map (lambda (pt) (stencil-with-color (make-cross-stencil pt) red)) (proc grob orig))))) #}) %%% Then get the stencil expression, which should be something like `('translate- stencil (X . Y) (draw-line thickness x0 y0 x1 y1))`. So match against that expression and you’ll have your positions: %%% #(define (gliss-pts grob stc) (let* ((expr (ly:stencil-expr stc))) (match expr (('translate-stencil shift ('draw-line thick x0 y0 x1 y1)) (list (cons (+ (car shift) x0) (+ (cdr shift) y0)) (cons (+ (car shift) x1) (+ (cdr shift) y1))))))) %%% Now, of course this only works for line-style glissando. For something else it would for example be possible to calculate the positions from the skylines of the stencil: %%% #(define (gliss-pts grob stc) (let* ((skylines (ly:skylines-for-stencil stc Y)) (points1 (sort (filter (lambda (x) (finite? (car x))) (ly:skyline->points (car skylines) Y)) (lambda (x y) (< (car x) (car y))))) (points2 (sort (filter (lambda (x) (finite? (car x))) (ly:skyline->points (cdr skylines) Y)) (lambda (x y) (< (car x) (car y)))))) (if (or (not (>= (length points1) 2)) (not (>= (length points2) 2))) (ly:error "Unepected number of points")) (let ((pos00 (first points1)) (pos10 (last points1)) (pos01 (first points2)) (pos11 (last points2))) (list (cons (* 0.5 (+ (car pos00) (car pos01))) (* 0.5 (+ (cdr pos00) (cdr pos01)))) (cons (* 0.5 (+ (car pos10) (car pos11))) (* 0.5 (+ (cdr pos10) (cdr pos11)))))))) %%% Best regards, Tina
signature.asc
Description: This is a digitally signed message part.