2 beaming-info.cc -- implement Beaming_info, Beaming_info_list
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
11 Beaming_info::Beaming_info ()
14 beam_count_drul_[LEFT] = 0;
15 beam_count_drul_[RIGHT] = 0;
18 Beaming_info::Beaming_info (Moment m, int i)
21 beam_count_drul_[LEFT] = i;
22 beam_count_drul_[RIGHT] = i;
25 const int at_beat = 1 << 15; // WTF is this.
28 Beaming_info_list::best_splitpoint_index (Moment &beat_length,
31 int min_denominator = INT_MAX;
35 for (vsize i = 1; i < infos_.size (); i++)
37 beat_pos = infos_[i].start_moment_ / beat_length;
38 int den = beat_pos.den ();
39 if (infos_[i].beam_count_drul_[LEFT] == infos_[i - 1].beam_count_drul_[RIGHT]
43 if (den < min_denominator)
46 min_denominator = den;
50 return min_index | (min_denominator == 1 && subdivide ? at_beat : 0);
54 Beaming_info_list::beam_extend_count (Direction d) const
56 if (infos_.size () == 1)
57 return infos_[0].beam_count_drul_[d];
59 Beaming_info thisbeam = boundary (infos_, d, 0);
60 Beaming_info next = boundary (infos_, d, 1);
62 return min (thisbeam.beam_count_drul_[-d], next.beam_count_drul_[d]);
66 Beaming_info_list::beamify (Moment &beat_length, bool subdivide)
68 if (infos_.size () <= 1)
71 Drul_array<Beaming_info_list> splits;
73 int m = best_splitpoint_index (beat_length, subdivide);
74 bool split = subdivide && (m & at_beat);
77 splits[LEFT].infos_ = vector<Beaming_info> (infos_.begin (),
79 splits[RIGHT].infos_ = vector<Beaming_info> (infos_.begin () + m,
86 splits[d].beamify (beat_length, subdivide);
88 while (flip (&d) != LEFT);
90 int middle_beams = (split ? 1
91 : min (splits[RIGHT].beam_extend_count (LEFT),
92 splits[LEFT].beam_extend_count (RIGHT)));
96 if (splits[d].infos_.size () != 1)
97 boundary (splits[d].infos_, -d, 0).beam_count_drul_[-d] = middle_beams;
99 while (flip (&d) != LEFT);
101 infos_ = splits[LEFT].infos_;
102 infos_.insert (infos_.end (),
103 splits[RIGHT].infos_.begin (),
104 splits[RIGHT].infos_.end ());
110 Beaming_info_list::add_stem (Moment m, int b)
112 infos_.push_back (Beaming_info (m, b));
116 Beaming_info_list::clip_edges ()
120 infos_[0].beam_count_drul_[LEFT] = 0;
121 infos_.back ().beam_count_drul_[RIGHT] = 0;