>From aa040c5b32a49a4b534fc7df17364c9b9be9552a Mon Sep 17 00:00:00 2001 From: Malte Meyn Date: Wed, 4 Oct 2017 09:58:34 +0200 Subject: [PATCH 1/2] Issue 5211/1: fix positioning of merged rests When used with \magnifyStaff the Merge_rests_engraver failed to position merged rests correctly. Using 'staff-position for Rests and 'direction for MultiMeasureRests instead of 'Y-offset fixes this. This also fixes the positioning of brevis MMRs as in { \time 4/2 R\breve } --- scm/scheme-engravers.scm | 78 +++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 47 deletions(-) diff --git a/scm/scheme-engravers.scm b/scm/scheme-engravers.scm index 3480610c4c..e346985939 100644 --- a/scm/scheme-engravers.scm +++ b/scm/scheme-engravers.scm @@ -125,57 +125,41 @@ This works by gathering all rests at a time step. If they are all of the same length and there are at least two they are moved to the correct location as if there were one voice." - (define (is-single-bar-rest? mmrest) - (eqv? (ly:grob-property mmrest 'measure-count) 1)) - - (define (is-whole-rest? rest) - (eqv? (ly:grob-property rest 'duration-log) 0)) - - (define (mmrest-offset mmrest) - "For single measures they should hang from the second line from the top - (offset of 1). For longer multimeasure rests they should be centered on the - middle line (offset of 0). - NOTE: For one-line staves full single measure rests should be positioned at - 0, but I don't anticipate this engraver's use in that case. No errors are - given in this case." - (if (is-single-bar-rest? mmrest) 1 0)) - - (define (rest-offset rest) - (if (is-whole-rest? rest) 1 0)) - - (define (rest-eqv rest-len-prop) - "Compare rests according the given property" - (define (rest-len rest) (ly:grob-property rest rest-len-prop)) - (lambda (rest-a rest-b) - (eqv? (rest-len rest-a) (rest-len rest-b)))) - - (define (rests-all-unpitched rests) + (define (measure-count-eqv? a b) + (eqv? + (ly:grob-property a 'measure-count) + (ly:grob-property b 'measure-count))) + + (define (rests-all-unpitched? rests) "Returns true when all rests do not override the staff-position grob property. When a rest has a position set we do not want to merge rests at that position." (every (lambda (rest) (null? (ly:grob-property rest 'staff-position))) rests)) - (define (merge-mmrests rests) - "Move all multimeasure rests to the single voice location." - (if (all-equal rests (rest-eqv 'measure-count)) - (merge-rests rests mmrest-offset))) - - (define (merge-rests rests offset-function) - (let ((y-offset (offset-function (car rests)))) - (for-each - (lambda (rest) (ly:grob-set-property! rest 'Y-offset y-offset)) - rests)) + (define (merge-mmrests mmrests) + "Move all multimeasure rests to the single voice location." + (if (all-equal? mmrests measure-count-eqv?) + (begin + (for-each + (lambda (rest) (ly:grob-set-property! rest 'direction CENTER)) + mmrests) + (for-each + (lambda (rest) (ly:grob-set-property! rest 'transparent #t)) + (cdr mmrests))))) + + (define (merge-rests rests) + (for-each + (lambda (rest) (ly:grob-set-property! rest 'staff-position 0)) + rests) (for-each (lambda (rest) (ly:grob-set-property! rest 'transparent #t)) (cdr rests))) - (define has-one-or-less (lambda (lst) (or (null? lst) (null? (cdr lst))))) - (define has-at-least-two (lambda (lst) (not (has-one-or-less lst)))) - (define (all-equal lst pred) - (or (has-one-or-less lst) - (and (pred (car lst) (cadr lst)) (all-equal (cdr lst) pred)))) - (define moment=? - (lambda (a b) (not (or (ly:moment