[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.