% beam_*2 : multiplicity >= beam_multiple_break
%
beam_multiple_break = 3.0;
-beam_minimum_stem1 = 1.5 * \interline;
-beam_minimum_stem2 = 1.0 * \interline;
-beam_ideal_stem1 = 2.0 * \interline;
-beam_ideal_stem2 = 1.5 * \interline;
+% beam_minimum_stem1 = 1.5 * \interline;
+% beam_ideal_stem1 = 2.0 * \interline;
+% beam_minimum_stem2 = 1.0 * \interline;
+% beam_ideal_stem2 = 1.5 * \interline;
+
+% let's try these minor adjustments
+beam_minimum_stem1 = 1.25 * \interline;
+beam_ideal_stem1 = 1.75 * \interline;
+beam_minimum_stem2 = 0.75 * \interline;
+beam_ideal_stem2 = 1.25 * \interline;
% beam_slope_damp_correct_factor = 2.0;
beam_slope_damp_correct_factor = 0.0;
#include "paper-def.hh"
#include "lookup.hh"
#include "grouping.hh"
-#include "stem-info.hh"
-
-
-
Beam::Beam ()
{
transparent_b_ = true;
return ;
}
- solve_slope ();
+ calculate_slope ();
set_stemlens ();
}
/*
See Documentation/tex/fonts.doc
*/
+
void
-Beam::solve_slope ()
+Beam::solve_slope (Array<Stem_info>& sinfo)
{
/*
should use minimum energy formulation (cf linespacing)
*/
-
- assert (multiple_i_);
- Array<Stem_info> sinfo;
+ assert (sinfo.size () > 1);
DOUT << "Beam::solve_slope: \n";
- for (int j=0; j <stems_.size (); j++)
- {
- Stem *i = stems_[j];
- i->mult_i_ = multiple_i_;
- i->set_default_extents ();
- if (i->invisible_b ())
- continue;
+ Real staffline_f = paper ()->rule_thickness ();
+ Real epsilon_f = staffline_f / 8;
- Stem_info info (i);
- sinfo.push (info);
- }
- if (! sinfo.size ())
- slope_f_ = left_y_ = 0;
- else if (sinfo.size () == 1)
+ Real leftx = sinfo[0].x_;
+ Least_squares l;
+ for (int i=0; i < sinfo.size (); i++)
{
- slope_f_ = 0;
- left_y_ = sinfo[0].idealy_f_;
+ sinfo[i].x_ -= leftx;
+ l.input.push (Offset (sinfo[i].x_, sinfo[i].idealy_f_));
}
- else
- {
- Real leftx = sinfo[0].x_;
- Least_squares l;
- for (int i=0; i < sinfo.size (); i++)
- {
- sinfo[i].x_ -= leftx;
- l.input.push (Offset (sinfo[i].x_, sinfo[i].idealy_f_));
- }
- l.minimise (slope_f_, left_y_);
-
- }
+ l.input[0].y () += left_y_;
+ l.minimise (slope_f_, left_y_);
solved_slope_f_ = dir_ * slope_f_;
perhaps only if slope = 0 ?
*/
-// left_y_ = sinfo[0].minyf_;
+ if (abs (slope_f_) < epsilon_f)
+ left_y_ = (sinfo[0].idealy_f_ + sinfo.top ().idealy_f_) / 2;
+ else
+ /*
+ symmetrical, but results often in having stemlength = minimal
+
+ left_y_ = sinfo[0].dir_ == dir_ ? sinfo[0].miny_f_ : sinfo[0].maxy_f_;
- if (sinfo.size () >= 1)
+ what about
+ */
{
- Real staffline_f = paper ()->rule_thickness ();
- Real epsilon_f = staffline_f / 8;
- if (abs (slope_f_) < epsilon_f)
- left_y_ = (sinfo[0].idealy_f_ + sinfo.top ().idealy_f_) / 2;
+ Real dx = stems_.top ()->hpos_f () - stems_[0]->hpos_f ();
+ if (sinfo[0].dir_ == sinfo.top ().dir_)
+ left_y_ = sinfo[0].idealy_f_ >? sinfo.top ().idealy_f_ - slope_f_ * dx;
+ // knee
else
- /*
- symmetrical, but results often in having stemlength = minimal
-
- left_y_ = sinfo[0].dir_ == dir_ ? sinfo[0].miny_f_ : sinfo[0].maxy_f_;
-
- what about
- */
- {
- Real dx = stems_.top ()->hpos_f () - stems_[0]->hpos_f ();
- if (sinfo[0].dir_ == sinfo.top ().dir_)
- left_y_ = sinfo[0].idealy_f_ >? sinfo.top ().idealy_f_ - slope_f_ * dx;
- // knee
- else
- left_y_ = sinfo[0].idealy_f_;
- }
+ left_y_ = sinfo[0].idealy_f_;
}
+}
- // uh?
+Real
+Beam::check_stemlengths_f (Array<Stem_info>& sinfo)
+{
+ /*
+ find shortest stem and adjust left_y accordingly
+ */
Real dy = 0.0;
for (int i=0; i < sinfo.size (); i++)
{
if (my - y > dy)
dy = my -y;
}
- left_y_ += dy;
+ return dy;
+}
+
+void
+Beam::calculate_slope ()
+{
+ Real interline_f = paper ()->interline_f ();
+ Real staffline_f = paper ()->rule_thickness ();
+ Real epsilon_f = staffline_f / 8;
+
+ assert (multiple_i_);
+ Array<Stem_info> sinfo;
+ for (int i=0; i < stems_.size (); i++)
+ {
+ Stem *s = stems_[i];
+
+ s->mult_i_ = multiple_i_;
+ s->set_default_extents ();
+ if (s->invisible_b ())
+ continue;
+
+ Stem_info info (s);
+ sinfo.push (info);
+ }
+
+ if (! sinfo.size ())
+ slope_f_ = left_y_ = 0;
+ else if (sinfo.size () == 1)
+ {
+ slope_f_ = 0;
+ left_y_ = sinfo[0].idealy_f_;
+ }
+ else
+ {
+ Real y;
+ Real s;
+ for (int i = 0; i < 3; i++)
+ {
+ y = left_y_;
+ solve_slope (sinfo);
+ Real dy = check_stemlengths_f (sinfo);
+ left_y_ += dy;
+
+ // only consider recalculation if long stem adjustments
+ if (!i && (left_y_ - sinfo[0].idealy_f_ < 0.5 * interline_f))
+ break;
+
+ if (!i)
+ s = slope_f_;
+ // never allow slope to tilt the other way
+ else if (sign (slope_f_) != sign (s))
+ {
+ left_y_ = 0;
+ slope_f_ = 0;
+ Real dy = check_stemlengths_f (sinfo);
+ left_y_ += dy;
+ break;
+ }
+ // or become steeper
+ else if (abs (slope_f_) > abs (s))
+ {
+ slope_f_ = s;
+ Real dy = check_stemlengths_f (sinfo);
+ left_y_ += dy;
+ break;
+ }
+ if (abs (dy) < epsilon_f)
+ break;
+ }
+ }
+
left_y_ *= dir_;
slope_f_ *= dir_;
\bar "|."; |
}
-dux = \notes \relative c'' {
+dux = \notes \relative c''{
+ \voicetwo
\clef violin;
\property Voice.ydirection = "-1"
comes = \notes \relative c'' {
- \stemup
-
+ \voiceone
r1 |
r1 |
r8 [g'16 fis] [g8 c,] [es g16 fis] [g8 a] |
\paper {
gourlay_maxmeasures = 4.;
- % current default for 16pt -> three pages
- % hmm, too tight already, better more vsize!
- arithmetic_multiplier = 4.8\pt;
- % arithmetic_multiplier = 4.4\pt;
+ indent = 8.\mm;
+ textheight = 295.\mm;
+
+ %hmm
+% \translator { \BarNumberingScoreContext }
+ \translator { \BarNumberingStaffContext }
% Breitkopf; unlike B\"arenreiter rule
% really looks a lot better?
% should have an array of min/ideal lengths (scheme)
% and check B\"arenreiter rules again -- make testcase
- beam_multiple_break = 2.0;
- % beam_dir_algorithm = \MEDIAN;
+ % beam_multiple_break = 2.0;
+ % beam_minimum_stem1 = 1.5 * \interline;
+ % beam_ideal_stem1 = 2.0 * \interline;
+ % beam_minimum_stem2 = 1.25 * \interline;
+ % beam_ideal_stem2 = 1.75 * \interline;
+ }
+ \header{
+ opus = "BWV 847";
}
\midi {