+
+Moment
+Beaming_pattern::start_moment (int i) const
+{
+ return infos_.at (i).start_moment_;
+}
+
+Moment
+Beaming_pattern::end_moment (int i) const
+{
+ Duration dur (2 + max (beamlet_count (i, LEFT),
+ beamlet_count (i, RIGHT)),
+ 0);
+
+ return infos_.at (i).start_moment_
+ + infos_.at (i).factor_ * dur.get_length ();
+}
+
+Moment
+Beaming_pattern::remaining_length (int i) const
+{
+ return end_moment (infos_.size () - 1) - infos_[i].start_moment_;
+}
+
+int
+Beaming_pattern::beam_count_for_rhythmic_position (int idx) const
+{
+ // Calculate number of beams representing the rhythmic position of given stem
+ return intlog2(infos_[idx].start_moment_.main_part_.den()) - 2;
+}
+
+int
+Beaming_pattern::beam_count_for_length (Moment len) const
+{
+ return intlog2(len.main_part_.den()) - 2 - intlog2(len.main_part_.num());
+}
+
+bool
+Beaming_pattern::invisibility (int i) const
+{
+ return infos_.at (i).invisible_;
+}
+
+Rational
+Beaming_pattern::factor (int i) const
+{
+ 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
+*/
+Beaming_pattern *
+Beaming_pattern::split_pattern (int i)
+{
+ Beaming_pattern *new_pattern = 0;
+ int count;
+
+ new_pattern = new Beaming_pattern ();
+ for (vsize j = i + 1; j < infos_.size (); j++)
+ {
+ count = max (beamlet_count (j, LEFT), beamlet_count (j, RIGHT));
+ new_pattern->add_stem (start_moment (j),
+ count,
+ invisibility (j),
+ factor (j),
+ tuplet_start (j));
+ }
+ for (vsize j = i + 1; j < infos_.size ();)
+ infos_.pop_back ();
+ return (new_pattern);
+}
+
+void
+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"),
+ Moment (4, 4));
+}
+
+Beaming_options::Beaming_options ()
+{
+ grouping_ = SCM_EOL;
+ subdivide_beams_ = false;
+ strict_beat_beaming_ = false;
+}