On Wed, Feb 22, 2012 at 10:17 PM, Jay Anderson <horndud...@gmail.com> wrote: > Also for simplicity sake it would probably make sense to separate out > the regular rest merging engraver from the multi-measure-rest engraver > since regular rests are much easier to deal with:
Below are both merging engravers. I did end up saving off pairs of multi-measure rests and processing them in the finalize. The next improvement would be to follow David's suggestion and combine more than 2 rests. -----Jay #(define merge-rests-engraver (lambda (context) (let ((same-length (lambda (rest-a rest-b) (eq? (ly:grob-property rest-a 'duration-log) (ly:grob-property rest-b 'duration-log)))) (rest-a #f) (rest-b #f)) `((start-translation-timestep . ,(lambda (trans) (set! rest-a #f) (set! rest-b #f))) (stop-translation-timestep . ,(lambda (trans) (if (and rest-a rest-b (same-length rest-a rest-b)) (begin (ly:grob-set-property! rest-a 'Y-offset 0) (ly:grob-set-property! rest-b 'Y-offset 0))))) (acknowledgers (rest-interface . ,(lambda (engraver grob source-engraver) (if (eq? 'Rest (assoc-ref (ly:grob-property grob 'meta) 'name)) (if rest-a (set! rest-b grob) (set! rest-a grob)))))))))) #(define merge-mmrests-engraver (lambda (context) (letrec ((merge-mmrests (lambda (rests) (let ((rest-a (car rests)) (rest-b (cadr rests))) (if (eq? (ly:grob-property rest-a 'measure-count) (ly:grob-property rest-b 'measure-count)) (let ((offset (if (eq? (ly:grob-property rest-a 'measure-count) 1) 1 0))) (begin (ly:grob-set-property! rest-a 'Y-offset offset) (ly:grob-set-property! rest-b 'Y-offset offset))))))) (rest-a #f) (rest-b #f) (rests '())) `((start-translation-timestep . ,(lambda (trans) (set! rest-a #f) (set! rest-b #f))) (stop-translation-timestep . ,(lambda (trans) (if (and rest-a rest-b) (set! rests (cons (list rest-a rest-b) rests))))) (finalize . ,(lambda (translator) (for-each merge-mmrests rests))) (acknowledgers (rest-interface . ,(lambda (engraver grob source-engraver) (if (eq? 'MultiMeasureRest (assoc-ref (ly:grob-property grob 'meta) 'name)) (if rest-a (set! rest-b grob) (set! rest-a grob)))))))))) _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user