From: Keith OHara Date: Mon, 28 May 2012 06:36:52 +0000 (-0700) Subject: Refine mid-measure beams in 3/4 time; Issue 2566 X-Git-Tag: release/2.15.40-1~8 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f6b1f6ebcd527e6262add9c9cf3e4df5b3e5d63f;p=lilypond.git Refine mid-measure beams in 3/4 time; Issue 2566 Replaces 4d7cac2e94f7fb8c86c69c6d6fceff1ddfb545e4 --- diff --git a/Documentation/notation/rhythms.itely b/Documentation/notation/rhythms.itely index 1b02b259fc..8f0827bb36 100644 --- a/Documentation/notation/rhythms.itely +++ b/Documentation/notation/rhythms.itely @@ -2149,30 +2149,30 @@ if @code{beamExceptions} is not reset. \repeat unfold 8 {c8} @end lilypond -In traditional engraving, eighth notes can have special beaming rules. -A measure consisting of only eighth notes can be beamed in one. This rule is -controlled by the context property @code{beamWholeMeasure}: +In a similar fashion, eighth notes in 3/4 time are beamed as a full +measure by default. To beam eighth notes in 3/4 time on the beat, +reset @code{beamExceptions}. @lilypond[quote,verbatim,relative=2] \time 3/4 -% By default we beam in one -\repeat unfold 6 { a8 } -% We can avoid beaming in one -\set Timing.beamWholeMeasure = ##f -\repeat unfold 6 { a8 } +% by default we beam in (3) due to beamExceptions +\repeat unfold 6 {a8} | +% This will beam (1 1 1) due to beatLength +\set Timing.beamExceptions = #'() +\repeat unfold 6 {a8} @end lilypond -In some engraving from the Romantic and Classical periods, -a half-measure of eighth notes can be beamed -together even though this violates the general rule (see Gould, p. 153). -This behavior is controlled by the context property @code{beamHalfMeasure}: +In engraving from the Romantic and Classical periods, +beams often begin midway through the measure in 3/4 time, +but modern practice is to avoid the false impression of 6/8 time +(see Gould, p. 153). Similar situations arise in 3/8 time. +This behavior is controlled by the context property @code{beamHalfMeasure}, +which has effect only in time signatures with 3 in the numerator: @lilypond[quote,verbatim,relative=2] \time 3/4 -% By default we avoid half-measure beams r4. a8 a a | -% We can allow half-measure beams -\set Timing.beamHalfMeasure = ##t +\set Timing.beamHalfMeasure = ##f r4. a8 a a | @end lilypond diff --git a/input/regression/autobeam-3-4-rules.ly b/input/regression/autobeam-3-4-rules.ly index 5730b6c424..88ebd97afd 100644 --- a/input/regression/autobeam-3-4-rules.ly +++ b/input/regression/autobeam-3-4-rules.ly @@ -1,24 +1,34 @@ -\version "2.15.31" +\version "2.15.40" \header { doctitle = "Special beaming rules for 3/4 time" - texinfo = " -Whole-measure and half-measure beaming in 3/4 time can be controlled. -The first measure should be beamed in one. The second measure should -be beamed in three. The third and fourth measures should be beamed -at 3/8. - " + texinfo = "Beaming in 3/4 time has special treatment. By default +six eighth notes are beamed in one. Beams that would imply 6/8 time +may be avoided with @code{beamHalfMeasure = ##f}. When the beaming +is changed, beams should start at the beginning of the measure. +" } \relative c' { - \time 3/4 - c8^\markup "Beam in one" c c c c c - \set Timing.beamWholeMeasure = ##f - c8^\markup "Beam in three" c c c c c - \set Timing.beamHalfMeasure = ##t - r4.^\markup "Beam in Two" c8 c c - c8 c c r4. + \time 3/4 + \set Timing.beamHalfMeasure = ##f + r4.^\markup "Prevent beams that imply 6/8 time" c8 c c | + c8 c r c c r | + r8_"but these beams are okay" c c c c c | c c c r r4 \bar "||" + + \set Timing.beamHalfMeasure = ##t + r4.^\markup "Or allow them" c8 c c c c r c c r + \break + + \unset Timing.beamExceptions + r8^\markup "Beam to the beat" c c c c c + c c c r r4 \bar "||" + + \set Timing.baseMoment = #(ly:make-moment 1 8) + \set Timing.beatStructure = #'(3 3) + r8^\markup "Override to beam groups of 3 eighth notes" c c c c c + r4. c8 c c c c c r4. } diff --git a/input/regression/autobeam-start-at-beginning-of-measure-in-3-4.ly b/input/regression/autobeam-start-at-beginning-of-measure-in-3-4.ly deleted file mode 100644 index a6b8652bf6..0000000000 --- a/input/regression/autobeam-start-at-beginning-of-measure-in-3-4.ly +++ /dev/null @@ -1,19 +0,0 @@ -\version "2.14.0" - -\header { - - texidoc = " -3/4 beaming has special rules, that are hardcoded in the autobeam -routines. When the beaming is changed, beams should start at the -beginning of the measure. In this case, the measure should be beamed -in two. -" -} - -\relative c' { - \time 3/4 - \set Timing.baseMoment = #(ly:make-moment 1 8) - \set Timing.beatStructure = #'(3 3) - \set Timing.beamExceptions = #'() - c8 c c c c c -} diff --git a/input/regression/multiple-time-sig-settings.ly b/input/regression/multiple-time-sig-settings.ly index ab95af5498..2caad79c8e 100644 --- a/input/regression/multiple-time-sig-settings.ly +++ b/input/regression/multiple-time-sig-settings.ly @@ -10,7 +10,7 @@ by the markups. \new Staff{ \relative c' { - \overrideTimeSignatureSettings + \overrideTimeSignatureSettings #'(4 . 4) % time signature fraction #'(1 . 4) % base moment fraction #'(1 1 1 1) % beatStructure @@ -19,7 +19,7 @@ by the markups. #'(3 . 4) % time signature fraction #'(1 . 4) % base moment fraction #'(1 1 1) % beatStructure - #'((end . (((1 . 8) . (2 2 2))))) % set exceptions to beam by 1/4 + #'() % beamExceptions \time 4/4 c8^\markup {"Beam by 1/4"} c c c c c c c | \time 3/4 diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index 41c96eae76..87ab20e524 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -558,6 +558,7 @@ ADD_TRANSLATOR (Auto_beam_engraver, "autoBeaming " "baseMoment " "beamExceptions " + "beamHalfMeasure " "beatStructure " "subdivideBeams ", diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 6eecb0031d..9bb731883c 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -626,8 +626,7 @@ automatically when an output definition (a @code{\score} or beatStructure = #'(1 1 1 1) beamExceptions = #'((end . (((1 . 8) . (4 4)) ((1 . 12) . (3 3 3 3))))) - beamWholeMeasure = ##t - beamHalfMeasure = ##f + beamHalfMeasure = ##t autoBeaming = ##t autoBeamCheck = #default-auto-beam-check diff --git a/python/convertrules.py b/python/convertrules.py index 2bfbdce1eb..60fb1740fd 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -3361,6 +3361,13 @@ def conv (str): not_first (r"\2 \\default"), str) return str +@rule ((2, 15, 40), r"Remove beamWholeMeasure") +def conv (str): + if re.search (r"\bbeamWholeMeasure\b", str): + stderr_write (NOT_SMART % "beamWholeMeasure") + stderr_write (_ ("beamExceptions controls whole-measure beaming.") + "\n") + return str + # Guidelines to write rules (please keep this at the end of this file) # # - keep at most one rule per version; if several conversions should be done, diff --git a/scm/auto-beam.scm b/scm/auto-beam.scm index 85ff3c65a1..b77022f2fc 100644 --- a/scm/auto-beam.scm +++ b/scm/auto-beam.scm @@ -16,9 +16,9 @@ ;;;; along with LilyPond. If not, see . ;; Determine whether an auto beam should be extended to the right -;; of the current stem. In general, we start anywhere except on -;; the last note of a beat. We end according to the follwing rules, -;; in order of decreasing priority: +;; of the current stem. We start anywhere, except mid-measure in +;; 3/4 time. We end according to the follwing rules, in order of +;; decreasing priority: ;; ;; 1. end ;; 2. end @@ -61,12 +61,6 @@ (define (beat-end? moment beat-structure) (pair? (member moment beat-structure))) ;; member returns a list if found, not #t - (define (use-special-3-4-rules? fraction base-moment exceptions) - "Should we use special 3/4 time signature beaming rules?" - (and (equal? fraction '(3 . 4)) - (equal? base-moment (ly:make-moment 1 4)) - (null? (assoc-get '(1 . 8) exceptions '())))) - ;; Start of actual auto-beam test routine ;; ;; @@ -85,8 +79,7 @@ '()) beamingfraction test-beam)) (non-grace (ly:make-moment (ly:moment-main-numerator measure-pos) @@ -114,35 +107,15 @@ exception-grouping 0 grouping-moment))) (if (= dir START) - ;; Start rules -- start anywhere unless 3/4 with default rules - ;; #t if beam is to start - (or (not (use-special-3-4-rules? - time-signature-fraction - base-moment - exceptions)) ;; start anywhere if not default 3/4 - (= (ly:moment-main-numerator pos) 0) ;; start at beginning of measure - (and beam-half-measure - (equal? type '(1 . 8)) - (equal? pos (ly:make-moment 3 8))) ;; start at mid-measure if 1/8 note beam - (beat-end? pos beat-endings) ;; start if at start of beat - (and (not (equal? test-beam base-moment)) ;; is beat split? - (not (beat-end? (ly:moment-add pos test-beam) - beat-endings)))) ;; will this note end the beat - ;; End rules -- #t if beam is to end + ;; Start rules -- #t if beam is allowed to start + (or beam-half-measure ;; Start anywhere, but option for mid-measure + (not (equal? (ly:moment-add pos pos) measure-length)) + (not (= 3 (car time-signature-fraction))) ;; in triple meter + (not (= (cdr type) ;; when the beamed note is 1/6 of a measure + (* 2 (cdr time-signature-fraction))))) + ;; End rules -- #t if beam is required to end (or (= (ly:moment-main-numerator pos) 0) ;; end at measure beginning - (if (use-special-3-4-rules? - time-signature-fraction - base-moment - exceptions) - ;; special rule for default 3/4 beaming - (if (and (equal? type '(1 . 8)) - (or beam-whole-measure - (and beam-half-measure - (not (equal? pos (ly:make-moment 3 8)))))) - #f - (beat-end? pos beat-endings)) - ;; rules for all other cases -- check for applicable exception - (if (null? exception-grouping) - (beat-end? pos beat-endings) ;; no exception, so check beat ending - (member pos exception-moments)))))))) ;; check exception rule + (if (null? exception-grouping) + (beat-end? pos beat-endings) ;; no exception, so check beat ending + (member pos exception-moments))))))) ;; check exception rule diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index dd6abce6d2..e0b45ab670 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -141,10 +141,8 @@ apply for the down staff of @code{PianoStaff}. Used by @code{\\autochange}.") (beamExceptions ,list? "An alist of exceptions to autobeam rules that normally end on beats.") - (beamHalfMeasure ,boolean? "Allow a half measure of eighth notes to -be beamed together in 3/4 time?") - (beamWholeMeasure ,boolean? "Allow a whole measure of eighth notes -to be beamed together in 3/4 time?") + (beamHalfMeasure ,boolean? "Whether to allow a beam to begin +halfway through the measure in triple time, which could look like 6/8.") (beatStructure ,list? "List of @code{baseMoment}s that are combined to make beats.") diff --git a/scm/time-signature-settings.scm b/scm/time-signature-settings.scm index 898eee600a..af852575dc 100644 --- a/scm/time-signature-settings.scm +++ b/scm/time-signature-settings.scm @@ -83,15 +83,14 @@ ((beamExceptions . ((end . (((1 . 32) . (8 8 8 8 8 8)))))))) ;; in 3 4 time: - ;; use defaults -- no entries necessary + ;; use defaults, but combine all beats into a unit if possible ;; - ;; Whole measure beaming is controlled by context property - ;; beamWholeMeasure - ;; Half measure beaming is controlled by context property - ;; beamHalfMeasure - + ;; set all beams to end on beats, but 1 8 to beam entire measure + ;; in order to avoid beaming every beam type for the entire measure, we set + ;; triplets back to every beat. ((3 . 4) . - ((beamExceptions . ()))) + ((beamExceptions . ((end . (((1 . 8) . (6)) ;1/8 note whole measure + ((1 . 12) . (3 3 3)))))))) ;Anything shorter by beat ;; in 3 8 time: ;; beam entire measure together