lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Merge Rests Engraver


From: Jay Anderson
Subject: Re: Merge Rests Engraver
Date: Thu, 23 Feb 2012 07:55:15 -0700

On Wed, Feb 22, 2012 at 10:17 PM, Jay Anderson <address@hidden> 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))))))))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]