/*
[TODO]
- * shorter! (now +- 1000 lines)
- * less hairy code
+ -* shorter! (now +- 1000 lines)
+
+ -* less hairy code
+
*/
/*
If dir is not determined: get default
*/
- return to_dir (me->get_grob_property ("default-neutral-direction"));
+ return to_dir (me->get_grob_property ("neutral-direction"));
}
SCM s = me->get_grob_property ("staff-position");
if (gh_number_p (s))
{
- Real y = gh_scm2double (s) * staff_space;
+ Real y = gh_scm2double (s) * staff_space * 0.5;
me->set_grob_property ("y", gh_double2scm (y));
}
s = me->get_grob_property ("height");
if (gh_number_p (s))
{
- Real dy = gh_scm2double (s) * staff_space;
+ Real dy = gh_scm2double (s) * staff_space * 0.5;
me->set_grob_property ("dy", gh_double2scm (dy));
}
FIXME: clean me up.
*/
Molecule
-Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev)
+Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev,
+ Real dy, Real dydx
+ )
{
// ugh -> use commonx
if ((next && ! (next->relative_coordinate (0, X_AXIS) > here->relative_coordinate (0, X_AXIS))) ||
Real bdy = interbeam_f;
Real stemdx = staffline_f;
+#if 0
// ugh -> use commonx
Real dx = visible_stem_count (me) ?
last_visible_stem (me)->relative_coordinate (0, X_AXIS) - first_visible_stem (me)->relative_coordinate (0, X_AXIS)
: 0.0;
- Real dy = gh_scm2double (me->get_grob_property ("dy"));
- Real dydx = dy && dx ? dy/dx : 0;
-
+#endif
+
Molecule leftbeams;
Molecule rightbeams;
Direction dir = Directional_element_interface::get (me);
+ /* [Tremolo] beams on whole notes may not have direction set? */
+ if (dir == CENTER)
+ dir = Directional_element_interface::get (here);
+
/* half beams extending to the left. */
if (prev)
{
b.translate_axis (-dir * bdy * j, Y_AXIS);
rightbeams.add_molecule (b);
}
- // TODO: notehead widths differ for different types
- gap_f = nw_f / 2;
+ if (Stem::invisible_b (here))
+ gap_f = nw_f;
+ else
+ gap_f = nw_f / 2;
w -= 2 * gap_f;
a = Lookup::beam (dydx, w + stemdx, thick);
}
for (; j < rwholebeams; j++)
{
Molecule b (a);
- b.translate (Offset (Stem::invisible_b (here) ? 0 : gap_f, -dir * bdy * j));
+ Real tx = 0;
+ if (Stem::invisible_b (here))
+ // ugh, see chord-tremolo.ly
+ tx = (-dir + 1) / 2 * nw_f * 1.5 + gap_f/4;
+ else
+ tx = gap_f;
+ b.translate (Offset (tx, -dir * bdy * j));
rightbeams.add_molecule (b);
}
dx = stems.top ()->relative_coordinate (0, X_AXIS) - x0;
}
+
+
+ /*
+ TODO: the naming of the grob properties sucks.
+ */
+ SCM dy_s = me->get_grob_property ("dy");
+ SCM y_s = me->get_grob_property ("y");
+
- Real dy = gh_scm2double (me->get_grob_property ("dy"));
+ Real dy = gh_number_p (dy_s) ? gh_scm2double (dy_s) : 0.0;
Real dydx = dy && dx ? dy/dx : 0;
- Real y = gh_scm2double (me->get_grob_property ("y"));
+ Real y = gh_number_p (y_s) ? gh_scm2double (y_s) : 0.0;
for (int j=0; j <stems.size (); j++)
Item * prev = (j > 0)? stems[j-1] : 0;
Item * next = (j < stems.size ()-1) ? stems[j+1] :0;
- Molecule sb = stem_beams (me, i, next, prev);
+ Molecule sb = stem_beams (me, i, next, prev, dy, dydx);
Real x = i->relative_coordinate (0, X_AXIS)-x0;
sb.translate (Offset (x, x * dydx + y));
mol.add_molecule (sb);