+ Real r=0;
+ if (Score_element * f = first_head (me))
+ {
+ Interval head_wid(0, f->extent (X_AXIS).length ());
+
+ if (to_boolean (me->get_elt_property ("stem-centered")))
+ return head_wid.center ();
+
+ Real rule_thick = me->paper_l ()->get_var ("stemthickness");
+ Direction d = get_direction (me);
+ r = head_wid[d] - d * rule_thick ;
+ }
+ return r;
+}
+
+
+
+Score_element*
+Stem::beam_l (Score_element*me)
+{
+ SCM b= me->get_elt_property ("beam");
+ return unsmob_element (b);
+}
+
+
+// ugh still very long.
+Stem_info
+Stem::calc_stem_info (Score_element*me)
+{
+ Score_element * beam = beam_l (me);
+
+ Direction beam_dir = Directional_element_interface::get (beam);
+ if (!beam_dir)
+ {
+ programming_error ("Beam dir not set.");
+ beam_dir = UP;
+ }
+
+
+ Real staff_space = Staff_symbol_referencer::staff_space (me);
+ Real half_space = staff_space / 2;
+ Real interbeam_f = me->paper_l ()->interbeam_f (Beam::get_multiplicity (beam));
+ Real thick = gh_scm2double (beam->get_elt_property ("beam-thickness"));
+ int multiplicity = Beam::get_multiplicity (beam);
+
+ Stem_info info;
+ info.idealy_f_ = chord_start_f (me);
+
+ // for simplicity, we calculate as if dir == UP
+ info.idealy_f_ *= beam_dir;
+ SCM grace_prop = me->get_elt_property ("grace");
+
+ bool grace_b = to_boolean (grace_prop);