beam_count_drul_[RIGHT] = 0;
invisible_ = false;
factor_ = Rational (1);
-
+ tuplet_start_ = false;
}
-Beam_rhythmic_element::Beam_rhythmic_element (Moment m, int i, bool inv, Rational factor)
+Beam_rhythmic_element::Beam_rhythmic_element (Moment m, int i, bool inv,
+ Rational factor, bool tuplet_start)
{
start_moment_ = m;
rhythmic_importance_ = 0;
beam_count_drul_[RIGHT] = i;
invisible_ = inv;
factor_ = factor;
+ tuplet_start_ = tuplet_start;
}
void
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_)
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);
}
Moment tuplet_dt = infos_[i].start_moment_ - tuplet_start_moment;
tuplet_number = tuplet.den ();
// set the beat end (if not in a tuplet) and increment the next beat
- if (tuplet_number == 1 && infos_[i].start_moment_ == next_beat_pos)
+ if (infos_[i].start_moment_ == next_beat_pos)
{
- infos_[i].rhythmic_importance_ = -1;
- next_beat_pos += options.base_moment_;
+ if (tuplet_number == 1)
+ {
+ infos_[i].rhythmic_importance_ = -1;
+ next_beat_pos += options.base_moment_;
+ }
+ if (infos_[i].tuplet_start_)
+ infos_[i].rhythmic_importance_ = -1;
}
// The rhythmic importance of a stem between beats depends on its fraction
// of a beat: those stems with a lower denominator are deemed more
// 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 ();
}
void
-Beaming_pattern::add_stem (Moment m, int b, bool invisible, Rational factor)
+Beaming_pattern::add_stem (Moment m, int b, bool invisible, Rational factor, bool tuplet_start)
{
- infos_.push_back (Beam_rhythmic_element (m, b, invisible, factor));
+ infos_.push_back (Beam_rhythmic_element (m, b, invisible, factor, tuplet_start));
}
Beaming_pattern::Beaming_pattern ()
return infos_.at (i).factor_;
}
+bool
+Beaming_pattern::tuplet_start (int i) const
+{
+ return infos_.at (i).tuplet_start_;
+}
+
/*
Split a beaming pattern at index i and return a new
Beaming_pattern containing the removed elements
new_pattern->add_stem (start_moment (j),
count,
invisibility (j),
- factor (j));
+ factor (j),
+ tuplet_start (j));
}
for (vsize j = i + 1; j < infos_.size ();)
infos_.pop_back ();
{
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"),
{
grouping_ = SCM_EOL;
subdivide_beams_ = false;
+ strict_beat_beaming_ = false;
}