From 736b0e8aa28ce080d3a42d9b99de228d16507031 Mon Sep 17 00:00:00 2001 From: fred Date: Tue, 26 Mar 2002 22:44:18 +0000 Subject: [PATCH] lilypond-1.3.12 --- lily/beaming-info.cc | 97 +++++++++++++ lily/chord-tremolo-engraver.cc | 9 +- lily/clef-engraver.cc | 1 + lily/clef-item.cc | 9 +- lily/include/beam.hh | 50 +++---- lily/include/bow.hh | 1 - lily/include/clef-item.hh | 1 - lily/include/lily-guile.hh | 2 +- lily/include/note-head.hh | 4 - lily/include/staff-symbol-referencer.hh | 3 + lily/include/stem.hh | 8 +- lily/lily-guile.cc | 9 ++ lily/misc.cc | 17 --- lily/note-column.cc | 21 ++- lily/note-head.cc | 52 ++----- lily/slur.cc | 4 +- lily/staff-symbol-referencer.cc | 24 +++- lily/stem-engraver.cc | 4 +- lily/stem-tremolo.cc | 29 ++-- lily/stem.cc | 174 +++++++++++++++--------- lily/tie.cc | 11 +- scm/generic-property.scm | 3 + scm/lily.scm | 7 +- 23 files changed, 339 insertions(+), 201 deletions(-) create mode 100644 lily/beaming-info.cc diff --git a/lily/beaming-info.cc b/lily/beaming-info.cc new file mode 100644 index 0000000000..ef0bb29041 --- /dev/null +++ b/lily/beaming-info.cc @@ -0,0 +1,97 @@ +/* + beaming-info.cc -- implement Beaming_info, Beaming_info_list + + source file of the GNU LilyPond music typesetter + + (c) 1999 Han-Wen Nienhuys + + */ + +#include "beaming.hh" + +Beaming_info::Beaming_info( ) +{ + start_mom_ = 0; + beams_i_drul_[LEFT] = 0; + beams_i_drul_[RIGHT] = 0; +} + +Beaming_info::Beaming_info(Moment m, int i) +{ + start_mom_ = m; + beams_i_drul_[LEFT] = i; + beams_i_drul_[RIGHT] = i; +} + +const int infinity_i = 1000; // guh. + +int +Beaming_info_list::min_denominator_index () const +{ + int minden = infinity_i; + int minidx = -1; + + for (int i=1; i < infos_.size ( ); i++) + { + if (infos_[i].start_mom_.den_i () < minden) + { + minidx = i; + minden = infos_[i].start_mom_.den_i (); + } + } + + return minidx; +} + +int +Beaming_info_list::beam_extend_count (Direction d) const +{ + if (infos_.size () == 1) + return infos_[0].beams_i_drul_[d]; + + Beaming_info thisbeam = infos_.boundary (d, 0); + Beaming_info next = infos_.boundary (d, 1); + + return thisbeam.beams_i_drul_[-d] splits; + int m = min_denominator_index (); + splits[LEFT].infos_ = infos_.slice (0,m); + splits[RIGHT].infos_ = infos_.slice (m, infos_.size ()); + + Direction d = LEFT; + + do + { + splits[d].beamify (); + } + while (flip (&d) != LEFT); + + int middle_beams = splits[RIGHT].beam_extend_count (LEFT) type_i_; s->set_elt_property ("duration-log", gh_int2scm (intlog2 (type_i) - 2)); - s->beams_i_drul_[LEFT] = s->flag_i (); - s->beams_i_drul_[RIGHT] = s->flag_i (); + s->set_beaming (s->flag_i (), LEFT); + s->set_beaming ( s->flag_i (), RIGHT); - abeam_p_->multiplicity_i_ = s->flag_i (); - /* - abbrev gaps on all but half note - */ + #if 0 if (s->type_i () != 1) { diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index 226e7adaa4..5de0c8e549 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -178,6 +178,7 @@ Clef_engraver::create_clef() if (!clef_p_) { Clef_item *c= new Clef_item; + c->set_elt_property ("breakable", SCM_BOOL_T); c->set_elt_property ("break-aligned", SCM_BOOL_T); announce_element (Score_element_info (c, clef_req_l_)); diff --git a/lily/clef-item.cc b/lily/clef-item.cc index c98c188f7c..644735e288 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -22,12 +22,13 @@ Clef_item::do_pre_processing() { SCM style_sym =get_elt_property ("style"); String style; - if (style_sym != SCM_UNDEFINED) + if (gh_string_p (style_sym)) style = ly_scm2string (style_sym); if (break_status_dir() != RIGHT && style != "fullSizeChanges") symbol_ += "_change"; - if (style == "transparent") + + if (style == "transparent") // UGH. JUNKME { set_elt_property ("transparent", SCM_BOOL_T); set_empty (X_AXIS); @@ -35,12 +36,10 @@ Clef_item::do_pre_processing() } /* - FIXME + JUNKME */ Clef_item::Clef_item() { - set_elt_property ("breakable", SCM_BOOL_T); - symbol_ = "treble"; } diff --git a/lily/include/beam.hh b/lily/include/beam.hh index d3d3c71afd..ff53282f52 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -14,7 +14,7 @@ /** a beam connects multiple stems. Beam adjusts the stems its owns to make sure that they reach the - beam and that point in the correct direction + beam and that point in the correct direction (urg?) elt property: @@ -25,7 +25,8 @@ should beam slope be damped? 0: no, 1: yes, 100000: horizontal beams slope_quantisation: 'none, 'normal or 'traditional */ -class Beam : public Directional_spanner { +class Beam : public Directional_spanner +{ public: int stem_count () const; @@ -36,51 +37,44 @@ public: Stem* last_visible_stem () const; /** - the slope of the beam in (staffpositions) per (X-dimension, in PT). - UGH. standardise this for once and for all. + the slope of the beam in dy/dx */ - Real slope_f_; + Real dydx_f_; /// position of leftmost end of beam Real left_y_; - /** - highest number of beams present, for opening-up of beam-spacing - and calculation of stem lengths - */ - int multiplicity_i_; - Beam (); void add_stem (Stem*); - void set_grouping (Rhythmic_grouping def, Rhythmic_grouping current); void set_beaming (Beaming_info_list *); void set_stemlens (); VIRTUAL_COPY_CONS(Score_element); + int get_multiplicity () const; + protected: - Offset center () const; - Direction get_default_dir () const; - void set_direction (Direction); - void set_stem_shorten (); - bool auto_knee (SCM gap, bool interstaff_b); - bool auto_knees (); - + virtual void do_pre_processing (); virtual void do_post_processing (); - virtual void do_add_processing (); - virtual void do_print() const; virtual Molecule*do_brew_molecule_p () const; Molecule stem_beams (Stem *here, Stem *next, Stem *prev) const; - private: - void calculate_slope (); - Real check_stemlengths_f (bool set_b); - void solve_slope (); - - void quantise_left_y (bool extend_b); - void quantise_dy (); + Direction calc_default_dir () const; + void set_stem_directions (); + void auto_knees (); + bool auto_knee (String gap_str, bool interstaff_b); + void set_stem_shorten (); + void calc_position_and_height (Real* y, Real* dy) const; + bool suspect_slope_b (Real y, Real dy) const; + Real calc_slope_damping_f (Real dy) const; + Real calc_stem_y_f (Stem* s, Real y, Real dy) const; + Real check_stem_length_f (Real y, Real dy) const; + void set_stem_length (Real y, Real dy); + Real quantise_dy_f (Real dy) const; + Real quantise_y_f (Real y, Real dy, int quant_dir); + int forced_stem_count () const; }; diff --git a/lily/include/bow.hh b/lily/include/bow.hh index da2e7a3f1d..132ae263a6 100644 --- a/lily/include/bow.hh +++ b/lily/include/bow.hh @@ -30,7 +30,6 @@ public: protected: virtual Molecule* do_brew_molecule_p () const; - // virtual Interval do_width () const; Array get_controls () const; virtual Array get_encompass_offset_arr () const; static Interval dim_callback (Dimension_cache const*); diff --git a/lily/include/clef-item.hh b/lily/include/clef-item.hh index e35b20c9c0..68ed2dc5e2 100644 --- a/lily/include/clef-item.hh +++ b/lily/include/clef-item.hh @@ -30,7 +30,6 @@ protected: virtual Molecule* do_brew_molecule_p() const; virtual void do_add_processing (); public: - String symbol_; VIRTUAL_COPY_CONS(Score_element); diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index ddb21f4c5c..84af73262b 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -44,7 +44,7 @@ void init_ly_protection (); unsigned int ly_scm_hash (SCM s); SCM index_cell (SCM cellp, Direction d); - +SCM index_set_cell (SCM cellp, Direction d, SCM val); /* snarfing. diff --git a/lily/include/note-head.hh b/lily/include/note-head.hh index bbc051d239..d08b85143d 100644 --- a/lily/include/note-head.hh +++ b/lily/include/note-head.hh @@ -18,13 +18,9 @@ class Note_head : public Rhythmic_head { public: - Note_head (); - void flip_around_stem (Direction); static int compare (Note_head * const &a, Note_head *const &b) ; protected: - Molecule make_molecule () const; - static Interval dim_callback (Dimension_cache const*); virtual void do_pre_processing(); virtual Molecule* do_brew_molecule_p() const; }; diff --git a/lily/include/staff-symbol-referencer.hh b/lily/include/staff-symbol-referencer.hh index 60e9ac2787..a9cb5056cd 100644 --- a/lily/include/staff-symbol-referencer.hh +++ b/lily/include/staff-symbol-referencer.hh @@ -12,6 +12,7 @@ #include "score-element.hh" + /** A notation object that needs access to variables of the staff (no lines, leading). @@ -38,6 +39,8 @@ public: Real position_f () const; }; +int compare_position (Score_element *const&,Score_element *const&); + Staff_symbol_referencer_interface staff_symbol_referencer_interface (Score_element const*); diff --git a/lily/include/stem.hh b/lily/include/stem.hh index a40484123c..7da90a3649 100644 --- a/lily/include/stem.hh +++ b/lily/include/stem.hh @@ -54,17 +54,16 @@ public: /// log of the duration. Eg. 4 -> 16th note -> 2 flags int flag_i () const; - Drul_array beams_i_drul_; - - + int beam_count (Direction) const; + void set_beaming (int, Direction d); /** don't print flag when in beam. our beam, for aligning abbrev flags */ Beam* beam_l () const; Note_head * first_head () const; + Score_element * support_head () const; Stem (); - /// ensure that this Stem also encompasses the Notehead #n# void add_head (Rhythmic_head*n); @@ -83,7 +82,6 @@ public: void set_default_extents(); void set_noteheads(); - Real stem_length_f() const; Real stem_end_f() const; Real stem_begin_f() const; Real note_delta_f () const; diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 20abc957b4..93e1651cc0 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -187,6 +187,15 @@ index_cell (SCM s, Direction d) return (d == LEFT) ? SCM_CAR (s) : SCM_CDR (s); } +SCM +index_set_cell (SCM s, Direction d, SCM v) +{ + if (d == LEFT) + gh_set_car_x (s, v); + else if (d == RIGHT) + gh_set_cdr_x (s, v); + return s; +} SCM array_to_list (SCM *a , int l) diff --git a/lily/misc.cc b/lily/misc.cc index 3f1f2ad949..ab6cceb5f5 100644 --- a/lily/misc.cc +++ b/lily/misc.cc @@ -32,23 +32,6 @@ log_2(double x) { return log (x) /log (2.0); } -#ifndef STANDALONE -Interval -itemlist_width (const Array &its) -{ - Interval iv ; - iv.set_empty(); - - for (int j =0; j < its.size(); j++) - { - iv.unite (its[j]->extent (X_AXIS)); - - } - return iv; -} - -#endif - /* TODO diff --git a/lily/note-column.cc b/lily/note-column.cc index 439cb08186..7ed9936d14 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -156,11 +156,26 @@ Note_column::do_post_processing () if (!b || !b->stem_count ()) return; - /* ugh. Should be done by beam. */ + /* ugh. Should be done by beam. + (what? should be done --jcn) + scary too?: height is calculated during post_processing + */ + Real dy = 0; + Real y = 0; + SCM s = b->get_elt_property ("height"); + if (s != SCM_UNDEFINED) + dy = gh_scm2double (s); + s = b->get_elt_property ("y-position"); + if (s != SCM_UNDEFINED) + y = gh_scm2double (s); + + Real x0 = b->first_visible_stem ()->hpos_f (); + Real dydx = b->last_visible_stem ()->hpos_f () - x0; + Direction d = stem_l ()->get_direction (); - Real beamy = (stem_l ()->hpos_f () - b->stem(0)->hpos_f ()) * b->slope_f_ + b->left_y_; + Real beamy = (stem_l ()->hpos_f () - x0) * dydx + y; - SCM s = get_elt_property ("rests"); + s = get_elt_property ("rests"); Score_element * se = unsmob_element (gh_car (s)); Staff_symbol_referencer_interface si (se); diff --git a/lily/note-head.cc b/lily/note-head.cc index 4ddaac0848..ae8ec87045 100644 --- a/lily/note-head.cc +++ b/lily/note-head.cc @@ -16,24 +16,8 @@ #include "dimension-cache.hh" #include "staff-symbol-referencer.hh" -void -Note_head::flip_around_stem (Direction d) -{ - Real l= make_molecule ().dim_[X_AXIS].length (); - translate_axis (l * d, X_AXIS); -} -Interval -Note_head::dim_callback (Dimension_cache const * c) -{ - Note_head* n = dynamic_cast (c->element_l ()); - return n->make_molecule ().dim_[X_AXIS]; -} -Note_head::Note_head () -{ - dim_cache_[X_AXIS]->callback_l_ = dim_callback; -} void Note_head::do_pre_processing () @@ -41,7 +25,7 @@ Note_head::do_pre_processing () // 8 ball looks the same as 4 ball: String type; SCM style = get_elt_property ("style"); - if (style != SCM_UNDEFINED) + if (gh_string_p (style)) { type = ly_scm2string (style); } @@ -60,28 +44,8 @@ Note_head::do_pre_processing () } } -int -Note_head::compare (Note_head *const &a, Note_head * const &b) -{ - Staff_symbol_referencer_interface s1(a); - Staff_symbol_referencer_interface s2(b); - return sign(s1.position_f () - s2.position_f ()); -} -Molecule -Note_head::make_molecule () const -{ - String type; - SCM style = get_elt_property ("style"); - if (style != SCM_UNDEFINED) - { - type = ly_scm2string (style); - } - - return lookup_l()->afm_find (String ("noteheads-") - + to_str (balltype_i ()) + type); -} Molecule* Note_head::do_brew_molecule_p() const @@ -95,9 +59,17 @@ Note_head::do_brew_molecule_p() const ? 0 : (abs((int)p) - sz) /2; - Molecule* out = new Molecule (make_molecule ()); + String type; + SCM style = get_elt_property ("style"); + if (style != SCM_UNDEFINED) + { + type = ly_scm2string (style); + } + + Molecule* out = + new Molecule (lookup_l()->afm_find (String ("noteheads-") + to_str (balltype_i ()) + type)); - Box b = out->dim_; + Box ledgerless = out->dim_; if (streepjes_i) { @@ -120,7 +92,7 @@ Note_head::do_brew_molecule_p() const } } - out->dim_ = b; + out->dim_ = ledgerless; return out; } diff --git a/lily/slur.cc b/lily/slur.cc index aff1365a27..0a351dc2c2 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -180,7 +180,7 @@ Slur::do_post_processing () if ((stem_l->extent (Y_AXIS).empty_b () || !((stem_l->get_direction () == get_direction ()) && (get_direction () != d))) && !((get_direction () == stem_l->get_direction ()) - && stem_l->beam_l () && (stem_l->beams_i_drul_[-d] >= 1))) + && stem_l->beam_l () && (stem_l->beam_count (-d) >= 1))) { dx_f_drul_[d] = spanned_drul_[d]->extent (X_AXIS).length () / 2; dx_f_drul_[d] -= d * x_gap_f; @@ -206,7 +206,7 @@ Slur::do_post_processing () /* side attached to beamed stem */ - if (stem_l->beam_l () && (stem_l->beams_i_drul_[-d] >= 1)) + if (stem_l->beam_l () && (stem_l->beam_count (-d) >= 1)) { dy_f_drul_[d] = stem_l->extent (Y_AXIS)[get_direction ()]; dy_f_drul_[d] += get_direction () * 2 * y_gap_f; diff --git a/lily/staff-symbol-referencer.cc b/lily/staff-symbol-referencer.cc index 8bd451109a..64a46b8117 100644 --- a/lily/staff-symbol-referencer.cc +++ b/lily/staff-symbol-referencer.cc @@ -65,19 +65,22 @@ Real Staff_symbol_referencer_interface::position_f () const { Real p =0.0; - SCM pos = elt_l_->get_elt_property ("staff-position"); - if (gh_number_p (pos)) - p = gh_scm2double (pos); - Staff_symbol * st = staff_symbol_l (); - if (st) + Score_element * c = st ? elt_l_->common_refpoint (st, Y_AXIS) : 0; + if (st && c) { - Score_element * c = elt_l_->common_refpoint (st, Y_AXIS); Real y = elt_l_->relative_coordinate (c, Y_AXIS) - st->relative_coordinate (c, Y_AXIS); p += 2.0 * y / st->staff_line_leading_f (); } + else + { + SCM pos = elt_l_->get_elt_property ("staff-position"); + if (gh_number_p (pos)) + return gh_scm2double (pos); + } + return p; } @@ -134,3 +137,12 @@ staff_symbol_referencer_interface (Score_element const*e) { return e; // gee, I'm so smart! } + +int +compare_position (Score_element *const &a, Score_element * const &b) +{ + Staff_symbol_referencer_interface s1(a); + Staff_symbol_referencer_interface s2(b); + + return sign(s1.position_f () - s2.position_f ()); +} diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc index e6bd43c2bd..09e490bdff 100644 --- a/lily/stem-engraver.cc +++ b/lily/stem-engraver.cc @@ -104,13 +104,13 @@ Stem_engraver::do_pre_move_processing() SCM prop = get_property ("stemLeftBeamCount", &which); if (gh_number_p(prop)) { - stem_p_->beams_i_drul_[LEFT] = gh_scm2int (prop); + stem_p_->set_beaming (gh_scm2int (prop),LEFT); ((Translator_group*)which)->set_property ("stemLeftBeamCount", SCM_UNDEFINED); } prop = get_property ("stemRightBeamCount", &which); if (gh_number_p(prop)) { - stem_p_->beams_i_drul_[RIGHT] = gh_scm2int (prop); + stem_p_->set_beaming (gh_scm2int (prop), RIGHT); ((Translator_group*)which)->set_property ("stemRightBeamCount", SCM_UNDEFINED); } diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index 069ef6259c..700a491854 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -55,7 +55,7 @@ Stem_tremolo::do_brew_molecule_p () const int mult =0; if (Beam * b = st->beam_l ()) { - mult = b->multiplicity_i_; + mult = b->get_multiplicity (); } Real interbeam_f = paper_l ()->interbeam_f (mult); @@ -65,16 +65,25 @@ Stem_tremolo::do_brew_molecule_p () const Real beam_f = gh_scm2double (get_elt_property ("beam-thickness")); int beams_i = 0; - Real slope_f = 0.25; - - if (st && st->beam_l ()) { - slope_f = st->beam_l ()->slope_f_; - // ugh, rather calc from Stem_tremolo_req - beams_i = st->beams_i_drul_[RIGHT] >? st->beams_i_drul_[LEFT]; - } + Real dydx = 0.25; + + if (st && st->beam_l ()) + { + Real dy = 0; + SCM s = st->beam_l ()->get_elt_property ("height"); + if (s != SCM_UNDEFINED) + dy = gh_scm2double (s); + Real dx = st->beam_l ()->last_visible_stem ()->hpos_f () + - st->beam_l ()->first_visible_stem ()->hpos_f (); + dydx = dy/dx; + + // ugh, rather calc from Stem_tremolo_req + beams_i = st->beam_count(RIGHT) >? st->beam_count (LEFT); + } - Molecule a (lookup_l ()->beam (slope_f, w, beam_f)); - a.translate (Offset (-w/2, w / 2 * slope_f)); + Molecule a (lookup_l ()->beam (dydx, w, beam_f)); + a.translate (Offset (-w/2, w / 2 * dydx)); + Molecule *beams= new Molecule; for (int i = 0; i < abbrev_flags_i_; i++) diff --git a/lily/stem.cc b/lily/stem.cc index a6ca3d3df5..232caf5aed 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -8,6 +8,7 @@ TODO: This is way too hairy */ + #include "dimension-cache.hh" #include "stem.hh" #include "debug.hh" @@ -23,9 +24,28 @@ #include "cross-staff.hh" #include "staff-symbol-referencer.hh" -Stem::Stem () + +void +Stem::set_beaming (int i, Direction d ) +{ + SCM pair = get_elt_property ("beaming"); + + if (!gh_pair_p (pair)) + { + pair = gh_cons (gh_int2scm (0),gh_int2scm (0)); + set_elt_property ("beaming", pair); + } + index_set_cell (pair, d, gh_int2scm (i)); +} + +int +Stem::beam_count (Direction d) const { - beams_i_drul_[LEFT] = beams_i_drul_[RIGHT] = -1; + SCM p=get_elt_property ("beaming"); + if (gh_pair_p (p)) + return gh_scm2int (index_cell (p,d)); + else + return 0; } Interval_t @@ -55,13 +75,6 @@ Stem::head_positions () const return r; } - -Real -Stem::stem_length_f () const -{ - return yextent_.length(); -} - Real Stem::stem_begin_f () const { @@ -96,19 +109,50 @@ Stem::set_stemend (Real se) int Stem::type_i () const { - return first_head ()->balltype_i (); + return first_head () ? first_head ()->balltype_i () : 2; } + + +/* + Note head that determines hshift for upstems + */ +Score_element* +Stem::support_head ()const +{ + SCM h = get_elt_property ("support-head"); + Score_element * nh = unsmob_element (h); + if (nh) + return nh; + else + return first_head (); +} + + +/* + The note head which forms one end of the stem. + */ Note_head* Stem::first_head () const { - SCM h =get_elt_property ("heads"); - if (!gh_pair_p (h)) - return 0; + const int inf = 1000000; + int pos = -inf; + Direction dir = get_direction (); + - Score_element * sc = unsmob_element (gh_car (h)); + Note_head *nh =0; + for (SCM s = get_elt_property ("heads"); gh_pair_p (s); s = gh_cdr (s)) + { + Note_head * n = dynamic_cast (unsmob_element (gh_car (s))); + Staff_symbol_referencer_interface si (n); + int p = dir * int(si.position_f ()); + if (p > pos) + { + nh = n; + } + } - return dynamic_cast (sc); + return nh; } void @@ -127,6 +171,12 @@ Stem::add_head (Rhythmic_head *n) gi.add_element (n); } +Stem::Stem () +{ + set_elt_property ("heads", SCM_EOL); + set_elt_property ("rests", SCM_EOL); +} + bool Stem::invisible_b () const { @@ -170,6 +220,9 @@ Stem::set_default_stemlen () Real shorten_f = paper_l ()->get_var (type_str + "forced_stem_shorten0"); + /* URGURGURG + 'set-default-stemlen' sets direction too + */ if (!get_direction ()) set_direction (get_default_dir ()); @@ -205,9 +258,8 @@ Stem::flag_i () const void Stem::set_default_extents () { - if (!stem_length_f ()) + if (yextent_.empty_b ()) set_default_stemlen (); - } void @@ -215,35 +267,42 @@ Stem::set_noteheads () { if (!first_head ()) return; + + Link_array heads = + Group_interface__extract_elements (this, (Score_element*)0, "heads"); + heads.sort (compare_position); + Direction dir =get_direction (); - Link_array head_l_arr = - Group_interface__extract_elements (this, (Note_head*)0, "heads"); + if (dir < 0) + heads.reverse (); - head_l_arr.sort (Note_head::compare); - if (get_direction () < 0) - head_l_arr.reverse (); - Note_head * beginhead = first_head (); - beginhead->set_elt_property ("extremal", SCM_BOOL_T); - if (beginhead != head_l_arr.top ()) - head_l_arr.top ()->set_elt_property ("extremal", SCM_BOOL_T); + Real w = support_head ()->extent (X_AXIS)[dir]; + for (int i=0; i < heads.size (); i++) + { + heads[i]->translate_axis (w - heads[i]->extent (X_AXIS)[dir], X_AXIS); + } - int parity=1; - int lastpos = int (Staff_symbol_referencer_interface (beginhead).position_f ()); - for (int i=1; i < head_l_arr.size (); i ++) + bool parity= true; + int lastpos = int (Staff_symbol_referencer_interface (heads[0]).position_f ()); + for (int i=1; i < heads.size (); i ++) { - Real p = Staff_symbol_referencer_interface (head_l_arr[i]).position_f (); + Real p = Staff_symbol_referencer_interface (heads[i]).position_f (); int dy =abs (lastpos- (int)p); if (dy <= 1) { if (parity) - head_l_arr[i]->flip_around_stem (get_direction ()); + { + Real l = heads[i]->extent (X_AXIS).length (); + heads[i]->translate_axis (l * get_direction (), X_AXIS); + } parity = !parity; } else - parity = 1; + parity = true; + lastpos = int (p); } } @@ -262,7 +321,6 @@ Stem::do_pre_processing () set_empty (X_AXIS); } - set_spacing_hints (); } @@ -329,8 +387,6 @@ Stem::dim_callback (Dimension_cache const* c) } - - const Real ANGLE = 20* (2.0*M_PI/360.0); // ugh! Molecule* @@ -342,8 +398,8 @@ Stem::do_brew_molecule_p () const .staff_line_leading_f ()/2.0; Real head_wid = 0; - if (first_head ()) - head_wid = first_head ()->extent (X_AXIS).length (); + if (support_head ()) + head_wid = support_head ()->extent (X_AXIS).length (); stem_y[Direction(-get_direction ())] += get_direction () * head_wid * tan(ANGLE)/(2*dy); if (!invisible_b ()) @@ -354,8 +410,7 @@ Stem::do_brew_molecule_p () const mol_p->add_molecule (ss); } - if (get_elt_property ("beam") == SCM_UNDEFINED - && abs (flag_i ()) > 2) + if (!beam_l () && abs (flag_i ()) > 2) { Molecule fl = flag (); fl.translate_axis(stem_y[get_direction ()]*dy, Y_AXIS); @@ -402,29 +457,23 @@ Stem::beam_l ()const } +// ugh still very long. Stem_info Stem::calc_stem_info () const { assert (beam_l ()); - SCM bd = get_elt_property ("beam-dir"); - Real internote_f - = staff_symbol_referencer_interface (this).staff_line_leading_f ()/2; - - Direction beam_dir; - Stem_info info; - - if (isdir_b (bd)) + Direction beam_dir = beam_l ()->get_direction (); + if (!beam_dir) { - beam_dir = to_dir (bd); + programming_error ("Beam dir not set."); + beam_dir = UP; } - else - { - programming_error ("Beam direction not set."); - beam_dir = UP; // GURAUGRNAGURAGU! urg ! - } - - Real interbeam_f = paper_l ()->interbeam_f (beam_l ()->multiplicity_i_); + + Stem_info info; + Real internote_f + = staff_symbol_referencer_interface (this).staff_line_leading_f ()/2; + Real interbeam_f = paper_l ()->interbeam_f (beam_l ()->get_multiplicity ()); Real beam_f = gh_scm2double (beam_l ()->get_elt_property ("beam-thickness")); info.idealy_f_ = chord_start_f (); @@ -438,17 +487,17 @@ Stem::calc_stem_info () const int stem_max = (int)rint(paper_l ()->get_var ("stem_max")); String type_str = grace_b ? "grace_" : ""; Real min_stem_f = paper_l ()->get_var (type_str + "minimum_stem_length" - + to_str (beam_l ()->multiplicity_i_ get_multiplicity () get_var (type_str + "stem_length" - + to_str (beam_l ()->multiplicity_i_ get_multiplicity () multiplicity_i_) + if (beam_l ()->get_multiplicity ()) { info.idealy_f_ += beam_f; - info.idealy_f_ += (beam_l ()->multiplicity_i_ - 1) * interbeam_f; + info.idealy_f_ += (beam_l ()->get_multiplicity () - 1) * interbeam_f; } info.miny_f_ = info.idealy_f_; info.maxy_f_ = INT_MAX; @@ -472,7 +521,7 @@ Stem::calc_stem_info () const info.miny_f_ = info.miny_f_ >? 0; //lowest beam of (UP) beam must never be lower than second staffline info.miny_f_ = info.miny_f_ >? (- 2 * internote_f - beam_f - + (beam_l ()->multiplicity_i_ > 0) * beam_f + interbeam_f * (beam_l ()->multiplicity_i_ - 1)); + + (beam_l ()->get_multiplicity () > 0) * beam_f + interbeam_f * (beam_l ()->get_multiplicity () - 1)); } } else @@ -490,11 +539,12 @@ Stem::calc_stem_info () const info.idealy_f_ = info.miny_f_ >? info.idealy_f_; Real interstaff_f = calc_interstaff_dist (this, beam_l ()); - info.idealy_f_ += interstaff_f * beam_dir; - SCM s = get_elt_property ("shorten"); + SCM s = beam_l ()->get_elt_property ("shorten"); if (s != SCM_UNDEFINED) info.idealy_f_ -= gh_double2scm (s); + + info.idealy_f_ += interstaff_f * beam_dir; info.miny_f_ += interstaff_f * beam_dir; info.maxy_f_ += interstaff_f * beam_dir; diff --git a/lily/tie.cc b/lily/tie.cc index f7ea46e801..c891d0bb68 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -17,13 +17,9 @@ void Tie::set_head (Direction d, Note_head * head_l) { assert (!head (d)); - if (d == LEFT) - gh_set_car_x (get_elt_property ("heads"), head_l->self_scm_ ); - else if (d == RIGHT) - gh_set_cdr_x (get_elt_property ("heads"), head_l->self_scm_ ); + index_set_cell (get_elt_property ("heads"), d, head_l->self_scm_); set_bounds (d, head_l); - add_dependency (head_l); } @@ -76,8 +72,9 @@ Tie::do_add_processing() new_head_drul[d] = head((Direction)-d); } while (flip(&d) != LEFT); - gh_set_car_x (get_elt_property ("heads"), new_head_drul[LEFT]->self_scm_ ); - gh_set_cdr_x (get_elt_property ("heads"), new_head_drul[RIGHT]->self_scm_ ); + index_set_cell (get_elt_property ("heads"), LEFT, new_head_drul[LEFT]->self_scm_ ); + index_set_cell (get_elt_property ("heads"), RIGHT, new_head_drul[LEFT]->self_scm_ ); + } void diff --git a/scm/generic-property.scm b/scm/generic-property.scm index 867d71e624..c6104e21d7 100644 --- a/scm/generic-property.scm +++ b/scm/generic-property.scm @@ -7,6 +7,8 @@ (list 'autoInterstaffKneeGap number? 'auto-interstaff-knee-gap) (list 'beamQuantisation symbol? 'slope-quantisation) (list 'beamDirAlgorithm symbol? 'beam-dir-algorithm) + (list 'beamSlope number? 'height) + (list 'beamVerticalPosition number? 'y-position) ) ) ) @@ -20,6 +22,7 @@ (list 'stemLength number? 'length) (list 'stemStyle string? 'style) (list 'noStemExtend boolean? 'no-stem-extend) + (list 'stemShorten number? 'shorten) )) ) diff --git a/scm/lily.scm b/scm/lily.scm index 34a370175d..ce8c9eec87 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -100,6 +100,7 @@ ;; ;; +;; (Measured in interlines? -- jcn) (define space-alist '( (("" "Clef_item") . (minimum-space 1.0)) @@ -140,7 +141,11 @@ (begin (ly-warn (string-append "Unknown spacing pair `" this "', `" next "'")) '(minimum-space 0.0))))) - + +;; Measured in interlines (urg: how to say #interline?) +(define (stem-shorten flags) 0.5) +(define (beamed-stem-shorten multiplicity) 0.5) + ;;;;;;;; TeX -- 2.39.5