From 05b311f14f39e5148ca93028a314a0bb2fe0dedd Mon Sep 17 00:00:00 2001 From: Carl Sorensen Date: Wed, 18 Jan 2012 13:15:20 -0700 Subject: [PATCH] Add option for strictBeatBeaming This reverts to the default behavior from 2.14 that places a higher priority on avoiding beamlets than on beaming to the beat. At the user's option, beaming can be strictly to the beat. --- Documentation/notation/rhythms.itely | 5 ++++ .../snippets/new/strict-beat-beaming.ly | 21 ++++++++++++++ Documentation/snippets/strict-beat-beaming.ly | 29 +++++++++++++++++++ input/regression/beamlet-point-toward-beat.ly | 15 ++++++---- lily/beaming-pattern.cc | 19 +++++++++--- lily/include/beaming-pattern.hh | 1 + scm/define-context-properties.scm | 2 ++ 7 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 Documentation/snippets/new/strict-beat-beaming.ly create mode 100644 Documentation/snippets/strict-beat-beaming.ly diff --git a/Documentation/notation/rhythms.itely b/Documentation/notation/rhythms.itely index 624ebacdf1..c22f55fb52 100644 --- a/Documentation/notation/rhythms.itely +++ b/Documentation/notation/rhythms.itely @@ -2189,6 +2189,11 @@ The default beaming rules can be found in @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {subdividing-beams.ly} +@cindex beamlets, orienting + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{strict-beat-beaming.ly} + @cindex measure groupings @cindex beats, grouping @cindex grouping beats diff --git a/Documentation/snippets/new/strict-beat-beaming.ly b/Documentation/snippets/new/strict-beat-beaming.ly new file mode 100644 index 0000000000..fea2dd0289 --- /dev/null +++ b/Documentation/snippets/new/strict-beat-beaming.ly @@ -0,0 +1,21 @@ +\version "2.15.27" + +\header { + texidoc = " +Beamlets can be set to point in the direction of the beat to which they +belong. The first beam avoids sticking out flags (the default); +the second beam strictly follows the beat. +" + + doctitle = "Strict beat beaming" + + lsrtags = "rhythms" +} + + +\relative c'' { + \time 6/8 + a8. a16 a a + \set strictBeatBeaming = ##t + a8. a16 a a +} diff --git a/Documentation/snippets/strict-beat-beaming.ly b/Documentation/snippets/strict-beat-beaming.ly new file mode 100644 index 0000000000..c0e4608e97 --- /dev/null +++ b/Documentation/snippets/strict-beat-beaming.ly @@ -0,0 +1,29 @@ +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.15.27 +\version "2.15.27" + +\header { + texidoc = " +Beamlets can be set to point in the direction of the beat to which they +belong. The first beam avoids sticking out flags (the default); +the second beam strictly follows the beat. +" + + doctitle = "Strict beat beaming" + + lsrtags = "rhythms" +} % begin verbatim + + + +\relative c'' { + \time 6/8 + a8. a16 a a + \set strictBeatBeaming = ##t + a8. a16 a a +} diff --git a/input/regression/beamlet-point-toward-beat.ly b/input/regression/beamlet-point-toward-beat.ly index b1a761fdbb..fa0c15a360 100644 --- a/input/regression/beamlet-point-toward-beat.ly +++ b/input/regression/beamlet-point-toward-beat.ly @@ -1,14 +1,17 @@ -\version "2.15.20" +\version "2.15.27" \header { texidoc = " -Beamlets should point in the direction of the beat to which they -belong. +Beamlets can be set to point in the direction of the beat to which they +belong. The first beam avoids sticking out flags (the default); +the second beam strictly follows the beat. " } -\relative c' { -b16. b32 b32 b16. -b16.[ b32 b b b b16.] +\relative c'' { + \time 6/8 + a8. a16 a a + \set strictBeatBeaming = ##t + a8. a16 a a } diff --git a/lily/beaming-pattern.cc b/lily/beaming-pattern.cc index 2db441ef69..cc569c7c73 100644 --- a/lily/beaming-pattern.cc +++ b/lily/beaming-pattern.cc @@ -99,6 +99,15 @@ Beaming_pattern::flag_direction (Beaming_options const &options, vsize i) const if (count <= left_count && count <= right_count) return CENTER; + else if (!options.strict_beat_beaming_) + { + // Try to avoid sticking-out flags as much as possible by pointing + // my flags at the neighbor with the most flags. + if (right_count > left_count) + return RIGHT; + else if (left_count > right_count) + return LEFT; + } // If all else fails, point the beamlet away from the important moment. return (infos_[i].rhythmic_importance_ < infos_[i + 1].rhythmic_importance_) @@ -174,8 +183,8 @@ update_tuplet (Moment start_moment, Rational factor, Moment *tuplet_start_moment int tuplet_number = (int) factor.den (); if ((tuplet_number > 1) && (tuplet_start_moment->num () < 0)) *tuplet_start_moment = start_moment; - else if (tuplet_number == 1) - *tuplet_start_moment = Moment (-1, 1); + else if (tuplet_number == 1) + *tuplet_start_moment = Moment (-1, 1); } @@ -270,8 +279,8 @@ Beaming_pattern::find_rhythmic_importance (Beaming_options const &options) // important. For tuplets, we need to make sure that we use // the fraction of the tuplet, instead of the fraction of // a beat. - Moment ratio = (tuplet_number == 1) - ? dt / options.base_moment_ + Moment ratio = (tuplet_number == 1) + ? dt / options.base_moment_ : tuplet_dt / Moment (1, 8) / tuplet_moment; if (infos_[i].rhythmic_importance_ >= 0) infos_[i].rhythmic_importance_ = (int) ratio.den (); @@ -389,6 +398,7 @@ Beaming_options::from_context (Context *context) { grouping_ = context->get_property ("beatStructure"); subdivide_beams_ = to_boolean (context->get_property ("subdivideBeams")); + strict_beat_beaming_ = to_boolean (context->get_property ("strictBeatBeaming")); base_moment_ = robust_scm2moment (context->get_property ("baseMoment"), Moment (1, 4)); measure_length_ = robust_scm2moment (context->get_property ("measureLength"), @@ -399,4 +409,5 @@ Beaming_options::Beaming_options () { grouping_ = SCM_EOL; subdivide_beams_ = false; + strict_beat_beaming_ = false; } diff --git a/lily/include/beaming-pattern.hh b/lily/include/beaming-pattern.hh index 11265e9736..704c8f070c 100644 --- a/lily/include/beaming-pattern.hh +++ b/lily/include/beaming-pattern.hh @@ -28,6 +28,7 @@ struct Beaming_options { SCM grouping_; bool subdivide_beams_; + bool strict_beat_beaming_; Moment base_moment_; Moment measure_length_; diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index 835539ef5b..43079859c6 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -476,6 +476,8 @@ verse. Use in @code{Lyrics} context.") on the left side of the next note. Overrides automatic beaming. The value is only used once, and then it is erased.") (stemRightBeamCount ,integer? "See @code{stemLeftBeamCount}.") + (strictBeatBeaming ,boolean? "Should partial beams reflect the +beat structure even if it causes flags to hang out?") (stringNumberOrientations ,list? "See @code{fingeringOrientations}.") (stringOneTopmost ,boolean? "Whether the first string is -- 2.39.2