From 9392f895cb37b3678ec03cc30ff28bccb7f3f452 Mon Sep 17 00:00:00 2001 From: Carl Sorensen Date: Thu, 30 Sep 2010 21:05:22 -0600 Subject: [PATCH] Fix 1284 -- make \revertTimeSignatureSettings work properly scm/time-signature-settings.scm -- fix broken revert function input/regression/multiple-time-sig-settings.ly -- Add test for \revertTimeSignatureSettings --- .../regression/multiple-time-sig-settings.ly | 13 +++++--- scm/time-signature-settings.scm | 32 +++++++++++++------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/input/regression/multiple-time-sig-settings.ly b/input/regression/multiple-time-sig-settings.ly index 3c6565ab79..9a91b5417c 100644 --- a/input/regression/multiple-time-sig-settings.ly +++ b/input/regression/multiple-time-sig-settings.ly @@ -3,7 +3,8 @@ \header { texidoc = " Multiple overrides to the default time signature settings can be -added. In this example, all notes should be beamed at 1/4. +added. In this example, notes should be beamed as indicated +by the markups. " } @@ -21,11 +22,13 @@ added. In this example, all notes should be beamed at 1/4. #'(1 1 1) % beatStructure #'() % beamExceptions \time 4/4 - c8 c c c c c c c | + c8^\markup {"Beam by 1/4"} c c c c c c c | \time 3/4 - c8 c c c c c | + c8^\markup {"Beam by 1/4"} c c c c c | + \revertTimeSignatureSettings #'Score #'(4 . 4) + \revertTimeSignatureSettings #'Score #'(3 . 4) \time 4/4 - c8 c c c c c c c | + c8^\markup {"Beam by 1/2"} c c c c c c c | \time 3/4 - c8 c c c c c | + c8^\markup {"Beam by 3/4"} c c c c c | } diff --git a/scm/time-signature-settings.scm b/scm/time-signature-settings.scm index 78599e2614..42bf5bfd41 100644 --- a/scm/time-signature-settings.scm +++ b/scm/time-signature-settings.scm @@ -254,18 +254,32 @@ checking. " "Like the C++ code that executes \revert, but without type checking. " - (define (revert-member alist entry new) - "Return ALIST, with ENTRY removed. ALIST is not modified, instead + (define (entry-count alist entry-key) + "Count the number of entries in alist with a key of +ENTRY-KEY." + (cond + ((null? alist) 0) + ((equal? (caar alist) entry-key) + (+ 1 (entry-count (cdr alist) entry-key))) + (else (entry-count (cdr alist) entry-key)))) + + (define (revert-member alist entry-key) + "Return ALIST, with the first entry having a key of +ENTRY-KEY removed. ALIST is not modified, instead a fresh copy of the list-head is made." (cond - ((null? alist) new) - ((equal? (car alist) entry) (revert-member (cdr alist) entry new)) + ((null? alist) '()) + ((equal? (caar alist) entry-key) (cdr alist)) (else (cons (car alist) - (revert-member (cdr alist) entry new))))) - - (ly:context-set-property! - context property - (revert-member (ly:context-property context property) setting '()))) + (revert-member (cdr alist) entry-key))))) + + ;; body of revert-property-setting + (let ((current-value (ly:context-property context property))) + (if (> (entry-count current-value setting) 1) + (ly:context-set-property! + context + property + (revert-member current-value setting))))) (define-public (override-time-signature-setting time-signature setting . rest) "Override the time signature settings for the context in @var{rest}, -- 2.39.2