*/
+
#include <math.h> // tanh.
-#include "stencil.hh"
+#include "beam.hh"
+#include "interval-set.hh"
#include "directional-element-interface.hh"
#include "beaming.hh"
-#include "beam.hh"
#include "misc.hh"
#include "least-squares.hh"
#include "stem.hh"
Beam::get_beam_count (Grob *me)
{
int m = 0;
- for (SCM s = me->get_property ("stems"); ly_c_pair_p (s); s = ly_cdr (s))
+ for (SCM s = me->get_property ("stems"); scm_is_pair (s); s = scm_cdr (s))
{
- Grob *stem = unsmob_grob (ly_car (s));
+ Grob *stem = unsmob_grob (scm_car (s));
m = m >? (Stem::beam_multiplicity (stem).length () + 1);
}
return m;
{
me->warning (_ ("removing beam with less than two stems"));
- unsmob_grob (ly_car (stems))->set_property ("beam", SCM_EOL);
+ unsmob_grob (scm_car (stems))->set_property ("beam", SCM_EOL);
me->suicide ();
return SCM_UNSPECIFIED;
Direction left_dir,
Direction right_dir)
{
- Slice lslice = int_list_to_slice (ly_cdr (left_beaming));
+ Slice lslice = int_list_to_slice (scm_cdr (left_beaming));
int best_count = 0;
int best_start = 0;
for (int i = lslice[-left_dir];
(i - lslice[left_dir])* left_dir <= 0 ; i+= left_dir)
{
- int count =0;
- for ( SCM s = ly_car (right_beaming); ly_c_pair_p (s); s = ly_cdr (s))
+ int count = 0;
+ for ( SCM s = scm_car (right_beaming); scm_is_pair (s); s = scm_cdr (s))
{
- int k = - right_dir * scm_to_int (ly_car (s)) + i;
+ int k = - right_dir * scm_to_int (scm_car (s)) + i;
if (scm_c_memq (scm_int2num (k), left_beaming) != SCM_BOOL_F)
count ++;
}
void
Beam::connect_beams (Grob *me)
{
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
Slice last_int;
SCM this_beaming = this_stem->get_property ("beaming");
Direction this_dir = get_grob_direction (this_stem);
- if (ly_c_pair_p (last_beaming) && ly_c_pair_p (this_beaming))
+ if (scm_is_pair (last_beaming) && scm_is_pair (this_beaming))
{
int start_point = position_with_maximal_common_beams
(last_beaming, this_beaming,
new_slice.set_empty ();
SCM s = index_get_cell (this_beaming, d);
- for (; ly_c_pair_p (s); s = ly_cdr (s))
+ for (; scm_is_pair (s); s = scm_cdr (s))
{
int new_beam_pos =
- start_point - this_dir * scm_to_int (ly_car (s));
+ start_point - this_dir * scm_to_int (scm_car (s));
new_slice.add_point (new_beam_pos);
scm_set_car_x (s, scm_int2num (new_beam_pos));
else
{
scm_set_car_x ( this_beaming, SCM_EOL);
- SCM s = ly_cdr (this_beaming);
- for (; ly_c_pair_p (s); s = ly_cdr (s))
+ SCM s = scm_cdr (this_beaming);
+ for (; scm_is_pair (s); s = scm_cdr (s))
{
- int np = - this_dir * scm_to_int (ly_car (s));
+ int np = - this_dir * scm_to_int (scm_car (s));
scm_set_car_x (s, scm_int2num (np));
last_int.add_point (np);
}
scm_set_cdr_x (this_beaming, SCM_EOL);
}
- if (scm_ilength (ly_cdr (this_beaming)) > 0)
+ if (scm_ilength (scm_cdr (this_beaming)) > 0)
{
last_beaming = this_beaming;
last_dir = this_dir;
Spanner *me = unsmob_spanner (grob);
position_beam (me);
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
Grob* xcommon = common_refpoint_of_array (stems, me, X_AXIS);
pos = Interval (0,0);
}
else
- pos= ly_scm2realdrul (posns);
+ pos = ly_scm2realdrul (posns);
scale_drul (&pos, Staff_symbol_referencer::staff_space (me));
Real gap_length = robust_scm2double (me->get_property ("gap"), 0.0);
Stencil the_beam;
- Real lt = me->get_paper ()->get_dimension (ly_symbol2scm ("linethickness"));
+ Real lt = me->get_layout ()->get_dimension (ly_symbol2scm ("linethickness"));
for (int i = 0; i<= stems.size (); i++)
{
right from the left stem, and rfliebertjes pointing left from
right stem.
*/
- SCM left = (i > 0) ? ly_cdr (last_beaming) : SCM_EOL;
- SCM right = st ? ly_car (this_beaming) : SCM_EOL;
+ SCM left = (i > 0) ? scm_cdr (last_beaming) : SCM_EOL;
+ SCM right = st ? scm_car (this_beaming) : SCM_EOL;
Array<int> full_beams;
Array<int> lfliebertjes;
Array<int> rfliebertjes;
for (SCM s = left;
- ly_c_pair_p (s); s =ly_cdr (s))
+ scm_is_pair (s); s = scm_cdr (s))
{
- int b = scm_to_int (ly_car (s));
- if (scm_c_memq (ly_car (s), right) != SCM_BOOL_F)
+ int b = scm_to_int (scm_car (s));
+ if (scm_c_memq (scm_car (s), right) != SCM_BOOL_F)
{
full_beams.push (b);
}
}
}
for (SCM s = right;
- ly_c_pair_p (s); s =ly_cdr (s))
+ scm_is_pair (s); s = scm_cdr (s))
{
- int b = scm_to_int (ly_car (s));
- if (scm_c_memq (ly_car (s), left) == SCM_BOOL_F)
+ int b = scm_to_int (scm_car (s));
+ if (scm_c_memq (scm_car (s), left) == SCM_BOOL_F)
{
rfliebertjes.push (b);
}
Real break_overshoot = 3.0;
Real w = (i > 0 && st) ? (xposn - last_xposn) : break_overshoot;
- Real stem_offset =0.0;
+ Real stem_offset = 0.0;
if (i > 0)
{
w += last_stem_width / 2;
w += stem_width/ 2 ;
- Real blot = me->get_paper ()->get_dimension (ly_symbol2scm ("blotdiameter"));
+ Real blot = me->get_layout ()->get_dimension (ly_symbol2scm ("blotdiameter"));
Stencil whole = Lookup::beam (slope, w, thick, blot);
Stencil gapped;
#if (DEBUG_QUANTING)
SCM quant_score = me->get_property ("quant-score");
- if (to_boolean (me->get_paper ()->lookup_variable (ly_symbol2scm ("debug-beam-quanting")))
+ if (to_boolean (me->get_layout ()->lookup_variable (ly_symbol2scm ("debug-beam-quanting")))
&& scm_is_string (quant_score))
{
Direction stem_dir = stems.size() ? to_dir (stems[0]->get_property ("direction")) : UP;
- Stencil tm = *unsmob_stencil (Text_item::interpret_markup
- (me->get_paper ()->self_scm (), properties, quant_score));
+ Stencil tm = *unsmob_stencil (Text_interface::interpret_markup
+ (me->get_layout ()->self_scm (), properties, quant_score));
the_beam.add_at_edge (Y_AXIS, stem_dir, tm, 1.0, 0);
}
#endif
count[UP] = count[DOWN] = 0;
Direction d = DOWN;
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
do {
Grob *s = stems[i];
Direction sd = get_grob_direction (s);
Beam::set_stem_directions (Grob *me, Direction d)
{
Link_array<Grob> stems
- =Pointer_group_interface__extract_grobs (me, (Grob*) 0, "stems");
+ = Pointer_group_interface__extract_grobs (me, (Grob*) 0, "stems");
- for (int i=0; i <stems.size (); i++)
+ for (int i = 0; i <stems.size (); i++)
{
Grob *s = stems[i];
}
}
-/*
- A union of intervals in the real line.
-
- Abysmal performance (quadratic) for large N, hopefully we don't have
- that large N. In any case, this should probably be rewritten to use
- a balanced tree.
- */
-struct Int_set
-{
- Array<Interval> allowed_regions_;
-
- Int_set ()
- {
- set_full ();
- }
-
- void set_full ()
- {
- allowed_regions_.clear ();
- Interval s;
- s.set_full ();
- allowed_regions_.push (s);
- }
-
- void remove_interval (Interval rm)
- {
- for (int i = 0; i < allowed_regions_.size (); )
- {
- Interval s = rm;
-
- s.intersect (allowed_regions_[i]);
-
- if (!s.is_empty ())
- {
- Interval before = allowed_regions_[i];
- Interval after = allowed_regions_[i];
-
- before[RIGHT] = s[LEFT];
- after[LEFT] = s[RIGHT];
-
- if (!before.is_empty () && before.length () > 0.0)
- {
- allowed_regions_.insert (before, i);
- i++;
- }
- allowed_regions_.del (i);
- if (!after.is_empty () && after.length () > 0.0)
- {
- allowed_regions_.insert (after, i);
- i++;
- }
- }
- else
- i++;
- }
- }
-};
-
-
/*
Only try horizontal beams for knees. No reliable detection of
anything else is possible here, since we don't know funky-beaming
Real threshold = scm_to_double (scm);
- Int_set gaps;
+ Interval_set gaps;
gaps.set_full ();
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
Grob *common = common_refpoint_of_array (stems, me, Y_AXIS);
Real staff_space = Staff_symbol_referencer::staff_space (me);
Array<Interval> hps_array;
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
{
Grob* stem = stems[i];
if (Stem::is_invisible (stem))
}
Interval max_gap;
- Real max_gap_len =0.0;
+ Real max_gap_len = 0.0;
for (int i = gaps.allowed_regions_.size () -1; i >= 0 ; i--)
{
void
Beam::position_beam (Grob *me)
{
+ if (!me->is_live ())
+ return ;
if (to_boolean (me->get_property ("positioning-done")))
return ;
SCM s = ly_deep_copy (me->get_property ("positions"));
me->set_property ("positions", s);
- if (ly_car (s) == SCM_BOOL_F)
+ if (scm_car (s) == SCM_BOOL_F)
{
// one wonders if such genericity is necessary --hwn.
SCM callbacks = me->get_property ("position-callbacks");
- for (SCM i = callbacks; ly_c_pair_p (i); i = ly_cdr (i))
- scm_call_1 (ly_car (i), me->self_scm ());
+ for (SCM i = callbacks; scm_is_pair (i); i = scm_cdr (i))
+ scm_call_1 (scm_car (i), me->self_scm ());
}
set_stem_lengths (me);
Array<Real> x_posns ;
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS);
Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS);
+ lvs->relative_coordinate (commony, Y_AXIS) - my_y);
Real x0 = first_visible_stem (me)->relative_coordinate (commonx, X_AXIS);
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
{
Grob* s = stems[i];
Real dx = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS) - x0;
- Real y =0;
+ Real y = 0;
Real slope = 0;
Real dy = 0;
else
{
Array<Offset> ideals;
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
{
Grob* s = stems[i];
if (Stem::is_invisible (s))
Code dup.
*/
Array<Real> x_posns ;
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS);
Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS);
if (!fvs)
return SCM_UNSPECIFIED;
- Real x0 =fvs->relative_coordinate (commonx, X_AXIS);
- for (int i=0; i < stems.size (); i++)
+ Real x0 = fvs->relative_coordinate (commonx, X_AXIS);
+ for (int i = 0; i < stems.size (); i++)
{
Grob* s = stems[i];
Real dy = pos[RIGHT] - pos[LEFT];
Real y = pos[LEFT];
- Real slope =dy/dx;
+ Real slope = dy/dx;
/*
*/
Interval feasible_left_point;
feasible_left_point.set_full ();
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
{
Grob* s = stems[i];
if (Stem::is_invisible (s))
{
Slice l;
- for ( SCM s = ly_car (beaming); ly_c_pair_p (s) ; s = ly_cdr (s))
+ for ( SCM s = scm_car (beaming); scm_is_pair (s) ; s = scm_cdr (s))
{
- if (scm_c_memq (ly_car (s), ly_cdr (beaming)) != SCM_BOOL_F)
+ if (scm_c_memq (scm_car (s), scm_cdr (beaming)) != SCM_BOOL_F)
- l.add_point (scm_to_int (ly_car (s)));
+ l.add_point (scm_to_int (scm_car (s)));
}
return l;
{
Slice bm = Stem::beam_multiplicity (s);
if (!bm.is_empty ())
- stem_y +=bm[my_dir] * beam_translation;
+ stem_y += bm[my_dir] * beam_translation;
}
Real id = me->relative_coordinate (common[Y_AXIS], Y_AXIS)
void
Beam::set_stem_lengths (Grob *me)
{
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
if (!stems.size ())
scale_drul (&pos, staff_space);
bool gap = false;
- Real thick =0.0;
+ Real thick = 0.0;
if (scm_is_number (me->get_property ("gap-count"))
&&scm_to_int (me->get_property ("gap-count")))
{
Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0;
Real xr = lvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0;
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
{
Grob* s = stems[i];
if (Stem::is_invisible (s))
void
Beam::set_beaming (Grob *me, Beaming_info_list *beaming)
{
- Link_array<Grob> stems=
+ Link_array<Grob> stems =
Pointer_group_interface__extract_grobs (me, (Grob *)0, "stems");
Direction d = LEFT;
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
{
/*
Don't overwrite user settings.
Link_array<Grob>stems =
Pointer_group_interface__extract_grobs (me, (Grob*) 0, "stems");
int f = 0;
- for (int i=0; i < stems.size (); i++)
+ for (int i = 0; i < stems.size (); i++)
{
Grob *s = stems[i];
Drul_array<Real> pos (0, 0);
SCM s = beam->get_property ("positions");
- if (ly_c_pair_p (s) && scm_is_number (ly_car (s)))
+ if (scm_is_pair (s) && scm_is_number (scm_car (s)))
pos = ly_scm2interval (s);
Real staff_space = Staff_symbol_referencer::staff_space (rest);
Real beam_translation = get_beam_translation (beam);
Real beam_thickness = Beam::get_thickness (beam);
+
+ /*
+ TODO: this is not strictly correct for 16th knee beams.
+ */
+ int beam_count =
+ Stem::beam_multiplicity (stem).length() + 1;
- int beam_count = get_direction_beam_count (beam, d);
Real height_of_my_beams = beam_thickness / 2
+ (beam_count - 1) * beam_translation;
Real beam_y = stem_y - d * height_of_my_beams;
Real rest_dim = rest->extent (common_y, Y_AXIS)[d];
Real minimum_distance =
- staff_space * robust_scm2double (rest->get_property ("minimum-distance"), 0.0);
+ + staff_space * (robust_scm2double (stem->get_property ("stemlet-length"), 0.0)
+ + robust_scm2double (rest->get_property ("minimum-distance"), 0.0));
Real shift = d * ( ((beam_y - d * minimum_distance) - rest_dim) * d <? 0.0);
bool knee = false;
int d = 0;
- for (SCM s = me->get_property ("stems"); ly_c_pair_p (s); s = ly_cdr (s))
+ for (SCM s = me->get_property ("stems"); scm_is_pair (s); s = scm_cdr (s))
{
- Direction dir = get_grob_direction (unsmob_grob (ly_car (s)));
+ Direction dir = get_grob_direction (unsmob_grob (scm_car (s)));
if (d && d != dir)
{
knee = true;