+ // trigger note collision mechanisms
+ Real stem_beg = internal_calc_stem_begin_position (me, false);
+ Real staff_space = Staff_symbol_referencer::staff_space (me);
+ Real half_space = staff_space * 0.5;
+
+ Interval height;
+ height[-d] = stem_beg * half_space;
+ height[d] = se * half_space + beam_end_corrective (me);
+
+ Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"),
+ 0.0);
+ bool stemlet = stemlet_length > 0.0;
+
+ Grob *lh = get_reference_head (me);
+
+ if (!lh)
+ {
+ if (stemlet && beam)
+ {
+ Real beam_translation = Beam::get_beam_translation (beam);
+ Real beam_thickness = Beam::get_beam_thickness (beam);
+ int beam_count = beam_multiplicity (me).length () + 1;
+
+ height[-d] = (height[d] - d
+ * (0.5 * beam_thickness
+ + beam_translation * max (0, (beam_count - 1))
+ + stemlet_length));
+ }
+ else if (!stemlet && beam)
+ height[-d] = height[d];
+ else if (stemlet && !beam)
+ me->programming_error ("Can't have a stemlet without a beam.");
+ }
+
+ me->set_property ("stem-begin-position", scm_from_double (height[-d] * 2 / staff_space));
+ me->set_property ("length", scm_from_double (height.length () * 2 / staff_space));