Attached patch goes on top of my original tremolo articulation patch. I think it would be sensible for them to remain as separate git commits, because this new one is really a spin-off taking the tremolo work in a new direction, rather than changing anything about the tremolo articulation itself.
-zefram
>From d49993c51d4f561d557b74f38aa27314ce7a14cd Mon Sep 17 00:00:00 2001 From: Zefram <zef...@fysh.org> Date: Wed, 2 Jan 2013 19:53:54 +0000 Subject: [PATCH] factor out some duration processing New functions duration-log-factor, duration-dot-factor, duration-length, duration-visual, and duration-visual-length. All concerned with low-level numerical processing of durations, so that other code doesn't have to understand dot counts and the like. --- ly/articulate.ly | 12 ++---------- scm/lily-library.scm | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/ly/articulate.ly b/ly/articulate.ly index 3b8c110..ed4e7aa 100644 --- a/ly/articulate.ly +++ b/ly/articulate.ly @@ -456,21 +456,13 @@ (tremtype-log (1- (integer-length tremtype))) (durev (find (lambda (v) (not (null? (ly:music-property v 'duration)))) evl)) (totaldur (if durev (ly:music-property durev 'duration) (ly:make-duration tremtype-log 0 1))) - (tgt-nrep (* (/ (ash 1 tremtype-log) (ash 1 (ly:duration-log totaldur))) - (/ (1- (ash 2 (ly:duration-dot-count totaldur))) - (ash 1 (ly:duration-dot-count totaldur))))) + (tgt-nrep (/ (duration-visual-length totaldur) (duration-log-factor tremtype-log))) (eff-nrep (max (truncate tgt-nrep) 1)) (tremdur (ly:make-duration tremtype-log 0 (* (/ tgt-nrep eff-nrep) (ly:duration-scale totaldur))))) (or (and (= eff-nrep tgt-nrep) (= (ash 1 tremtype-log) tremtype)) (ly:warning (_ "non-integer tremolo ~a:~a") - (duration->lily-string - (ly:make-duration - (ly:duration-log totaldur) - (ly:duration-dot-count totaldur) - 1) - #:force-duration #t - #:time-scale 1) + (duration->lily-string (duration-visual totaldur) #:force-duration #t #:time-scale 1) tremtype)) (for-each (lambda (v) diff --git a/scm/lily-library.scm b/scm/lily-library.scm index da04e6c..a022671 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -79,6 +79,42 @@ (ly:moment-main-denominator moment))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; durations + +(define-public (duration-log-factor lognum) +"Given a logarithmic duration number, return the length of the duration, +as a number of whole notes." + (or (and (exact? lognum) (integer? lognum)) + (scm-error 'wrong-type-arg "duration-log-factor" "Not an integer: ~S" (list lognum) #f)) + (if (<= lognum 0) + (ash 1 (- lognum)) + (/ (ash 1 lognum)))) + +(define-public (duration-dot-factor dotcount) +"Given a count of the dots used to extend a musical duration, return +the numeric factor by which they increase the duration." + (or (and (exact? dotcount) (integer? dotcount) (>= dotcount 0)) + (scm-error 'wrong-type-arg "duration-dot-factor" "Not a count: ~S" (list dotcount) #f)) + (- 2 (/ (ash 1 dotcount)))) + +(define-public (duration-length dur) +"Return the overall length of a duration, as a number of whole notes. +(Not to be confused with ly:duration-length, which returns a less-useful +moment object.)" + (ly:moment-main (ly:duration-length dur))) + +(define-public (duration-visual dur) +"Given a duration object, return the visual part of the duration (base +note length and dot count), in the form of a duration object with +non-visual scale factor 1." + (ly:make-duration (ly:duration-log dur) (ly:duration-dot-count dur) 1)) + +(define-public (duration-visual-length dur) +"Given a duration object, return the length of the visual part of the +duration (base note length and dot count), as a number of whole notes." + (duration-length (duration-visual dur))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; arithmetic (define-public (average x . lst) (/ (+ x (apply + lst)) (1+ (length lst)))) -- 1.7.2.5
_______________________________________________ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel