#include "beam.hh"
-#include "beaming.hh"
+#include "beaming-pattern.hh"
#include "directional-element-interface.hh"
#include "main.hh"
#include "international.hh"
Beam_stem_segment::Beam_stem_segment ()
{
+ max_connect_ = 1000; // infinity
stem_ = 0;
width_ = 0.0;
stem_x_ = 0.0;
/* Beams with less than 2 two stems don't make much sense, but could happen
when you do
- [r8 c8 r8].
+ r8[ c8 r8]
- For a beam that only has one stem, we try to do some disappearance magic:
- we revert the flag, and move on to The Eternal Engraving Fields. */
+ */
Direction dir = CENTER;
seg.width_ = stem_width;
seg.stem_index_ = i;
seg.dir_ = d;
+ seg.max_connect_ = robust_scm2int (stem->get_property ("max-beam-connect"), 1000);
+
Direction stem_dir = get_grob_direction (stem);
seg.gapped_
i != stem_segments.end (); i++)
{
vector<Beam_stem_segment> segs = (*i).second;
- vector_sort (segs, default_compare);
+ vector_sort (segs, less<Beam_stem_segment> ());
Beam_segment current;
- current.vertical_count_ = (*i).first;
+
+ int vertical_count = (*i).first;
for (vsize j = 0; j < segs.size (); j++)
{
/*
j == segs.size() - 1 && event_dir==RIGHT);
Drul_array<bool> inside (j > 0, j < segs.size()-1);
bool event = on_bound[event_dir]
- || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1;
+ || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1
+ || (abs (vertical_count) >= segs[j].max_connect_
+ || abs (vertical_count) >= segs[j + event_dir].max_connect_);
if (!event)
continue;
- current.vertical_count_ = (*i).first;
+ current.vertical_count_ = vertical_count;
current.horizontal_[event_dir] = segs[j].stem_x_;
if (segs[j].dir_ == event_dir)
{
if (event_dir == RIGHT)
{
- current.vertical_count_ = (*i).first;
segments.push_back (current);
current = Beam_segment();
}
for (vsize i = 0; i < stems.size (); i++)
{
Grob *s = stems[i];
- if (Stem::is_invisible (s))
- continue;
bool french = to_boolean (s->get_property ("french-beaming"));
Real stem_y = calc_stem_y (me, s, common,
Make the stems go up to the end of the beam. This doesn't matter
for normal beams, but for tremolo beams it looks silly otherwise.
*/
- if (gap)
+ if (gap
+ && !Stem::is_invisible (s))
stem_y += thick * 0.5 * get_grob_direction (s);
+ /*
+ Do set_stemend for invisible stems too, so tuplet brackets
+ have a reference point for sloping
+ */
Stem::set_stemend (s, 2 * stem_y / staff_space);
}
}
void
-Beam::set_beaming (Grob *me, Beaming_info_list const *beaming)
+Beam::set_beaming (Grob *me, Beaming_pattern const *beaming)
{
extract_grob_set (me, "stems", stems);
if (beaming_prop == SCM_EOL
|| index_get_cell (beaming_prop, d) == SCM_EOL)
{
- int count = beaming->infos_.at (i).beam_count_drul_[d];
+ int count = beaming->beamlet_count (i, d);
if (i > 0
&& i < stems.size () -1
&& Stem::is_invisible (stem))
- count = min (count, beaming->infos_.at (i).beam_count_drul_[-d]);
+ count = min (count, beaming->beamlet_count (i,-d));
if ( ((i == 0 && d == LEFT)
|| (i == stems.size ()-1 && d == RIGHT))
rest -> stem -> beam -> interpolate_y_position ()
*/
-MAKE_SCHEME_CALLBACK (Beam, rest_collision_callback, 2);
+MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, rest_collision_callback, 2, 1);
SCM
Beam::rest_collision_callback (SCM smob, SCM prev_offset)
{