;;;;
;;;; source file of the GNU LilyPond music typesetter
;;;;
-;;;; (c) 2000--2005 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 2000--2007 Jan Nieuwenhuizen <janneke@gnu.org>
;;; specify generic beam begin and end times
((end 1 32 3 2) . ,(ly:make-moment 1 2))
((end 1 32 3 2) . ,(ly:make-moment 5 8))
((end 1 32 3 2) . ,(ly:make-moment 3 4))
+ ((end 1 32 3 2) . ,(ly:make-moment 7 8))
((end 1 32 3 2) . ,(ly:make-moment 9 8))
((end 1 32 3 2) . ,(ly:make-moment 5 4))
((end 1 32 3 2) . ,(ly:make-moment 11 8))
;; 2. end * * *
;; 3. end <type> <num> <den>
;; 4. end * <num> <den>
-;; 5. if 1-4 not specified: begin anywhere, end at every beat
+;; 5. if 1-4 not specified, begin anywhere, end at time determined by
+;; beatGrouping and beatLength:
+;; if beatGrouping and beatLength are consistent with measureLength,
+;; use beatGrouping to determine end of beams.
+;; if beatGrouping and beatLength are inconsistent with measureLength,
+;; use beatLength to determine end of beams.
;;
;; Rationale:
;;
;; 4. exceptions for specific time signature
;; 5. easy catch-all rule for non-specified measure types
+
(define-public (default-auto-beam-check context dir test)
(define (get name default)
(let ((value (ly:context-property context name)))
(if (not (null? value)) value default)))
- (if (!= (ly:moment-grace-numerator (ly:context-now context)) 0)
- ;; No auto beaming for grace notes
+ (define (ending-moments group-list start-beat beat-length)
+ (if (null? group-list)
+ '()
+ (let ((new-start (+ start-beat (car group-list))))
+ (cons (ly:moment-mul (ly:make-moment new-start 1) beat-length)
+ (ending-moments (cdr group-list) new-start beat-length)))))
+
+ (define (make-end-settings time ending-list moment-den)
+ (if (null? ending-list)
+ '()
+ (cons (cons (append '(end * *) time)
+ (ly:make-moment (car ending-list) moment-den))
+ (make-end-settings time (cdr ending-list) moment-den))))
+
+ ;; Don't start auto beams on grace notes
+ (if (and (!= (ly:moment-grace-numerator (ly:context-now context)) 0)
+ (= dir START))
#f
- (let* ((beat-length (get 'beatLength (ly:make-moment 1 1)))
+ (let* ((beat-length (get 'beatLength (ly:make-moment 1 4)))
(measure-length (get 'measureLength (ly:make-moment 1 1)))
- (measure-pos (get 'measurePosition (ly:make-moment 0 1)))
+ (measure-pos (get 'measurePosition ZERO-MOMENT))
+ (beat-grouping (get 'beatGrouping '()))
(settings (get 'autoBeamSettings '()))
(function (list (if (= dir START) 'begin 'end)))
- (num-mom (ly:div-moment measure-length beat-length))
+ ;; Calculate implied time signature based on measureLength
+ ;; and beatLength for default value in get
+ (num-mom (ly:moment-div measure-length beat-length))
(num (inexact->exact
(round (/ (ly:moment-main-numerator num-mom)
(ly:moment-main-denominator num-mom)))))
(den (ly:moment-main-denominator beat-length))
- (time (list num den))
+ (time-signature-fraction
+ (get 'timeSignatureFraction (cons num den)))
+ (time (list (car time-signature-fraction)
+ (cdr time-signature-fraction)))
(type (list (ly:moment-main-numerator test)
(ly:moment-main-denominator test)))
(pos (if (>= (ly:moment-main-numerator measure-pos) 0)
measure-pos
- (ly:add-moment measure-length measure-pos)))
- (lst (list
+ (ly:moment-add measure-length measure-pos)))
+ (grouping-moments (ending-moments beat-grouping 0 beat-length))
+ ;; Calculate implied measure length from beatGrouping
+ ;; and beatLength
+ (grouping-length (if (null? grouping-moments)
+ ZERO-MOMENT
+ (list-ref grouping-moments
+ (1- (length grouping-moments)))))
+ (lst (list
;; Hmm, should junk user-override feature,
;; or split this in user-override and config section?
(append function type '(* *))
(append function '(* * * *))
(append function type time)
- (append function '(* *) time))))
- (if (or
+ (append function '(* *) time)))
+ (predefined-setting (first-assoc lst settings)))
+ (if (or
;; always begin or end beams at beginning/ending of measure
(= (ly:moment-main-numerator pos) 0)
(first-member (map (lambda (x) (cons x pos)) lst) settings))
(if (= dir START)
;; if no entry matches our function + time or type,
;; start anywhere
- (not (first-assoc lst settings))
- ;; if no entry matches our function + time or type,
- ;; end at any beat
- (and (not (first-assoc lst settings))
- (= (ly:moment-main-denominator
- (ly:div-moment pos beat-length)) 1)))))))
+ (not predefined-setting)
+ ;; if entry matches our function + time or type, check moment
+ (if predefined-setting
+ (equal? measure-pos (cdr predefined-setting))
+ ;; if measure-length matches grouping-length, use
+ ;; grouping moments, else use beat-length
+ (if (equal? measure-length grouping-length)
+ (member measure-pos grouping-moments)
+ (= (ly:moment-main-denominator
+ (ly:moment-div pos beat-length)) 1))))))))