+void
+Beam_engraver::acknowledge_stem (Grob_info info)
+{
+ if (!beam_)
+ return;
+
+ Moment now = now_mom ();
+ if (!valid_start_point ())
+ return;
+
+ Item *stem = dynamic_cast<Item *> (info.grob ());
+ if (Stem::get_beam (stem))
+ return;
+
+
+
+ Stream_event *ev = info.ultimate_event_cause ();
+ if (!ev->in_event_class ("rhythmic-event"))
+ {
+ info.grob ()->warning (_ ("stem must have Rhythmic structure"));
+ return;
+ }
+
+ last_stem_added_at_ = now;
+ int durlog = unsmob_duration (ev->get_property ("duration"))->duration_log ();
+ if (durlog <= 2)
+ {
+ ev->origin ()->warning (_ ("stem does not fit in beam"));
+ prev_start_ev_->origin ()->warning (_ ("beam was started here"));
+ /*
+ don't return, since
+
+ [r4 c8] can just as well be modern notation.
+ */
+ }
+
+ stem->set_property ("duration-log",
+ scm_from_int (durlog));
+ Moment stem_location = now - beam_start_mom_ + beam_start_location_;
+ beam_info_->add_stem (stem_location,
+ max (durlog- 2, 0),
+ Stem::is_invisible (stem));
+ Beam::add_stem (beam_, stem);
+}
+
+ADD_ACKNOWLEDGER (Beam_engraver, stem);
+ADD_ACKNOWLEDGER (Beam_engraver, rest);