]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/auto-beam.scm
Merge branch 'lilypond/translation' of ssh://git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / scm / auto-beam.scm
index 13fa296a41bf353def983f35942384e9bc78fd35..c5ec73266dc0749dc7ecdbee32befc36067e0c96 100644 (file)
@@ -1,84 +1,98 @@
-;;;
-;;; auto-beam.scm -- Auto-beam-engraver settings
-;;;
-;;; source file of the GNU LilyPond music typesetter
-;;; 
-;;; (c) 2000--2001 Jan Nieuwenhuizen <janneke@gnu.org>
-;;;
-
-;;; specify generic beam begin and end times
-
-;;; format:
-;;;
-;;;   function shortest-duration-in-beam time-signature
-;;;
-;;; where
-;;;
-;;;     function = begin or end
-;;;     shortest-duration-in-beam = numerator denominator; eg: 1 16
-;;;     time-signature = numerator denominator, eg: 4 4
-;;;
-;;; unspecified or wildcard entries for duration or time-signature
-;;; are given by * *
-
-;;; maybe do:  '(end shortest-1 16 time-3 4) ?
-
-;;; in 3 2 time:
-;;;   end beams each 1 2 note
-;;;   end beams with 16th notes each 1 4 note
-;;;   end beams with 32th notes each 1 8 note
-
-(define-public auto-beam-settings
-   `(
-     ((end * * 3 2) . ,(make-moment 1 2))
-     ((end 1 16 3 2) . ,(make-moment 1 4))
-     ((end 1 32 3 2) . ,(make-moment 1 8))
-
-     ((begin 1 8 3 4) . ,(make-moment 1 4))
-
-     ((end * * 3 4) . ,(make-moment 3 4))
-     ((begin 1 16 3 4) . ,(make-moment 1 16))
-     ((end 1 16 3 4) . ,(make-moment 1 4))
-     ;;((begin 1 32 3 4) . ,(make-moment 1 8))
-     ((end 1 32 3 4) . ,(make-moment 1 8))
-
-     ((begin 1 16 3 8) . ,(make-moment 1 8))
-     ((end * * 3 8) . ,(make-moment 3 8))
-
-     ;; in common time:
-     ;;   end beams each 1 2 note
-     ;;   end beams with 32th notes each 1 8 note
-     ;;   end beams with 1 8 triplets each 1 4 note
-
-     ((end * * 4 4) . ,(make-moment 1 2))
-     ((end 1 12 4 4) . ,(make-moment 1 4))
-     ((end 1 16 4 4) . ,(make-moment 1 4))
-     ((end 1 32 4 4) . ,(make-moment 1 8))
-
-     ((end * * 2 4) . ,(make-moment 1 4))
-     ((end 1 12 2 4) . ,(make-moment 1 4))
-     ((end 1 16 2 4) . ,(make-moment 1 4))
-     ((end 1 32 2 4) . ,(make-moment 1 8))
-
-     ;; It seems that, because of a bug in the previous auto-beamer,
-     ;; we had the effect of this setting x
-     ;; ((end * * 2 8) . ,(make-moment 2 8))
-
-     ((end * * 4 8) . ,(make-moment 1 4))
-     ((end 1 16 4 8) . ,(make-moment 1 4))
-     ((end 1 32 4 8) . ,(make-moment 1 8))
-
-     ((end * * 4 16) . ,(make-moment 1 8))
-
-     ((end * * 6 8) . ,(make-moment 3 8))
-     ((end 1 16 6 8) . ,(make-moment 3 8))
-     ((end 1 32 6 8) . ,(make-moment 1 8))
-
-     ((end * * 9 8) . ,(make-moment 3 8))
-     ((end 1 16 9 8) . ,(make-moment 3 8))
-     ((end 1 32 9 8) . ,(make-moment 1 8))
-
-     ((end * * 12 8) . ,(make-moment 3 8))
-     ((end 1 16 12 8) . ,(make-moment 3 8))
-     ((end 1 32 12 8) . ,(make-moment 1 8))
-     ))
+;;;; This file is part of LilyPond, the GNU music typesetter.
+;;;;
+;;;; Copyright (C) 2000--2009 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;;
+;;;; LilyPond is free software: you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation, either version 3 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; LilyPond is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+
+;;  Determine end moment for auto beaming (or begin moment, but mostly
+;;  0== anywhere).  We only consider the current time signature.
+;;  In order of decreasing priority:
+;;
+;;  1. end <type>
+;;  2. end   *
+;;  3. if 1-2 not specified, begin anywhere, end at beatLength intervals
+;;
+;;  Rationale:
+;;
+;;  [user override]
+;;  1. override for specific duration type
+;;  2. override for all duration types in a time signature.
+;;
+;;  defined in scm/beam-settings.scm:
+;;  1. Default grouping for common time signatures
+;;  2. exceptions for specific time signature, for specific duration type
+
+
+(define-public (default-auto-beam-check context dir measure-pos test-beam)
+  (define (get name default)
+    (let ((value (ly:context-property context name)))
+      (if (not (null? value)) value default)))
+
+  (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)))))
+
+  ;; Start of actual auto-beam test routine
+  ;;
+  ;;
+  ;; Don't start auto beams on grace notes
+  (if (and (!= (ly:moment-grace-numerator (ly:context-now context)) 0)
+           (= dir START))
+      #f
+      (if (= dir START)
+          ;; start anywhere is currently implemented
+          #t
+          (let* ((beat-length (get 'beatLength (ly:make-moment 1 4)))
+                 (measure-length (get 'measureLength (ly:make-moment 1 1)))
+                 (time-signature-fraction
+                   (get 'timeSignatureFraction '(4 . 4)))
+                 (settings (get 'beamSettings '()))
+                 (function (if (= dir START) 'begin 'end))
+                 (type (cons (ly:moment-main-numerator test-beam)
+                             (ly:moment-main-denominator test-beam)))
+                 (pos (if (>= (ly:moment-main-numerator measure-pos) 0)
+                        measure-pos
+                        (ly:moment-add measure-length measure-pos)))
+                 (type-grouping (ly:beam-grouping
+                                  settings
+                                  time-signature-fraction
+                                  function
+                                  type))
+                 (default-grouping (ly:beam-grouping
+                                     settings
+                                     time-signature-fraction
+                                     function
+                                     '*))
+                 (beat-grouping (if (null? type-grouping)
+                                  default-grouping
+                                  type-grouping))
+                 (grouping-moment (if (null? type-grouping)
+                                    beat-length
+                                    test-beam))
+                 (grouping-moments (ending-moments
+                                      beat-grouping 0 grouping-moment)))
+           (if (null? beat-grouping)
+               ;; no rule applies, so end at beatLength
+               (= (ly:moment-main-denominator
+                   (ly:moment-div pos beat-length)) 1)
+               ;; otherwise, end at beginning of measure or
+               ;; at specified moment
+               (or
+                ;; start/end at beginning of measure
+                (= (ly:moment-main-numerator pos) 0)
+                ;; end if measure-pos matches a specified ending moment
+                (member pos grouping-moments)))))))