lilypond-user
[Top][All Lists]
Advanced

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

Re: new snippet: combine multimeasure rests


From: Shevek
Subject: Re: new snippet: combine multimeasure rests
Date: Sun, 21 Apr 2013 16:43:53 -0700 (PDT)

Oh, oops! Fixed that in the new version. Other changes:

* Added a wrapper function to recurse down nested music expressions, so it
can now be called on arbitrary music expressions.
* It now combines spacer rests as well as multimeasure rests, to help with
things like << \global \music >>
* Bar checks between combinable rests no longer prevent rests from being
combined.
* A few other minor things.

% \version "2.14.2"
\version "2.16.0"

#(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))

test = \relative c' {
    \compressFullBarRests
    R1\fermataMarkup
    R1*2 |
    \tag #'foo {
      \key e \major
    }
    R2*6 |
    c1
    <<
      {
        R1 |
        R2.*4 |
      }
      {
        s1*2
        s1*2
      }
    >>
    s1*2 |
    R1*2
  }

{ \test }
{ \combineMMRests \removeWithTag #'foo \test }



--
View this message in context: 
http://lilypond.1069038.n5.nabble.com/new-snippet-combine-multimeasure-rests-tp144688p144830.html
Sent from the User mailing list archive at Nabble.com.



reply via email to

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