]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4033: All subsequent clef transpositions are marked as optional
authorDavid Kastrup <dak@gnu.org>
Sun, 27 Jul 2014 16:01:09 +0000 (18:01 +0200)
committerDavid Kastrup <dak@gnu.org>
Sat, 2 Aug 2014 13:00:37 +0000 (15:00 +0200)
This removes a bug cover-up in scm/parser-clef.scm, implements the
necessary functionality in display-lily-music and adds some regtests
for that functionality.

input/regression/display-lily-tests.ly
scm/define-music-display-methods.scm
scm/parser-clef.scm

index 3b99a96bc2ad07b8a3a3cb73c1a360afc826fe1f..b14fa520906c06b3c49ad93a6ac8dd0babbeba43 100644 (file)
@@ -168,6 +168,8 @@ stderr of this run."
 \test ##[ \key e \minor #]
 \test ##[ \clef "bass" #]
 \test ##[ \clef "french^2" #]
+\test ##[ \clef "treble_[8]" #]
+\test ##[ \clef "bass^(15)" #]
 \test ##[ \clef "alto_3" #]
 \test ##[ \time 2/4 #]
 \test ##[ \time #'(3 2) 5/8 #]
index c4ed5344780bea8aedeed5aef4176bdee95e51b2..f448ee8bb73c423787f38d4bafe2608a660e367f 100644 (file)
@@ -946,21 +946,26 @@ Otherwise, return @code{#f}."
                                                           (music 'PropertySet
                                                                  value ?clef-transposition
                                                                  symbol 'clefTransposition)
+                                                          (music 'PropertySet
+                                                                 value ?clef-transposition-style
+                                                                 symbol 'clefTranspositionStyle)
                                                           (music 'ApplyContext
                                                                  procedure ly:set-middle-C!)))))
                     (let ((clef-name (assoc-get (list ?clef-glyph ?clef-position 0)
                                                 clef-name-alist)))
-                      (if clef-name
-                          (format #f "\\clef \"~a~{~a~a~}\"~a"
-                                  clef-name
-                                  (cond ((= 0 ?clef-transposition)
-                                         (list "" ""))
-                                        ((> ?clef-transposition 0)
-                                         (list "^" (1+ ?clef-transposition)))
-                                        (else
-                                         (list "_" (- 1 ?clef-transposition))))
-                                  (new-line->lily-string))
-                          #f))))
+                      (and clef-name
+                           (format #f "\\clef \"~a~?\"~a"
+                                   clef-name
+                                   (case ?clef-transposition-style
+                                     ((parenthesized) "~a(~a)")
+                                     ((bracketed) "~a[~a]")
+                                     (else "~a~a"))
+                                   (cond ((zero? ?clef-transposition)
+                                          (list "" ""))
+                                         ((positive? ?clef-transposition)
+                                          (list "^" (1+ ?clef-transposition)))
+                                         (else (list "_" (- 1 ?clef-transposition))))
+                                   (new-line->lily-string))))))
 
 ;;; \bar
 (define-extra-display-method ContextSpeccedMusic (expr parser)
index 6d45dd5376f4ed13c3cbde71518818797ffd3ad1..9ba29937f9b595cdd4bff5b0078f8022ac451cda 100644 (file)
 
 (define-public (make-clef-set clef-name)
   "Generate the clef setting commands for a clef with name @var{clef-name}."
-  (define (make-prop-set props)
-    (let ((m (make-music 'PropertySet)))
-      (for-each (lambda (x) (set! (ly:music-property m (car x)) (cdr x))) props)
-      m))
-  (let ((e '())
-        (c0 0)
-        (oct 0)
-        (style 'default)
-        (match (string-match "^(.*)([_^])([^0-9a-zA-Z]*)([1-9][0-9]*)([^0-9a-zA-Z]*)$" clef-name)))
-    (if match
-        (begin
-          (set! clef-name (match:substring match 1))
-          (set! oct
-                (* (if (equal? (match:substring match 2) "^") -1 1)
-                   (- (string->number (match:substring match 4)) 1)))
-          (set! style
-                (cond ((equal? (match:substring match 3) "(") 'parenthesized)
+  (let* ((match (string-match "^(.*)([_^])([^0-9a-zA-Z]*)([1-9][0-9]*)([^0-9a-zA-Z]*)$" clef-name))
+         (e (assoc-get (if match (match:substring match 1) clef-name) supported-clefs))
+         (oct (if match
+                  ((if (equal? (match:substring match 2) "^") - +)
+                   (1- (string->number (match:substring match 4))))
+                  0))
+         (style (cond ((not match) 'default)
+                      ((equal? (match:substring match 3) "(") 'parenthesized)
                       ((equal? (match:substring match 3) "[") 'bracketed)
-                      (else style)))))
-    (set! e (assoc-get clef-name supported-clefs))
+                      (else 'default))))
     (if e
-        (let* ((prop-list `(((symbol . clefGlyph) (value . ,(car e)))
-                            ((symbol . middleCClefPosition)
-                             (value . ,(+ oct
-                                          (cadr e)
-                                          (assoc-get (car e) c0-pitch-alist))))
-                            ((symbol . clefPosition) (value . ,(cadr e)))
-                            ((symbol . clefTransposition) (value . ,(- oct)))))
-               ;; the clefTranspositionStyle property is set only when
-               ;; not 'default to calm display-lily-tests.scm
-               (prop-list (if (eq? style 'default)
-                              prop-list
-                              (append
-                               prop-list
-                               `(((symbol . clefTranspositionStyle)
-                                  (value . ,style))))))
-               (musics (map make-prop-set prop-list))
-               (recalc-mid-C (make-music 'ApplyContext))
-               (seq (make-music 'SequentialMusic
-                                'elements (append musics (list recalc-mid-C))))
-               (csp (make-music 'ContextSpeccedMusic)))
-          (set! (ly:music-property recalc-mid-C 'procedure) ly:set-middle-C!)
-          (context-spec-music seq 'Staff))
+        (let ((musics (list
+                       (make-property-set 'clefGlyph (car e))
+                       (make-property-set 'middleCClefPosition
+                                          (+ oct (cadr e)
+                                             (assoc-get (car e) c0-pitch-alist)))
+                       (make-property-set 'clefPosition (cadr e))
+                       (make-property-set 'clefTransposition (- oct))
+                       (make-property-set 'clefTranspositionStyle style)
+                       (make-apply-context ly:set-middle-C!))))
+          (context-spec-music (make-sequential-music musics) 'Staff))
         (begin
           (ly:warning (_ "unknown clef type `~a'") clef-name)
           (ly:warning (_ "supported clefs: ~a")