X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fdefine-music-display-methods.scm;h=cca78ffec267ed80fd610dbacb5f5fe382202e9b;hb=b357d2084d1ae252a890e92019e62aa8ccbfdafc;hp=845b514f4499767dcf4a9c2a0c540732a27e539f;hpb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;p=lilypond.git diff --git a/scm/define-music-display-methods.scm b/scm/define-music-display-methods.scm index 845b514f44..cca78ffec2 100644 --- a/scm/define-music-display-methods.scm +++ b/scm/define-music-display-methods.scm @@ -105,15 +105,13 @@ expression." ;;; ;;; durations ;;; -(define*-public (duration->lily-string ly-duration #:key (prev-duration (*previous-duration*)) - (force-duration (*force-duration*)) - (time-scale (*time-scale*)) - remember) - (if remember (*previous-duration* ly-duration)) +(define*-public (duration->lily-string ly-duration #:key + (force-duration #f) + (time-scale (*time-scale*))) (let ((log2 (ly:duration-log ly-duration)) (dots (ly:duration-dot-count ly-duration)) (scale (ly:duration-scale ly-duration))) - (if (or force-duration (not prev-duration) (not (equal? ly-duration prev-duration))) + (if (or force-duration (not (*omit-duration*))) (string-append (case log2 ((-1) "\\breve") ((-2) "\\longa") @@ -429,14 +427,15 @@ Otherwise, return #f." ;; '<' (notepitch | drumpitch)* '>" duration post_events (let ((duration (duration->lily-string (ly:music-property (car chord-elements) - 'duration) - #:remember #t))) + 'duration)))) ;; Format duration first so that it does not appear on ;; chord elements (format #f "< ~{~a ~}>~a~:{~:[-~;~]~a~^ ~}" - (map-in-order (lambda (music) - (music->lily-string music parser)) - chord-elements) + (parameterize ((*omit-duration* #t)) + (map-in-order + (lambda (music) + (music->lily-string music parser)) + chord-elements)) duration (map-in-order (lambda (music) (list @@ -444,8 +443,7 @@ Otherwise, return #f." (music->lily-string music parser))) other-elements)))) ((ly:duration? chord-repeat) - (let ((duration (duration->lily-string chord-repeat - #:remember #t))) + (let ((duration (duration->lily-string chord-repeat))) (format #f "q~a~:{~:[-~;~]~a~^ ~}" duration (map-in-order (lambda (music) @@ -467,8 +465,7 @@ Otherwise, return #f." (define-display-method MultiMeasureRestMusic (mmrest parser) (format #f "R~a~{~a~^ ~}" - (duration->lily-string (ly:music-property mmrest 'duration) - #:remember #t) + (duration->lily-string (ly:music-property mmrest 'duration)) (map-in-order (lambda (music) (music->lily-string music parser)) (ly:music-property mmrest 'articulations)))) @@ -504,8 +501,7 @@ Otherwise, return #f." (make-string (1- (* -1 octave-check)) #\,)) (else ""))) "")) - (duration->lily-string (ly:music-property event 'duration) - #:remember #t) + (duration->lily-string (ly:music-property event 'duration)) (if ((make-music-type-predicate 'RestEvent) event) "\\rest" "") (map-in-order (lambda (event) @@ -519,19 +515,15 @@ Otherwise, return #f." (simple-note->lily-string note parser)) ((not (null? (ly:music-property note 'drum-type))) ;; drum (format #f "~a~a~{~a~}" (ly:music-property note 'drum-type) - (duration->lily-string (ly:music-property note 'duration) - #:remember #t) + (duration->lily-string (ly:music-property note 'duration)) (map-in-order (lambda (event) (music->lily-string event parser)) (ly:music-property note 'articulations)))) (else ;; pure duration - ;; FIXME: { c4 c4 4 4 } must not be output as { c4 c 4 4 } - ;; quite tricky to do. Do it when outputting sequences? (format #f "~a~{~a~}" (duration->lily-string (ly:music-property note 'duration) - #:force-duration #t - #:remember #t) + #:force-duration #t) (map-in-order (lambda (event) (music->lily-string event parser)) (ly:music-property note 'articulations)))))) @@ -543,20 +535,17 @@ Otherwise, return #f." (if (not (null? (ly:music-property rest 'pitch))) (simple-note->lily-string rest parser) (format #f "r~a~{~a~}" - (duration->lily-string (ly:music-property rest 'duration) - #:remember #t) + (duration->lily-string (ly:music-property rest 'duration)) (map-in-order (lambda (event) (music->lily-string event parser)) (ly:music-property rest 'articulations))))) (define-display-method MultiMeasureRestEvent (rest parser) - (string-append "R" (duration->lily-string (ly:music-property rest 'duration) - #:remember #t))) + (string-append "R" (duration->lily-string (ly:music-property rest 'duration)))) (define-display-method SkipEvent (rest parser) (format #f "s~a~{~a~}" - (duration->lily-string (ly:music-property rest 'duration) - #:remember #t) + (duration->lily-string (ly:music-property rest 'duration)) (map-in-order (lambda (event) (music->lily-string event parser)) (ly:music-property rest 'articulations)))) @@ -631,7 +620,7 @@ Otherwise, return #f." (if (null? bracket-stop) "" "]")))) (define-display-method LyricEvent (lyric parser) - (format "~a~{~a~^ ~}" + (format #f "~a~{~a~^ ~}" (let ((text (ly:music-property lyric 'text))) (if (or (string? text) (eqv? (first text) simple-markup)) @@ -674,7 +663,6 @@ Otherwise, return #f." (and span (duration->lily-string span #:force-duration #t))) (scale (/ num den)) (time-scale (*time-scale*))) - (*previous-duration* #f) (let ((result (parameterize ((*force-line-break* #f) (*time-scale* (* time-scale scale))) @@ -683,7 +671,6 @@ Otherwise, return #f." num formatted-span (music->lily-string (ly:music-property times 'element) parser))))) - (*previous-duration* #f) result))) (define-display-method RelativeOctaveMusic (m parser) @@ -1025,6 +1012,7 @@ Otherwise, return #f." (define-extra-display-method PartCombineMusic (expr parser) (with-music-match (expr (music 'PartCombineMusic + direction ?dir elements ((music 'UnrelativableMusic element (music 'ContextSpeccedMusic context-id "one" @@ -1035,11 +1023,35 @@ Otherwise, return #f." context-id "two" context-type 'Voice element ?sequence2))))) - (format #f "\\partcombine ~a~a~a" + (format #f "\\partcombine~a ~a~a~a" + (cond ((equal? ?dir UP) "Up") + ((equal? ?dir DOWN) "Down") + (else "")) (music->lily-string ?sequence1 parser) (new-line->lily-string) (music->lily-string ?sequence2 parser)))) +(define-extra-display-method ContextSpeccedMusic (expr parser) + "If `expr' is a \\partcombine expression, return \"\\partcombine ...\". +Otherwise, return #f." + (with-music-match + (expr (music 'ContextSpeccedMusic + context-type 'Staff + element (music 'SimultaneousMusic + elements ((music 'ContextSpeccedMusic + context-id "one" + context-type 'Voice) + (music 'ContextSpeccedMusic + context-id "two" + context-type 'Voice) + (music 'ContextSpeccedMusic + context-id "shared" + context-type 'Voice) + ?pc-music)))) + (with-music-match + (?pc-music (music 'PartCombineMusic)) + (format #f "~a" (music->lily-string ?pc-music parser))))) + (define-display-method UnrelativableMusic (expr parser) (music->lily-string (ly:music-property expr 'element) parser)) @@ -1104,7 +1116,8 @@ Otherwise, return #f." (define-display-method LyricCombineMusic (expr parser) (format #f "\\lyricsto ~s ~a" (ly:music-property expr 'associated-context) - (parameterize ((*explicit-mode* #f)) + (parameterize ((*explicit-mode* #f) + (*omit-duration* #t)) (music->lily-string (ly:music-property expr 'element) parser)))) ;; \addlyrics @@ -1124,7 +1137,8 @@ Otherwise, return #f." (format #f "~a~a \\addlyrics ~a" (music->lily-string ?note-sequence parser) (new-line->lily-string) - (parameterize ((*explicit-mode* #f)) + (parameterize ((*explicit-mode* #f) + (*omit-duration* #t)) (music->lily-string ?lyric-sequence parser))) #f)))