Op dinsdag 17 augustus 2010 schreef Xavier:
> On Fri, Jun 11, 2010 at 3:27 PM, Xavier Scheuer <[email protected]> wrote:
>> Could you implement the possibility:
>> \override RestCollision #'positioning-done =
>> #merge-rests-on-positioning described in
>> http://lsr.dsi.unimi.it/LSR/Item?id=336
>> _directly_ into LilyPond?
>
> Graham wrote: Patches will be reviewed.
This is my first stab at this. It just uses the code in LSR336 but provides a
few convenience commands.
The major limitation is that multimeasure rests are not yet taken into
account: they are simply moved to the central staff position, whether they
occur in both voices or not.
AFAICT MultiMeasureRest objects do not take part in some collision. Is there a
way to get the other one in the other voice in a staff? Then I could write a
function to assign to the 'Y-offset property of the MMrest.
If the MMrests function well, this file could be added to the ly/ directory of
lilypond, it could then be included if people want to use the functionality.
best regards,
Wilbert Berendsen
--
Frescobaldi, LilyPond editor for KDE: http://www.frescobaldi.org/
Nederlands LilyPond forum: http://www.lilypondforum.nl/
%{
Based on http://lsr.dsi.unimi.it/LSR/Snippet?id=336
Merges rests that occur on the same moment inside a staff with two voices.
Usage:
\include "merge-rests"
\layout {
\mergeRests
}
or inside the music:
\new Staff <<
\relative c' {
\mergeRestsOn %% in one of the voices if sufficient
c4 d e f g r r2
}
\\
\relative c' {
a4 b c d e r r2
}
>>
TODO:
- Fix MultiMeasureRests, currently they are always shifted to the center staff
position.
How to find out if there are two MultiMeasureRests at the same moment?
%}
\version "2.12.3"
#(define (rest-score r)
(let ((score 0)
(yoff (ly:grob-property-data r 'Y-offset))
(sp (ly:grob-property-data r 'staff-position)))
(if (number? yoff)
(set! score (+ score 2))
(if (eq? yoff 'calculation-in-progress)
(set! score (- score 3))))
(and (number? sp)
(<= 0 2 sp)
(set! score (+ score 2))
(set! score (- score (abs (- 1 sp)))))
score))
#(define (merge-rests-on-positioning grob)
(let* ((can-merge #f)
(elts (ly:grob-object grob 'elements))
(num-elts (and (ly:grob-array? elts)
(ly:grob-array-length elts)))
(two-voice? (= num-elts 2)))
(if two-voice?
(let* ((v1-grob (ly:grob-array-ref elts 0))
(v2-grob (ly:grob-array-ref elts 1))
(v1-rest (ly:grob-object v1-grob 'rest))
(v2-rest (ly:grob-object v2-grob 'rest)))
(and
(ly:grob? v1-rest)
(ly:grob? v2-rest)
(let* ((v1-duration-log (ly:grob-property v1-rest 'duration-log))
(v2-duration-log (ly:grob-property v2-rest 'duration-log))
(v1-dot (ly:grob-object v1-rest 'dot))
(v2-dot (ly:grob-object v2-rest 'dot))
(v1-dot-count (and (ly:grob? v1-dot)
(ly:grob-property v1-dot 'dot-count -1)))
(v2-dot-count (and (ly:grob? v2-dot)
(ly:grob-property v2-dot 'dot-count -1))))
(set! can-merge
(and
(number? v1-duration-log)
(number? v2-duration-log)
(= v1-duration-log v2-duration-log)
(eq? v1-dot-count v2-dot-count)))
(if can-merge
;; keep the rest that looks best:
(let* ((keep-v1? (>= (rest-score v1-rest)
(rest-score v2-rest)))
(rest-to-keep (if keep-v1? v1-rest v2-rest))
(dot-to-kill (if keep-v1? v2-dot v1-dot)))
;; uncomment if you're curious of which rest was chosen:
;;(ly:grob-set-property! v1-rest 'color green)
;;(ly:grob-set-property! v2-rest 'color blue)
(ly:grob-suicide! (if keep-v1? v2-rest v1-rest))
(if (ly:grob? dot-to-kill)
(ly:grob-suicide! dot-to-kill))
(ly:grob-set-property! rest-to-keep 'direction 0)
(ly:rest::y-offset-callback rest-to-keep)))))))
(if can-merge
#t
(ly:rest-collision::calc-positioning-done grob))))
mergeRestsOn = {
\override Staff.RestCollision #'positioning-done = #merge-rests-on-positioning
\override Staff.MultiMeasureRest #'Y-offset = #0
}
mergeRestsOff = {
\revert Staff.RestCollision #'positioning-done
\revert Staff.MultiMeasureRest #'Y-offset
}
mergeRests = \layout {
\context {
\Staff
\override RestCollision #'positioning-done = #merge-rests-on-positioning
\override MultiMeasureRest #'Y-offset = #0
}
}
_______________________________________________
lilypond-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-devel