\version "2.23.9" #(use-modules (ice-9 match) (srfi srfi-71)) #(define (cluster::dashed-fill grob) (let* ((columns (ly:grob-object grob 'columns)) (column-list (ly:grob-array->list columns))) (if (not (pair? column-list)) ;; see issue #3654 #f (let* ((x-refp (ly:grob-common-refpoint-of-array grob columns X)) (y-refp (ly:grob-common-refpoint-of-array grob columns Y)) (my-exts (map (lambda (c) (ly:grob-extent c y-refp Y)) column-list)) (my-coords (map (lambda (c) (ly:grob-relative-coordinate c x-refp X)) column-list)) (after-me (find-tail (lambda (s) (eq? s grob)) (ly:spanner-broken-into (ly:grob-original grob)))) (neighbor (and after-me (pair? (cdr after-me)) (cadr after-me))) (exts coords (if neighbor (let* ((neighbor-cols (ly:grob-object neighbor 'columns)) (neighbor-col-list (ly:grob-array->list neighbor-cols))) (if (not (null? neighbor-col-list)) ;; issue #3654 as well (let* ((first-neighbor-col (car neighbor-col-list)) (neighbor-refp (ly:grob-common-refpoint-of-array neighbor neighbor-cols Y)) (bound (ly:spanner-bound grob RIGHT))) (values (append my-exts (list (ly:grob-extent first-neighbor-col neighbor-refp Y))) (append my-coords (list (ly:grob-relative-coordinate bound x-refp X))))) (values my-exts my-coords))) (values my-exts my-coords))) (details (ly:grob-property grob 'details)) (increment (assq-ref details 'increment)) (contour-thickness (assq-ref details 'contour-thickness)) (polygon-points-1 (map cons coords (map car exts))) (polygon-points-2 (map cons coords (map cdr exts))) (polygon-stencil (ly:round-polygon (append-reverse polygon-points-1 polygon-points-2) contour-thickness 1 #f))) (let loop ((exts exts) (coords coords) (current (car coords)) (stil empty-stencil)) (if (null? (cdr coords)) (ly:stencil-translate (ly:stencil-add stil polygon-stencil) (cons (- (ly:grob-relative-coordinate grob x-refp X)) (- (ly:grob-relative-coordinate grob y-refp Y)))) (let* ((t (/ (- current (car coords)) (- (cadr coords) (car coords)))) (1-t (- 1 t)) (ext1 (car exts)) (ext2 (cadr exts)) (lo (+ (* 1-t (car ext1)) (* t (car ext2)))) (hi (+ (* 1-t (cdr ext1)) (* t (cdr ext2)))) (part (ly:line-interface::line grob current lo current hi)) (new-stil (ly:stencil-add stil part)) (next (+ current increment)) (stay (<= next (cadr coords)))) (loop (if stay exts (cdr exts)) (if stay coords (cdr coords)) next new-stil)))))))) \layout { \context { \Voice %\override ClusterSpanner.stencil = #cluster::dashed-fill %\override ClusterSpanner.style = #'dashed-line \override ClusterSpanner.thickness = 1.5 \override ClusterSpanner.dash-period = 0.8 \override ClusterSpanner.details.increment = 0.5 \override ClusterSpanner.details.contour-thickness = 0.2 } } %%% \paper { ragged-right = ##t } kbdRHMI = \relative c' { \new Voice \with { \override ClusterSpanner.stencil = #cluster::dashed-fill \override ClusterSpanner.style = #'dashed-line } { R1*3 | r2 r4. \makeClusters { 8 | q1 | q8 2. | q1 | q1 | q2 } r2 \barNumberCheck #10 \makeClusters { 1 | q4. 8 2 | q1 | q2 2 | % \barNumberCheck #14 %1 q2 2 | q2 | 2 q8. 8. 8 | q1 | q1 | q2. 4 | } %\barNumberCheck #20 r1 R1*46 %\barNumberCheck #67 %5 \makeClusters { 1 | q1 | 1 | 1 | 1 | q1 | q1 | q1 | } \barNumberCheck #75 r1 R1*10 \barNumberCheck #86 } } kbdLHMI = \relative c { \clef bass \new Voice \with { \override ClusterSpanner.stencil = #cluster::dashed-fill \override ClusterSpanner.style = #'dashed-line } { R1*13 R1*14 \makeClusters { 1 q1 |q1 | 1 | q1 | q1 | 1 | q1 | q1 | q1 | } r1 R1*7 R1*16 R1*5 \makeClusters { 1 | q1 | q1 | q1 | } r2 r4 \makeClusters { | q1 | q1 | q2. } r8 \makeClusters { q8 | q8 8 2. | q1 | 1 1 | q8 2.. | q4 2. | q1 | q1 | 4 } r r2 | } R1*2 \barNumberCheck #86 } \score { << \new PianoStaff \with { \consists #Span_stem_engraver instrumentName = "Keyboard" shortInstrumentName = "Kbd" } << \new Staff = "kbdrh" \kbdRHMI \new Staff = "kbdlh" \kbdLHMI >> %%% COMMENT ME OR THE OTHER ME TO MAKE THIS FILE COMPILE \new Staff = "voice" \relative c' { c4 d e f g a b c ~ | c1 } >> \layout { %%% COMMENT ME OR THE OTHER ME TO MAKE THIS FILE COMPILE #(layout-set-staff-size 16) } }