From: Jan Nieuwenhuizen Date: Tue, 21 Nov 2000 22:06:24 +0000 (+0100) Subject: patch::: 1.3.109.jcn2 X-Git-Tag: release/1.3.110~1 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f7abba6f6ea0cbd6e41971f30f2c930e7ce0df42;p=lilypond.git patch::: 1.3.109.jcn2 1.3.109.jcn2 ============ * Fixed a mysterious typo in toplevel index. * Enabled property-engraver. * Cleanup in Auto-beam-engraver (still broken, because timings are off?) --- diff --git a/CHANGES b/CHANGES index 5f9ffa734c..8b7d4ea524 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,12 @@ +1.3.109.jcn2 +============ + +* Fixed a mysterious typo in toplevel index. + +* Enabled property-engraver. + +* Cleanup in Auto-beam-engraver (still broken, because timings are off?) + 1.3.109.jcn1 ============ diff --git a/Documentation/topdocs/index.tely b/Documentation/topdocs/index.tely index 50be2f66d7..f3c739c46d 100644 --- a/Documentation/topdocs/index.tely +++ b/Documentation/topdocs/index.tely @@ -16,7 +16,7 @@ @unnumberedsec What is LilyPond? -LilyPond is a music typesetting. It produces beautiful sheet music +LilyPond is a music typesetter. It produces beautiful sheet music using a high level description file as input. It excels at typesetting classical music, but you can also print pop-songs. With LilyPond we hope to make music publication software available to anyone on the diff --git a/VERSION b/VERSION index cbd80a2211..494ad675a7 100644 --- a/VERSION +++ b/VERSION @@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 PATCH_LEVEL=109 -MY_PATCH_LEVEL=jcn1 +MY_PATCH_LEVEL=jcn2 # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index ff73ee4c72..22561d0d24 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -38,9 +38,11 @@ protected: virtual void create_grobs (); private: - void begin_beam (); - void consider_end_and_begin (Moment test_mom); + bool test_moment (Direction, Moment); + void consider_begin (Moment); + void consider_end (Moment); Spanner* create_beam_p (); + void begin_beam (); void end_beam (); void junk_beam (); bool same_grace_state_b (Grob* e); @@ -54,7 +56,7 @@ private: Link_array* stem_l_arr_p_; - bool first_b_; + bool count_i_; Moment last_add_mom_; /* @@ -73,7 +75,7 @@ ADD_THIS_TRANSLATOR (Auto_beam_engraver); Auto_beam_engraver::Auto_beam_engraver () { - first_b_ = true; + count_i_ = 0; stem_l_arr_p_ = 0; shortest_mom_ = Moment (1, 8); finished_beam_p_ = 0; @@ -82,14 +84,38 @@ Auto_beam_engraver::Auto_beam_engraver () } /* - rename me: consider_end_or_begin () ? - */ -void -Auto_beam_engraver::consider_end_and_begin (Moment test_mom) + Determine end moment for auto beaming (or begin moment, but mostly + 0==anywhere) In order of increasing priority: + + i. begin anywhere, end at every beat + ii. end * + iii. end + + iv. end * * * + v. end * * + + + Rationale: + + [to be defined in config file] + i. easy catch-all rule + ii. exceptions for time signature + iii. exceptions for time signature, for specific duration type + + [user override] + iv. generic override + v. override for specific duration type + +*/ +bool +Auto_beam_engraver::test_moment (Direction dir, Moment test_mom) { SCM wild = gh_list (ly_symbol2scm ("*"), ly_symbol2scm ("*"), SCM_UNDEFINED); - SCM b = gh_list (ly_symbol2scm ("begin"), SCM_UNDEFINED); - SCM e = gh_list (ly_symbol2scm ("end"), SCM_UNDEFINED); + SCM function; + if (dir == START) + function = gh_list (ly_symbol2scm ("begin"), SCM_UNDEFINED); + else + function = gh_list (ly_symbol2scm ("end"), SCM_UNDEFINED); Moment one_beat = *unsmob_moment( get_property ("beatLength")); int num = *unsmob_moment (get_property("measureLength")) / one_beat; @@ -101,112 +127,82 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) SCM settings = get_property ("autoBeamSettings"); - /* - Determine end moment for auto beaming (and begin, mostly 0==anywhere) - In order of increasing priority: - - i. every beat - ii. end * - iii. end - - iv. end * * * - v. end * * - - - Rationale: - - [to be defined in config file] - i. easy catch-all rule - ii. exceptions for time signature - iii. exceptions for time signature, for specific duration type - - [user override] - iv. generic override - v. override for specific duration type - - */ + /* first guess */ - - /* - first guess: begin beam at any position - */ - Moment begin_mom (0); - /* - first guess: end beam at end of beat - */ - SCM one (get_property ("beatLength")); - - Moment end_mom; - if (unsmob_moment (one)) - end_mom = *unsmob_moment (one); - - /* - second guess: property generic time exception - */ - SCM begin = gh_assoc (gh_append3 (b, wild, time), settings); + /* begin beam at any position + (and fallback for end) */ + Moment moment (0); - if (begin != SCM_BOOL_F && unsmob_moment (gh_cdr (begin))) - begin_mom = * unsmob_moment (gh_cdr (begin)); - - SCM end = gh_assoc (gh_append3 (e, wild, time), settings); - if (end != SCM_BOOL_F && unsmob_moment (gh_cdr (end))) - end_mom = * unsmob_moment (gh_cdr (end)); + /* end beam at end of beat */ + if (dir == STOP) + { + SCM beat (get_property ("beatLength")); + + if (unsmob_moment (beat)) + moment = *unsmob_moment (beat); + } - /* - third guess: property time exception, specific for duration type - */ - SCM begin_mult = gh_assoc (gh_append3 (b, type, time), settings); - if (begin_mult != SCM_BOOL_F && unsmob_moment (gh_cdr (begin_mult))) - begin_mom = * unsmob_moment (gh_cdr (begin_mult)); + /* second guess: property generic time exception */ + SCM m = gh_assoc (gh_append3 (function, wild, time), settings); - SCM end_mult = gh_assoc (gh_append3 (e, type, time), settings); - if (end_mult != SCM_BOOL_F && unsmob_moment (gh_cdr (end_mult))) - end_mom = * unsmob_moment (gh_cdr (end_mult)); - - /* - fourth guess [user override]: property plain generic - */ - begin = gh_assoc (gh_append3 (b, wild, wild), settings); - if (begin != SCM_BOOL_F && unsmob_moment (gh_cdr (begin))) - begin_mom = * unsmob_moment (gh_cdr (begin)); - - end = gh_assoc (gh_append3 (e, wild, wild), settings); - if (end != SCM_BOOL_F && unsmob_moment (gh_cdr (end))) - end_mom = * unsmob_moment (gh_cdr (end)); - - /* - fifth guess [user override]: property plain, specific for duration type - */ - begin_mult = gh_assoc (gh_append3 (b, type, wild), settings); - if (begin_mult != SCM_BOOL_F && unsmob_moment (gh_cdr (begin_mult))) - begin_mom = * unsmob_moment (gh_cdr (begin_mult)); + if (m != SCM_BOOL_F && unsmob_moment (gh_cdr (m))) + moment = * unsmob_moment (gh_cdr (m)); + + /* third guess: property time exception, specific for duration type */ + m = gh_assoc (gh_append3 (function, type, time), settings); + if (m != SCM_BOOL_F && unsmob_moment (gh_cdr (m))) + moment = * unsmob_moment (gh_cdr (m)); + + /* fourth guess [user override]: property plain generic */ + m = gh_assoc (gh_append3 (function, wild, wild), settings); + if (m != SCM_BOOL_F && unsmob_moment (gh_cdr (m))) + moment = * unsmob_moment (gh_cdr (m)); + + /* fifth guess [user override]: property plain, specific for duration type */ + m = gh_assoc (gh_append3 (function, type, wild), settings); + if (m != SCM_BOOL_F && unsmob_moment (gh_cdr (m))) + moment = * unsmob_moment (gh_cdr (m)); - end_mult = gh_assoc (gh_append3 (e, type, wild), settings); - if (end_mult != SCM_BOOL_F && unsmob_moment (gh_cdr (end_mult))) - end_mom = * unsmob_moment (gh_cdr (end_mult)); - Rational r; - if (end_mom) - r = unsmob_moment (get_property ("measurePosition"))->mod_rat (end_mom); + if (moment) + r = unsmob_moment (get_property ("measurePosition"))->mod_rat (moment); else - r = Moment (1); - - if (stem_l_arr_p_ && stem_l_arr_p_->size () > 1 && !r) - end_beam (); + { + if (dir == START) + /* if undefined, starting is ok */ + r = 0; + else + /* but ending is not */ + r = 1; + } + return !r; +} - /* - Allow already started autobeam to end - */ - SCM on = get_property ("noAutoBeaming"); - if (to_boolean (on)) - return; +void +Auto_beam_engraver::consider_begin (Moment test_mom) +{ + SCM off = to_boolean (get_property ("noAutoBeaming")); + if (!stem_l_arr_p_ && ! off) + { + bool b = test_moment (START, test_mom); + if (b) + begin_beam (); + } +} - if (begin_mom) - r = unsmob_moment (get_property ("measurePosition"))->mod_rat (begin_mom); - if (!stem_l_arr_p_ && (!begin_mom || !r)) - begin_beam (); +void +Auto_beam_engraver::consider_end (Moment test_mom) +{ + if (stem_l_arr_p_ && stem_l_arr_p_->size () > 1) + { + /* Allow already started autobeam to end: + don't check for noAutoBeaming */ + bool b = test_moment (STOP, test_mom); + if (b) + end_beam (); + } } - + Spanner* Auto_beam_engraver::create_beam_p () { @@ -292,7 +288,7 @@ Auto_beam_engraver::typeset_beam () void Auto_beam_engraver::start_translation_timestep () { - first_b_ =true; + count_i_ = 0; /* don't beam over skips */ @@ -390,26 +386,36 @@ Auto_beam_engraver::acknowledge_grob (Grob_info info) return; } - /* - if shortest duration would change - reconsider ending/starting beam first. - */ Moment dur = unsmob_duration (rhythmic_req->get_mus_property ("duration"))->length_mom (); - consider_end_and_begin (dur); - if (!stem_l_arr_p_) - return; + /* FIXME: + + This comment has been here since long: + + if shortest duration would change + consider ending and beginning beam first. + + but the code didn't match: */ +#if 1 + consider_end (dur); + consider_begin (dur); + + if (dur < shortest_mom_) + shortest_mom_ = dur; +#else + /* I very much suspect that we wanted: */ + + consider_end (shortest_mom_); if (dur < shortest_mom_) { shortest_mom_ = dur; - if (stem_l_arr_p_->size ()) - { - shortest_mom_ = dur; - consider_end_and_begin (shortest_mom_); - if (!stem_l_arr_p_) - return; - } + consider_end (shortest_mom_); } + consider_begin (shortest_mom_); +#endif + + if (!stem_l_arr_p_) + return; Moment now = now_mom (); @@ -424,12 +430,12 @@ Auto_beam_engraver::acknowledge_grob (Grob_info info) void Auto_beam_engraver::create_grobs () { - if (first_b_) + if (!count_i_) { - first_b_ = false; - consider_end_and_begin (shortest_mom_); + consider_end (shortest_mom_); + consider_begin (shortest_mom_); } - else + else if (count_i_ > 1) { if (stem_l_arr_p_) { @@ -444,5 +450,11 @@ Auto_beam_engraver::create_grobs () junk_beam (); } } - } + } + + /* + Ugh. + gcc: 2.95.3-2c (latest and greatest from Franz Sirl for ppc) + auto-beam-engraver.cc:459: warning: value computed is not used */ + count_i_++; } diff --git a/lily/property-engraver.cc b/lily/property-engraver.cc index 0ee977d887..de081a753d 100644 --- a/lily/property-engraver.cc +++ b/lily/property-engraver.cc @@ -70,9 +70,7 @@ Property_engraver::do_creation_processing () void Property_engraver::acknowledge_grob (Grob_info i) { - ///////// - return; - SCM ifs = i.elem_l_->get_grob_property ("interfaces"); + SCM ifs = i.elem_l_->get_grob_property ("interfaces"); SCM props; for (; gh_pair_p (ifs); ifs = gh_cdr (ifs)) {