\version "2.19.46" #(define (make-zigzag-squiggle startX endX squiggle-length squiggle-height) (let* ((len (- endX startX)) (squiggle-count (floor (/ len squiggle-length))) (leftover (- len (* squiggle-length squiggle-count)))) (let loop ((start (+ startX (/ leftover 2))) (sqc squiggle-count) (y squiggle-height) ; amplitude (result '())) (if (= sqc 0) (append result (list (list endX 0))) (loop (+ start squiggle-length) (1- sqc) (- y) (append result (list (list start 0) (list (+ start (/ squiggle-length 2)) y) (list (+ start squiggle-length) 0)))))))) #(define (make-wavy-squiggle startX endX squiggle-length squiggle-height) (let* ((len (- endX startX)) (squiggle-count (floor (/ len squiggle-length))) (leftover (- len (* squiggle-length squiggle-count)))) (let loop ((start (+ startX (/ leftover 2))) (sqc squiggle-count) (y squiggle-height) ; amplitude (result (list (list (+ startX (/ leftover 2)) 0)))) (if (= sqc 0) (reverse (cons (list endX 0) result)) (loop (+ start squiggle-length) (1- sqc) (- y) (cons (list start 0 (+ start (/ squiggle-length 2)) y (+ start squiggle-length) 0) result)))))) #(define (my-big-rest grob proc squiggle-len squiggle-height width) (let* ((thick-thick (ly:grob-property grob 'thick-thickness 1.0)) (hair-thick (ly:grob-property grob 'hair-thickness 0.1)) (ss (ly:staff-symbol-staff-space grob)) (slt (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness)) (y (* slt (/ thick-thick 2) ss)) (ythick (* hair-thick slt ss)) (blot (* 0.8 (min y ythick))) ;; default ;(m (ly:round-filled-box ; (cons 0.0 (max 0.0 (- width (* 2 ythick)))) ; (cons (- y) y) ; blot)) (m (make-connected-path-stencil (proc 0 (- width ythick) squiggle-len squiggle-height) ythick 1 1 #f #f)) (m (ly:stencil-translate-axis m (/ ythick 2) X)) ;(m (ly:line-interface::line grob (* slt 0.5) 0 (- width (* slt 0.5)) 0)) (yb (ly:round-filled-box (offset-scale (cons -0.5 0.5) ythick) (cons (- ss) ss) blot)) (m (ly:stencil-add m (ly:stencil-translate-axis (ly:stencil-aligned-to yb X RIGHT) width X))) (m (ly:stencil-add m (ly:stencil-aligned-to yb X LEFT))) (m (ly:stencil-aligned-to m X LEFT))) m)) #(define (my-stencil proc squiggle-length squiggle-height) (lambda (grob) (let* ((default-stil (ly:multi-measure-rest::print grob)) (X-ext (ly:stencil-extent default-stil X)) (len (interval-length X-ext))) (display "stencil-ext ")(display X-ext) (newline) (if (< len 2) default-stil (let ((my-stil (my-big-rest grob proc squiggle-length squiggle-height len))) ;; stencil from my-big-rest will be at 0.0; move it to X position of default (ly:stencil-translate-axis my-stil (car X-ext) X)))))) #(define (print-extent grob) (display (ly:stencil-extent (ly:grob-property grob 'stencil) X)) (newline)) mmrDefault = { \compressFullBarRests R1*24 R1*4 R1*72 } mmrZigZag = { \temporary \override Staff.MultiMeasureRest #'stencil = #(my-stencil make-zigzag-squiggle 2 1) % squiggle length, height \compressFullBarRests R1*24 % ignored R1*4 \once \override Staff.MultiMeasureRest #'stencil = #(my-stencil make-zigzag-squiggle 3 1) R1*72 \revert Staff.MultiMeasureRest #'stencil } mmrWavy = { \temporary \override Staff.MultiMeasureRest #'stencil = #(my-stencil make-wavy-squiggle 2 1) \compressFullBarRests R1*24 R1*4 \once \override Staff.MultiMeasureRest #'stencil = #(my-stencil make-wavy-squiggle 3 2) R1*72 \revert Staff.MultiMeasureRest #'stencil } \new StaffGroup << \new Staff { \key cis \major \mmrDefault \break \mmrDefault } \new Staff { \mmrZigZag \mmrZigZag } \new Staff { \mmrWavy \mmrWavy } >> \layout { indent = 0 ragged-right = ##f \context { \Staff \override MultiMeasureRest.after-line-breaking = #print-extent } }