\version "2.16.0" % Taken from improved version from % http://lilypond.1069038.n5.nabble.com/new-snippet-combine-multimeasure-rests-td144688.html #(define (add-durations dur1 dur2) (let* ((len1 (ly:duration-length dur1)) (len2 (ly:duration-length dur2)) (mult (ly:moment-div (ly:moment-add len1 len2) len1))) (ly:make-duration (ly:duration-log dur1) (ly:duration-dot-count dur1) (* (ly:duration-scale dur1) (ly:moment-main mult))))) #(define (combinable-rest? rest) (and (ly:music? rest) (or (eq? 'MultiMeasureRestMusic (ly:music-property rest 'name)) (eq? 'SkipEvent (ly:music-property rest 'name))) (null? (ly:music-property rest 'articulations)))) #(define (combine-rests rest1 rest2) (make-music (ly:music-property rest1 'name) 'duration (add-durations (ly:music-property rest1 'duration) (ly:music-property rest2 'duration)) 'articulations '())) #(define (consolidator curr rest) (if (and (combinable-rest? curr) (not (null? rest))) (if (and (combinable-rest? (car rest)) (eq? (ly:music-property curr 'name) (ly:music-property (car rest) 'name))) (consolidator (combine-rests curr (car rest)) (cdr rest)) (if (eq? 'BarCheck (ly:music-property (car rest) 'name)) (consolidator curr (cdr rest)) (cons curr rest))) (cons curr rest))) #(define (accumulate-result output input) (if (null? input) output (let ((done output) (curr (car input)) (rest (cdr input))) (if (null? rest) (append done (list curr)) (let ((prev (consolidator curr rest))) (accumulate-result (append done (list (car prev))) (cdr prev))))))) #(define (condense music) (let* ((output music) (elts (ly:music-property output 'elements)) (elt (ly:music-property output 'element))) (if (pair? elts) (ly:music-set-property! output 'elements (map condense (accumulate-result '() elts)))) (if (ly:music? elt) (ly:music-set-property! output 'element (condense elt))) output)) combineMMRests = #(define-music-function (parser location music) (ly:music?) (condense music))