+
+MAKE_SCHEME_CALLBACK (Note_head,brew_molecule,1);
+SCM
+Note_head::brew_molecule (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+
+ /*
+ ledgers don't take space. See top of file.
+ */
+ return internal_brew_molecule (me, false).smobbed_copy ();
+}
+
+/*
+ Compute the width the head without ledgers.
+ */
+Interval
+Note_head::head_extent (Grob *me, Axis a)
+{
+ return internal_brew_molecule (me, false).extent (a);
+}
+
+bool
+Note_head::has_interface (Grob*m)
+{
+ return m&& m->has_interface (ly_symbol2scm ("note-head-interface"));
+}
+
+
+MAKE_SCHEME_CALLBACK (Note_head,brew_ez_molecule,1);
+
+SCM
+Note_head::brew_ez_molecule (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ int l = Rhythmic_head::balltype_i (me);
+
+ int b = (l >= 2);
+
+ SCM cause = me->get_grob_property ("cause");
+ SCM spitch = unsmob_music (cause)->get_mus_property ("pitch");
+ Pitch* pit = unsmob_pitch (spitch);
+
+ char s[2] = "a";
+ s[0] = (pit->notename_i_ + 2)%7 + 'a';
+ s[0] = toupper (s[0]);
+
+ SCM charstr = ly_str02scm (s);
+
+ SCM at = scm_list_n (ly_symbol2scm ("ez-ball"),
+ charstr,
+ gh_int2scm (b),
+ gh_int2scm (1-b),
+ SCM_UNDEFINED);
+ Box bx (Interval (0, 1.0), Interval (-0.5, 0.5));
+ Molecule m (bx, at);
+ int p = (int) rint (Staff_symbol_referencer::position_f (me));
+
+ int sz = Staff_symbol_referencer::line_count (me)-1;
+ int streepjes_i = abs (p) < sz
+ ? 0
+ : (abs (p) - sz) /2;
+
+ if (streepjes_i)
+ {
+ Direction dir = (Direction)sign (p);
+ Interval hd = m.extent (X_AXIS);
+ Real hw = hd.length ()/4;
+ m.add_molecule (ledger_lines (me, false, streepjes_i, dir,
+ Interval (hd[LEFT] - hw,
+ hd[RIGHT] + hw)));
+ }
+
+ return m.smobbed_copy ();
+}
+
+
+Real
+Note_head::stem_attachment_coordinate (Grob *me, Axis a)
+{
+ SCM v = me->get_grob_property ("stem-attachment-function");
+
+ if (!gh_procedure_p (v))
+ return 0.0;
+
+ SCM st = me->get_grob_property ("style");
+ SCM result = gh_apply (v, scm_list_n (st, SCM_UNDEFINED));
+
+ if (!gh_pair_p (result))
+ return 0.0;
+
+ result = (a == X_AXIS) ? ly_car (result) : ly_cdr (result);
+
+ return gh_number_p (result) ? gh_scm2double (result) : 0.0;
+}