From 6ed6064b52d34003164f257a0f4e37ac7cde1a5e Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Wed, 24 Dec 1997 11:32:32 +0100 Subject: [PATCH] patch::: 0.1.37.jcn2: biem pats pl 37.jcn3 - max beam slope "compile time parameterised" and set to 0.6 (oh, how we need runtime generated beams!) - beam's left y-pos quantisation - beam slopes' y-span quantisation - stem.ly pl 37.jcn2 - feta: fixed sizes small numerals + flageolet --- NEWS | 10 ++ VERSION | 2 +- flower/include/varray.hh | 2 +- init/feta16.ly | 2 +- init/feta20.ly | 12 +- input/stem.ly | 48 ++++++ lily/abbreviation-beam.cc | 2 +- lily/beam.cc | 347 ++++++++++++++++++++++++++++---------- lily/include/beam.hh | 26 +-- lily/stem.cc | 11 +- lily/tex-beam.cc | 12 +- mf/feta-watzieik.mf | 3 +- tex/feta16.tex | 2 +- tex/feta20.tex | 2 +- 14 files changed, 358 insertions(+), 123 deletions(-) create mode 100644 input/stem.ly diff --git a/NEWS b/NEWS index 83aca6b9b8..86c0b6b660 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,13 @@ +pl 37.jcn3 + - max beam slope "compile time parameterised" and set to 0.6 + (oh, how we need runtime generated beams!) + - beam's left y-pos quantisation + - beam slopes' y-span quantisation + - stem.ly + +pl 37.jcn2 + - feta: fixed sizes small numerals + flageolet + pl 37.jcn1 - feta: numerals - feta: flageolet diff --git a/VERSION b/VERSION index 13c7b2006a..b49f45ea53 100644 --- a/VERSION +++ b/VERSION @@ -1,7 +1,7 @@ TOPLEVEL_MAJOR_VERSION = 0 TOPLEVEL_MINOR_VERSION = 1 TOPLEVEL_PATCH_LEVEL = 37 -TOPLEVEL_MY_PATCH_LEVEL = jcn2 +TOPLEVEL_MY_PATCH_LEVEL = jcn3 # use the above to send patches, always empty for released version: # please don't move these comments up; the patch should fail if diff --git a/flower/include/varray.hh b/flower/include/varray.hh index 191b9ca0b6..8386c20a8c 100644 --- a/flower/include/varray.hh +++ b/flower/include/varray.hh @@ -11,7 +11,7 @@ /// copy a bare (C-)array from #src# to #dest# sized #count# template inline void arrcpy (T*dest, T*src, int count) { - for (int i=0; i < count ; i++) + for (int i_shadows_local=0; i_shadows_local < count ; i_shadows_local++) *dest++ = *src++; } diff --git a/init/feta16.ly b/init/feta16.ly index 747be0a7ac..f47e804a36 100644 --- a/init/feta16.ly +++ b/init/feta16.ly @@ -1,5 +1,5 @@ % Creator: mf-to-table.py version 0.4 -% Automatically generated on Sat Dec 13 20:07:15 1997 +% Automatically generated on Wed Dec 24 11:21:35 1997 % Do not edit % input from out/feta16.log % name=\symboltables { diff --git a/init/feta20.ly b/init/feta20.ly index 84dc1d2f2f..ea735f4cb7 100644 --- a/init/feta20.ly +++ b/init/feta20.ly @@ -1,13 +1,13 @@ % Creator: mf-to-table.py version 0.4 -% Automatically generated on Sat Dec 13 20:07:39 1997 +% Automatically generated on Wed Dec 24 11:21:40 1997 % Do not edit % input from out/feta20.log % name=\symboltables { "rests" = \table { - "0" "\\wholerest" -0.00\pt 7.50\pt -3.13\pt 0.00\pt - "1" "\\halfrest" -0.00\pt 7.50\pt -0.00\pt 3.13\pt - "0o" "\\outsidewholerest" -3.13\pt 10.62\pt -3.13\pt 0.50\pt - "1o" "\\outsidehalfrest" -3.13\pt 10.62\pt -0.50\pt 3.13\pt + "0" "\\wholerest" -0.00\pt 7.50\pt -3.12\pt 0.00\pt + "1" "\\halfrest" -0.00\pt 7.50\pt -0.00\pt 3.12\pt + "0o" "\\outsidewholerest" -3.12\pt 10.62\pt -3.12\pt 0.50\pt + "1o" "\\outsidehalfrest" -3.12\pt 10.62\pt -0.50\pt 3.12\pt "2" "\\quartrest" -0.00\pt 5.40\pt 3.75\pt 18.00\pt "3" "\\eighthrest" -0.00\pt 6.67\pt 5.00\pt 14.21\pt "4" "\\sixteenthrest" -0.00\pt 7.76\pt -0.00\pt 14.21\pt @@ -23,7 +23,7 @@ "2" "\\sharpsharp" -0.00\pt 5.00\pt -2.50\pt 2.50\pt } "dots" = \table { - "dot" "\\dot" -0.00\pt 2.25\pt -1.13\pt 1.13\pt + "dot" "\\dot" -0.00\pt 2.25\pt -1.12\pt 1.12\pt "repeatcolon" "\\repeatcolon" -0.00\pt 2.25\pt -2.50\pt 2.50\pt } "balls" = \table { diff --git a/input/stem.ly b/input/stem.ly new file mode 100644 index 0000000000..5442943342 --- /dev/null +++ b/input/stem.ly @@ -0,0 +1,48 @@ +\header{ +title= "Stems and Beams"; +subtitle = "proofsheet"; +enteredby = "jcn"; +copyright = "public domain"; +TestedFeatures = "This file tests the length of stems and placement +of beams"; + +} + +\version "0.1.7"; + +beamintervals = \melodic{ + \meter 7/4; + \stemup; + \octave c'; + [ c8 d ] [ c e ] [ c f ] [ c g ] [ c a ] [ c b ] [ c c' ] | + [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] | + \octave c''; + [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] | + \stemdown; + \octave c'''; + [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] | + \octave c''; + [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] | + [ c d ] [ c e ] [ c f ] [ c g ] [ c a ] [ c b ] [ c c' ] | + } + +\score{ + \melodic{ + \octave c'; + \stemup; + \meter 17/4; + 'g4 'a 'b c d e f g a b c' d' e' f' g' a' b' | + \stemdown + b' a' g' f' e' d' c' b a g f e d c 'b 'a 'g | + \beamintervals; + \transpose d \beamintervals; + \transpose e \beamintervals; + \transpose f \beamintervals; + \transpose g \beamintervals; + \transpose a \beamintervals; + \transpose b \beamintervals; + } + \paper{ + gourlay_maxmeasures = 2.; + } +} diff --git a/lily/abbreviation-beam.cc b/lily/abbreviation-beam.cc index ac36ae99d0..d9a4e5bac8 100644 --- a/lily/abbreviation-beam.cc +++ b/lily/abbreviation-beam.cc @@ -51,7 +51,7 @@ Abbreviation_beam::brew_molecule_p () const Molecule sb = stem_beams (i, next, prev); Real x = i->hpos_f ()-x0; - sb.translate (Offset (x, (x * slope + left_pos)* inter_f)); + sb.translate (Offset (x, (x * slope_f + left_y)* inter_f)); mol_p->add (sb); } mol_p->translate_axis (x0 - spanned_drul_[LEFT]->absolute_coordinate (X_AXIS), X_AXIS); diff --git a/lily/beam.cc b/lily/beam.cc index 268499b1b0..e714950ec6 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -29,14 +29,17 @@ #include "lookup.hh" #include "grouping.hh" #include "stem-info.hh" +#include "main.hh" // experimental features -IMPLEMENT_IS_TYPE_B1(Beam, Spanner); +IMPLEMENT_IS_TYPE_B1 (Beam, Spanner); -Beam::Beam() +const int MINIMUM_STEMLEN = 5; + +Beam::Beam () { - slope = 0; - left_pos = 0.0; + slope_f = 0; + left_y = 0.0; } void @@ -53,80 +56,78 @@ Beam::add (Stem*s) } Molecule* -Beam::brew_molecule_p() const +Beam::brew_molecule_p () const { Molecule *mol_p = new Molecule; - // huh? inter-what - // Real inter_f = paper()->interbeam_f (); - Real inter_f = paper()->internote_f (); - Real x0 = stems[0]->hpos_f(); - for (int j=0; j internote_f (); + Real x0 = stems[0]->hpos_f (); + for (int j=0; j 0)? stems[j-1] : 0; - Stem * next = (j < stems.size()-1) ? stems[j+1] :0; + Stem * next = (j < stems.size ()-1) ? stems[j+1] :0; Molecule sb = stem_beams (i, next, prev); - Real x = i->hpos_f()-x0; - sb.translate (Offset (x, (x * slope + left_pos)* inter_f)); + Real x = i->hpos_f ()-x0; + sb.translate (Offset (x, (x * slope_f + left_y)* inter_f)); mol_p->add (sb); } - mol_p->translate_axis (x0 - spanned_drul_[LEFT]->absolute_coordinate(X_AXIS), X_AXIS); + mol_p->translate_axis (x0 - spanned_drul_[LEFT]->absolute_coordinate (X_AXIS), X_AXIS); return mol_p; } Offset -Beam::center() const +Beam::center () const { - Real w=(paper()->note_width () + width ().length ())/2.0; - return Offset (w, (left_pos + w* slope)*paper()->internote_f ()); + Real w= (paper ()->note_width () + width ().length ())/2.0; + return Offset (w, (left_y + w* slope_f)*paper ()->internote_f ()); } void -Beam::do_pre_processing() +Beam::do_pre_processing () { if (!dir_) - set_default_dir(); + set_default_dir (); } void -Beam::do_print() const +Beam::do_print () const { #ifndef NPRINT - DOUT << "slope " <is_type_b (Stem::static_name())) - stems.substitute ((Stem*)o->item(), n?(Stem*) n->item ():0); + if (o->is_type_b (Stem::static_name ())) + stems.substitute ((Stem*)o->item (), n? (Stem*) n->item ():0); } Interval -Beam::do_width() const +Beam::do_width () const { - return Interval (stems[0]->hpos_f(), - stems.top()->hpos_f ()); + return Interval (stems[0]->hpos_f (), + stems.top ()->hpos_f ()); } void -Beam::set_default_dir() +Beam::set_default_dir () { Drul_array total; total[UP] = total[DOWN] = 0; @@ -134,12 +135,12 @@ Beam::set_default_dir() count[UP] = count[DOWN] = 0; Direction d = DOWN; - for (int i=0; i dir_ ? (1 + d * s->dir_)/2 - : s->get_center_distance(Direction(-d)); + : s->get_center_distance (Direction (-d)); if (current) { @@ -159,7 +160,7 @@ Beam::set_default_dir() */ dir_ = (total[UP] * count[DOWN] > total[DOWN] * count[UP]) ? UP : DOWN; - for (int i=0; i dir_ = dir_; @@ -169,102 +170,272 @@ Beam::set_default_dir() /* should use minimum energy formulation (cf linespacing) - [todo] - the y of the (start) of the beam should be quantisized, - so that no stafflines appear just in between two beam-flags - */ void -Beam::solve_slope() +Beam::solve_slope () { Array sinfo; - for (int j=0; j set_default_extents(); - if (i->invisible_b()) + i->set_default_extents (); + if (i->invisible_b ()) continue; Stem_info info (i); sinfo.push (info); } - if (! sinfo.size()) - slope = left_pos = 0; - else if (sinfo.size() == 1) + if (! sinfo.size ()) + slope_f = left_y = 0; + else if (sinfo.size () == 1) { - slope = 0; - left_pos = sinfo[0].idealy_f_; + slope_f = 0; + left_y = sinfo[0].idealy_f_; } else { Real leftx = sinfo[0].x; Least_squares l; - for (int i=0; i < sinfo.size(); i++) + 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, left_pos); + l.minimise (slope_f, left_y); } Real dy = 0.0; - for (int i=0; i < sinfo.size(); i++) + for (int i=0; i < sinfo.size (); i++) { - Real y = sinfo[i].x * slope + left_pos; + Real y = sinfo[i].x * slope_f + left_y; Real my = sinfo[i].miny_f_; if (my - y > dy) dy = my -y; } - left_pos += dy; - left_pos *= dir_; + left_y += dy; + left_y *= dir_; - slope *= dir_; + slope_f *= dir_; /* - This neat trick is by Werner Lemberg, damped = tanh (slope) corresponds + This neat trick is by Werner Lemberg, damped = tanh (slope_f) corresponds with some tables in [Wanske] */ - slope = 0.6 * tanh (slope); + slope_f = 0.6 * tanh (slope_f); + + quantise_yspan (); - // ugh - Real sl = slope*paper()->internote_f (); - paper()->lookup_l ()->beam (sl, 20 PT); - slope = sl /paper()->internote_f (); + // y-values traditionally use internote dimension: therefore slope = (y/in)/x + // but mf and beam-lookup use PT dimension for y (as used for x-values) + // ugh --- there goes our simplified but careful quantisation + Real sl = slope_f * paper ()->internote_f (); + paper ()->lookup_l ()->beam (sl, 20 PT); + slope_f = sl / paper ()->internote_f (); } void -Beam::set_stemlens() +Beam::quantise_yspan () { + /* + [Ross] (simplification of) + Try to set slope_f complying with y-span of: + - zero + - beam_thickness / 2 + staffline_thickness / 2 + - beam_thickness + staffline_thickness + + n * interline + */ + Real interline_f = paper ()->interline_f (); + Real internote_f = interline_f / 2; + Real staffline_thickness = paper ()->rule_thickness (); + Real beam_thickness = 0.48 * (interline_f - staffline_thickness); + + const int QUANTS = 3; + Real qdy[QUANTS] = { + 0, + beam_thickness / 2 + staffline_thickness / 2, + beam_thickness + staffline_thickness + }; + + Real xspan_f = stems.top ()->hpos_f () - stems[0]->hpos_f (); + // y-values traditionally use internote dimension: therefore slope = (y/in)/x + Real yspan_f = xspan_f * abs (slope_f * internote_f); + int yspan_i = (int)(yspan_f / interline_f); + Real q = (yspan_f / interline_f - yspan_i) * interline_f; + int i = 0; + for (; i < QUANTS - 1; i++) + if ((q >= qdy[i]) && (q <= qdy[i + 1])) + { + if (q - qdy[i] < qdy[i + 1] - q) + break; + else + { + i++; + break; + } + } + q = qdy[i]; + + yspan_f = (Real)yspan_i * interline_f + q; + // y-values traditionally use internote dimension: therefore slope = (y/in)/x + slope_f = yspan_f / xspan_f / internote_f * sign (slope_f); +} + +void +Beam::quantise_left_y (Beam::Pos pos, bool extend_b) +{ + /* + quantising left y should suffice, as slope is quantised too + if extend then stems must not get shorter + */ + + Real interline_f = paper ()->interline_f (); + Real internote_f = interline_f / 2; + Real staffline_thickness = paper ()->rule_thickness (); + Real beam_thickness = 0.48 * (interline_f - staffline_thickness); + + const int QUANTS = 6; + Real qy[QUANTS] = { + -staffline_thickness, + beam_thickness / 2, + beam_thickness + staffline_thickness / 2, + interline_f / 2 + beam_thickness / 2 + staffline_thickness / 2, + interline_f - staffline_thickness, + interline_f + beam_thickness / 2, + }; /* - should check for visibility of stem.. + ugh, using i triggers gcc 2.7.2.1 internal compiler error (far down): + for (int i = 0; i < QUANTS; i++) */ - Real x0 = stems[0]->hpos_f(); - for (int j=0; j y) + break; + // found if lower_i is allowed, and nearer (from below) y than new pos + if ((pos & qpos[lower_i]) && (y - qy[lower_i] < y - qy[i])) + break; + // if new pos is allowed or old pos isn't: assign new pos + if ((pos & qpos[i]) || !(pos & qpos[lower_i])) + lower_i = i; + } - Real x = s->hpos_f()-x0; - s->set_stemend (left_pos + slope * x); + int upper_i = QUANTS - 1; + for (i = QUANTS - 1; i >= 0; i--) + { + if (qy[i] < y) + break; + // found if upper_i is allowed, and nearer (from above) y than new pos + if ((pos & qpos[upper_i]) && (qy[upper_i] - y < qy[i] - y)) + break; + // if new pos is allowed or old pos isn't: assign new pos + if ((pos & qpos[i]) || !(pos & qpos[upper_i])) + upper_i = i; } + + // y-values traditionally use internote dimension + Real upper_y = (qy[upper_i] + interline_f * y_i) / internote_f; + Real lower_y = (qy[lower_i] + interline_f * y_i) / internote_f; + + if (extend_b) + left_y = (dir_ > 0 ? upper_y : lower_y); + else + left_y = (upper_y - left_y < y - lower_y ? upper_y : lower_y); +} + +void +Beam::set_stemlens () +{ + Real x0 = stems[0]->hpos_f (); + Real dy = 0; + + Real interline_f = paper ()->interline_f (); + Real internote_f = interline_f / 2; + Real staffline_thickness = paper ()->rule_thickness (); + Real beam_thickness = 0.48 * (interline_f - staffline_thickness); + Real xspan_f = stems.top ()->hpos_f () - stems[0]->hpos_f (); + /* + ugh, y values are in "internote" dimension + */ + Real yspan_f = xspan_f * abs (slope_f * internote_f); + int yspan_i = (int)(yspan_f / interline_f); + + Pos left_pos = NONE; + + if (yspan_f < staffline_thickness / 2) + left_pos = (Pos)(STRADDLE | SIT | HANG); + else + left_pos = (Pos) (sign (slope_f) > 0 ? STRADDLE | HANG + : SIT | STRADDLE); + + /* + ugh, slope currently mangled by availability mf chars... + be more generous regarding beam position between stafflines + */ + Real q = (yspan_f / interline_f - yspan_i) * interline_f; + if (q < interline_f / 3 - beam_thickness / 2) + left_pos = (Pos) (left_pos | INTER); + + if (stems[0]->beams_right_i_ > 1) + left_pos = (Pos)(left_pos & (STRADDLE | INTER)); + + // ugh, rounding problems! + const Real EPSILON = interline_f / 10; + do + { + left_y += dy * dir_; + quantise_left_y (left_pos, dy); + dy = 0; + for (int j=0; j < stems.size (); j++) + { + Stem *s = stems[j]; + + Real x = s->hpos_f () - x0; + s->set_stemend (left_y + slope_f * x); + Real y = s->stem_length_f (); + if (y < MINIMUM_STEMLEN) + dy = dy >? (MINIMUM_STEMLEN - y); + } + } while (abs (dy) > EPSILON) } void Beam::set_grouping (Rhythmic_grouping def, Rhythmic_grouping cur) { - def.OK(); - cur.OK(); - assert (cur.children.size() == stems.size ()); + def.OK (); + cur.OK (); + assert (cur.children.size () == stems.size ()); cur.split (def); Array b; { Array flags; - for (int j=0; j beams_left_i_ = b[i]; @@ -293,13 +464,13 @@ Beam::set_grouping (Rhythmic_grouping def, Rhythmic_grouping cur) Molecule Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const { - assert (!next || next->hpos_f() > here->hpos_f ()); - assert (!prev || prev->hpos_f() < here->hpos_f ()); - // Real dy=paper()->internote_f ()*2; - Real dy = paper()->interbeam_f (); - Real stemdx = paper()->rule_thickness (); - Real sl = slope*paper()->internote_f (); - paper()->lookup_l ()->beam (sl, 20 PT); + assert (!next || next->hpos_f () > here->hpos_f ()); + assert (!prev || prev->hpos_f () < here->hpos_f ()); + // Real dy=paper ()->internote_f ()*2; + Real dy = paper ()->interbeam_f (); + Real stemdx = paper ()->rule_thickness (); + Real sl = slope_f*paper ()->internote_f (); + paper ()->lookup_l ()->beam (sl, 20 PT); Molecule leftbeams; Molecule rightbeams; @@ -312,7 +483,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const Real w = (here->hpos_f () - prev->hpos_f ())/4; Atom a; if (lhalfs) // generates warnings if not - a = paper()->lookup_l ()->beam (sl, w); + a = paper ()->lookup_l ()->beam (sl, w); a.translate (Offset (-w, -w * sl)); for (int j = 0; j < lhalfs; j++) { @@ -327,8 +498,8 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const int rhalfs = here->beams_right_i_ - next->beams_left_i_; int rwholebeams = here->beams_right_i_ beams_left_i_; - Real w = next->hpos_f() - here->hpos_f (); - Atom a = paper()->lookup_l ()->beam (sl, w + stemdx); + Real w = next->hpos_f () - here->hpos_f (); + Atom a = paper ()->lookup_l ()->beam (sl, w + stemdx); int j = 0; Real gap_f = 0; @@ -342,9 +513,9 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const rightbeams.add (b); } // TODO: notehead widths differ for different types - gap_f = paper()->note_width () / 2; + gap_f = paper ()->note_width () / 2; w -= 2 * gap_f; - a = paper()->lookup_l ()->beam (sl, w + stemdx); + a = paper ()->lookup_l ()->beam (sl, w + stemdx); } for (; j < rwholebeams; j++) @@ -356,7 +527,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const w /= 4; if (rhalfs) - a = paper()->lookup_l ()->beam (sl, w); + a = paper ()->lookup_l ()->beam (sl, w); for (; j < rwholebeams + rhalfs; j++) { diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 5d605937c1..130df73d5d 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -15,12 +15,14 @@ direction */ class Beam: public Directional_spanner { public: + enum Pos { NONE, SIT = 1, STRADDLE = 2, HANG = 4, INTER = 8 }; + Link_array stems; /// the slope of the beam in posns / point (dimension) - Real slope; + Real slope_f; /// position of leftmost end of beam - Real left_pos; + Real left_y; /* *************** */ @@ -29,22 +31,24 @@ public: void add (Stem*); void set_grouping (Rhythmic_grouping def, Rhythmic_grouping current); - void set_stemlens(); - SCORE_ELEM_CLONE(Beam); + void set_stemlens (); + SCORE_ELEM_CLONE (Beam); protected: - virtual Interval do_width() const; - Offset center() const; - void set_default_dir(); - virtual void do_pre_processing(); - virtual void do_post_processing(); + virtual Interval do_width () const; + Offset center () const; + void set_default_dir (); + virtual void do_pre_processing (); + virtual void do_post_processing (); virtual void do_substitute_dependent (Score_elem*, Score_elem*); virtual void do_print() const; + virtual void quantise_left_y (Beam::Pos pos, bool extend_b); virtual Molecule stem_beams (Stem *here, Stem *next, Stem *prev) const; - virtual void solve_slope(); - virtual Molecule*brew_molecule_p() const; + virtual void solve_slope (); + virtual void quantise_yspan (); + virtual Molecule*brew_molecule_p () const; }; #endif // BEAM_HH diff --git a/lily/stem.cc b/lily/stem.cc index 0e37c7d849..9bdfd99f80 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -84,7 +84,6 @@ Stem::stem_end_f () const return yextent_drul_[dir_]; } - void Stem::set_stemend (Real se) { @@ -273,19 +272,19 @@ Stem::abbrev_mol () const Real beamdy = paper ()->interline_f () / 2; int beams_i = 0; - Real slope = paper ()->internote_f () / 4; + Real slope_f = paper ()->internote_f () / 4; if (beam_l_) { // huh? - slope = 2 * beam_l_->slope; + slope_f = 2 * beam_l_->slope_f; // ugh, rather calc from Abbreviation_req beams_i = beams_right_i_ >? beams_left_i_; } - paper ()->lookup_l ()->beam (slope, 20 PT); + paper ()->lookup_l ()->beam (slope_f, 20 PT); Molecule beams; - Atom a (paper ()->lookup_l ()->beam (slope, w)); - a.translate (Offset(- w / 2, stem_end_f () - (w / 2 * slope))); + Atom a (paper ()->lookup_l ()->beam (slope_f, w)); + a.translate (Offset(- w / 2, stem_end_f () - (w / 2 * slope_f))); // ugh if (!beams_i) diff --git a/lily/tex-beam.cc b/lily/tex-beam.cc index e26b1c481d..4380e8911f 100644 --- a/lily/tex-beam.cc +++ b/lily/tex-beam.cc @@ -54,15 +54,17 @@ Lookup::rule_symbol (Real height, Real width) const Atom Lookup::beam (Real &slope, Real width) const { + const Real MAX_SLOPE = 0.6; + const Real SLOPES = 20.0; int sidx = 0; - if (abs (slope) > 1.0) + if (abs (slope) > MAX_SLOPE) { - WARN << _("beam steeper than 1.0 (") << slope << ")\n"; - slope = sign (slope); + WARN << _("beam too steep (") << slope << ")\n"; + slope = sign (slope) * MAX_SLOPE; } - sidx = int (rint (slope * 20.0)); - slope = sidx / 20.0; + sidx = int (rint (slope / MAX_SLOPE * SLOPES)); + slope = MAX_SLOPE * sidx / SLOPES; Interval xdims = (*symtables_p_)("beamslopes")->lookup ("slope").dim_[X_AXIS]; Real min_wid = xdims[LEFT]; diff --git a/mf/feta-watzieik.mf b/mf/feta-watzieik.mf index b87363a983..a3676cc41c 100644 --- a/mf/feta-watzieik.mf +++ b/mf/feta-watzieik.mf @@ -11,8 +11,9 @@ define_pixels(beamheight); pen beam_pen; beam_pen:=penrazor scaled beamheight rotated 90; -elem_tan:=0.05; +max_slope:=0.6; slopes:=20; +elem_tan:=max_slope/slopes; lengths:=6; elem_factor := 2; elem_initial_len:=2; diff --git a/tex/feta16.tex b/tex/feta16.tex index 7ef33a9b58..de568a52ed 100644 --- a/tex/feta16.tex +++ b/tex/feta16.tex @@ -1,5 +1,5 @@ % Creator: mf-to-table.py version 0.4 -% Automatically generated on Sat Dec 13 20:07:15 1997 +% Automatically generated on Wed Dec 24 11:21:35 1997 % Do not edit % input from out/feta16.log % name diff --git a/tex/feta20.tex b/tex/feta20.tex index fcdb256a0d..2e5abeb193 100644 --- a/tex/feta20.tex +++ b/tex/feta20.tex @@ -1,5 +1,5 @@ % Creator: mf-to-table.py version 0.4 -% Automatically generated on Sat Dec 13 20:07:39 1997 +% Automatically generated on Wed Dec 24 11:21:40 1997 % Do not edit % input from out/feta20.log % name -- 2.39.5