<p>
Please send comments on these web pages to
-<a href="mailto:@MAIL_ADDRESS@"><em>@MAIL_ADDRESS@</em></a>
+<a href="mailto:@MAILADDRESS@"><em>@MAILADDRESS@</em></a>
<p>
{
if (finished_beam_p_)
{
- finished_grouping_p_->beamify ();
+ finished_grouping_p_->beamify(*unsmob_moment (get_property ("beatLength")),
+ (bool)gh_scm2bool(get_property("subdivideBeams")));
Beam::set_beaming (finished_beam_p_, finished_grouping_p_);
typeset_grob (finished_beam_p_);
finished_beam_p_ = 0;
{
if (finished_beam_p_)
{
- finished_beam_info_p_->beamify ();
-
+ finished_beam_info_p_->beamify(*unsmob_moment (get_property ("beatLength")),
+ (bool)gh_scm2bool(get_property("subdivideBeams")));
+
Beam::set_beaming (finished_beam_p_, finished_beam_info_p_);
typeset_grob (finished_beam_p_);
delete finished_beam_info_p_;
}
const int infinity_i = INT_MAX; // guh.
+const int at_beat = 1<<15;
int
-Beaming_info_list::min_denominator_index () const
+Beaming_info_list::best_splitpoint_index (Moment &beat_length,bool subdivide) const
{
int minden = infinity_i;
int minidx = -1;
+ Moment beat_pos;
for (int i=1; i < infos_.size (); i++)
{
- if (infos_[i].start_mom_.den () < minden)
+ beat_pos = infos_[i].start_mom_ / beat_length;
+ int den = beat_pos.den ();
+ if (infos_[i].beams_i_drul_[LEFT] == infos_[i-1].beams_i_drul_[RIGHT] && !subdivide)
+ den *= 4;
+ if (den < minden)
{
minidx = i;
- minden = infos_[i].start_mom_.den ();
+ minden = den;
}
}
- return minidx;
+ return minidx|(minden==1 && subdivide ? at_beat : 0);
}
int
}
void
-Beaming_info_list::beamify ()
+Beaming_info_list::beamify (Moment &beat_length,bool subdivide)
{
if (infos_.size () <= 1)
return;
Drul_array<Beaming_info_list> splits;
- int m = min_denominator_index ();
+ int m = best_splitpoint_index (beat_length,subdivide);
+ bool split = subdivide && (m & at_beat); m = m & ~at_beat;
splits[LEFT].infos_ = infos_.slice (0,m);
splits[RIGHT].infos_ = infos_.slice (m, infos_.size ());
do
{
- splits[d].beamify ();
+ splits[d].beamify (beat_length,subdivide);
}
while (flip (&d) != LEFT);
- int middle_beams = splits[RIGHT].beam_extend_count (LEFT) <?
- splits[LEFT].beam_extend_count (RIGHT);
+ int middle_beams = (split ? 1 :
+ splits[RIGHT].beam_extend_count (LEFT) <?
+ splits[LEFT].beam_extend_count (RIGHT));
do
{
Array<Beaming_info> infos_;
int beam_extend_count (Direction) const;
- int min_denominator_index () const;
- void beamify ();
+ int best_splitpoint_index (Moment &beat_length,bool subdivide) const;
+ void beamify (Moment &beat_length,bool subdivide);
void add_stem (Moment d, int beams);
};
#endif /* BEAMING_HH */
-
void
copy_scm_hashes (SCM dest, SCM src)
{
- for (int i = SCM_LENGTH(src); i--;)
+ for (int i = SCM_SYMBOL_LENGTH (src); i--;)
for (SCM s = scm_vector_ref (src, SCM_MAKINUM (i)); ly_pair_p(s); s = ly_cdr (s))
{
scm_hashq_set_x (dest, ly_caar (s), ly_cdar (s));
/*
resize if getting too large.
*/
- if (elt_count_ > 2 * SCM_LENGTH (hash_tab_))
+ if (elt_count_ > 2 * SCM_SYMBOL_LENGTH (hash_tab_))
{
SCM nh = scm_make_vector (gh_int2scm (3* elt_count_+1), SCM_EOL);
copy_scm_hashes (nh, hash_tab_);
Scheme_hash_table::to_alist () const
{
SCM l = SCM_EOL;
- for (int i = SCM_LENGTH(hash_tab_); i--;)
+ for (int i = SCM_SYMBOL_LENGTH (hash_tab_); i--;)
for (SCM s = scm_vector_ref (hash_tab_, gh_int2scm (i)); ly_pair_p(s); s = ly_cdr (s))
{
l = scm_acons (ly_caar (s), ly_cdar (s), l);
if (unsmob_translator (trans))
{
char const* nm = classname (unsmob_translator (trans));
- return gh_str02scm (nm);
+ return ly_str02scm (nm);
}
return
SCM_EOL;