X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fauto-beam-engraver.cc;h=2b753524355b15c24cd883d0b44ad93bc4beea3f;hb=7181c77e5d46a271f5f76e99bee7f844611e23e4;hp=69b9a4f6ed7bb3295643980b454ab19b533c41ca;hpb=8002fa018c81f70585c25232247c6dcba7f5cba0;p=lilypond.git diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index 69b9a4f6ed..2b75352435 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -1,25 +1,71 @@ + /* auto-beam-engraver.cc -- implement Auto_beam_engraver source file of the GNU LilyPond music typesetter - (c) 1999 Jan Nieuwenhuizen + (c) 1999--2000 Jan Nieuwenhuizen */ #include "beaming.hh" -#include "auto-beam-engraver.hh" #include "musical-request.hh" -#include "bar.hh" #include "beam.hh" -#include "chord-tremolo.hh" -#include "rest.hh" #include "stem.hh" #include "debug.hh" -#include "timing-engraver.hh" #include "engraver-group-engraver.hh" +#include "bar.hh" +#include "rest.hh" +#include "engraver.hh" +#include "item.hh" +#include "spanner.hh" + +class Auto_beam_engraver : public Engraver +{ +public: + Auto_beam_engraver (); + VIRTUAL_COPY_CONS (Translator); + +protected: + virtual bool do_try_music (Music*); + virtual void do_pre_move_processing (); + virtual void do_post_move_processing (); + virtual void do_removal_processing (); + virtual void acknowledge_element (Score_element_info); + virtual void do_process_music (); + virtual void process_acknowledged (); +private: + void begin_beam (); + void consider_end_and_begin (Moment test_mom); + Spanner* create_beam_p (); + void end_beam (); + void junk_beam (); + bool same_grace_state_b (Score_element* e); + void typeset_beam (); + + Moment shortest_mom_; + Spanner *finished_beam_p_; + Link_array* stem_l_arr_p_; + + Moment last_add_mom_; + Moment extend_mom_; + Moment beam_start_moment_; + Moment beam_start_location_; + + // We act as if beam were created, and start a grouping anyway. + Beaming_info_list*grouping_p_; + Beaming_info_list*finished_grouping_p_; +}; + + + ADD_THIS_TRANSLATOR (Auto_beam_engraver); + +/* + TODO: remove all references to Timing_engraver; should read properties. + + */ Auto_beam_engraver::Auto_beam_engraver () { stem_l_arr_p_ = 0; @@ -27,15 +73,8 @@ Auto_beam_engraver::Auto_beam_engraver () finished_beam_p_ = 0; finished_grouping_p_ = 0; grouping_p_ = 0; - timer_l_ =0; } -void -Auto_beam_engraver::do_creation_processing () -{ - Translator * t = daddy_grav_l ()->get_simple_translator ("Timing_engraver"); - timer_l_ = dynamic_cast (t); -} bool Auto_beam_engraver::do_try_music (Music*) @@ -44,7 +83,7 @@ Auto_beam_engraver::do_try_music (Music*) } void -Auto_beam_engraver::do_process_requests () +Auto_beam_engraver::do_process_music () { consider_end_and_begin (shortest_mom_); } @@ -52,12 +91,12 @@ Auto_beam_engraver::do_process_requests () void Auto_beam_engraver::consider_end_and_begin (Moment test_mom) { - if (!timer_l_) - return; + Moment one_beat = *unsmob_moment( get_property ("beatLength")); + + int num = *unsmob_moment (get_property("measureLength")) / one_beat; + int den = one_beat.den_i (); + - Time_description const *time = &timer_l_->time_; - int num = time->whole_per_measure_ / time->one_beat_; - int den = time->one_beat_.den_i (); String time_str = String ("time") + to_str (num) + "_" + to_str (den); String type_str; @@ -66,6 +105,13 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) if (test_mom.den () != 1) type_str = type_str + "_" + to_str (test_mom.den ()); + /* + URG + + FIXME: SHOULD USE ALIST + + */ + /* Determine end moment for auto beaming (and begin, mostly 0==anywhere) In order of increasing priority: @@ -98,59 +144,67 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) /* first guess: end beam at end of beat */ - Moment end_mom = time->one_beat_; + SCM one (get_property ("beatLength")); + + Moment end_mom; + if (unsmob_moment (one)) + end_mom = *unsmob_moment (one); /* second guess: property generic time exception */ - Scalar begin = get_property (time_str + "beamAutoBegin", 0); - if (begin.length_i ()) - begin_mom = begin.to_rat (); + SCM begin = get_property ((time_str + "beamAutoBegin").ch_C()); + if (unsmob_moment (begin)) + begin_mom = * unsmob_moment (begin); - Scalar end = get_property (time_str + "beamAutoEnd", 0); - if (end.length_i ()) - end_mom = end.to_rat (); + SCM end = get_property ((time_str + "beamAutoEnd").ch_C()); + if (unsmob_moment (end)) + end_mom = * unsmob_moment (end); /* third guess: property time exception, specific for duration type */ if (type_str.length_i ()) { - Scalar end_mult = get_property (time_str + "beamAutoEnd" + type_str, 0); - if (end_mult.length_i ()) - end_mom = end_mult.to_rat (); - Scalar begin_mult = get_property (time_str + "beamAutoBegin" + type_str, 0); - if (begin_mult.length_i ()) - begin_mom = begin_mult.to_rat (); + SCM end_mult = get_property ((time_str + "beamAutoEnd" + type_str).ch_C()); + if (unsmob_moment (end_mult)) + end_mom = * unsmob_moment (end_mult); + + SCM begin_mult = get_property ((time_str + "beamAutoBegin" + type_str).ch_C()); + if (unsmob_moment (begin_mult)) + begin_mom = * unsmob_moment (begin_mult); } /* fourth guess [user override]: property plain generic */ - begin = get_property ("beamAutoBegin", 0); - if (begin.length_i ()) - begin_mom = begin.to_rat (); + begin = get_property ("beamAutoBegin"); + if (unsmob_moment (begin)) + begin_mom = * unsmob_moment (begin); + + - end = get_property ("beamAutoEnd", 0); - if (end.length_i ()) - end_mom = end.to_rat (); + end = get_property ("beamAutoEnd"); + if (unsmob_moment (end)) + end_mom = * unsmob_moment (end); /* fifth guess [user override]: property plain, specific for duration type */ if (type_str.length_i ()) { - Scalar end_mult = get_property (String ("beamAutoEnd") + type_str, 0); - if (end_mult.length_i ()) - end_mom = end_mult.to_rat (); - Scalar begin_mult = get_property (String ("beamAutoBegin") + type_str, 0); - if (begin_mult.length_i ()) - begin_mom = begin_mult.to_rat (); + SCM end_mult = get_property ((String ("beamAutoEnd") + type_str).ch_C()); + if (unsmob_moment (end_mult)) + end_mom = * unsmob_moment (end_mult); + + SCM begin_mult = get_property ((String ("beamAutoBegin") + type_str).ch_C()); + if (unsmob_moment (begin_mult)) + begin_mom = * unsmob_moment (begin_mult); } Rational r; if (end_mom) - r = time->whole_in_measure_.mod_rat (end_mom); + r = unsmob_moment (get_property ("measurePosition"))->mod_rat (end_mom); else r = Moment (1); @@ -160,12 +214,12 @@ Auto_beam_engraver::consider_end_and_begin (Moment test_mom) /* Allow already started autobeam to end */ - Scalar on = get_property ("noAutoBeaming", 0); - if (on.to_bool ()) + SCM on = get_property ("noAutoBeaming"); + if (to_boolean (on)) return; if (begin_mom) - r = time->whole_in_measure_.mod_rat (begin_mom); + r = unsmob_moment (get_property ("measurePosition"))->mod_rat (begin_mom); if (!stem_l_arr_p_ && (!begin_mom || !r)) begin_beam (); } @@ -175,48 +229,33 @@ void Auto_beam_engraver::begin_beam () { assert (!stem_l_arr_p_); - stem_l_arr_p_ = new Array; + stem_l_arr_p_ = new Link_array; assert (!grouping_p_); grouping_p_ = new Beaming_info_list; beam_start_moment_ = now_mom (); - beam_start_location_ = timer_l_->time_.whole_in_measure_; + beam_start_location_ = *unsmob_moment (get_property ("measurePosition")); } -Beam* +Spanner* Auto_beam_engraver::create_beam_p () { - Beam* beam_p = new Beam; + Spanner* beam_p = new Spanner (get_property ("basicBeamProperties")); + Beam::set_interface (beam_p); for (int i = 0; i < stem_l_arr_p_->size (); i++) { /* watch out for stem tremolos and abbreviation beams */ - if ((*stem_l_arr_p_)[i]->beam_l_) + if (Stem::beam_l ((*stem_l_arr_p_)[i])) { return 0; } - beam_p->add_stem ((*stem_l_arr_p_)[i]); + Beam::add_stem (beam_p,(*stem_l_arr_p_)[i]); } - /* urg, copied from Beam_engraver */ - Scalar prop = get_property ("beamslopedamping", 0); - if (prop.isnum_b ()) - beam_p->set_elt_property (damping_scm_sym, gh_int2scm(prop)); - - prop = get_property ("autoKneeGap", 0); - if (prop.isnum_b ()) - beam_p->set_elt_property (auto_knee_gap_scm_sym, gh_int2scm(prop)); - - prop = get_property ("autoInterstaffKneeGap", 0); - if (prop.isnum_b ()) - beam_p->set_elt_property (auto_interstaff_knee_gap_scm_sym, gh_int2scm( prop)); - - prop = get_property ("beamquantisation", 0); - if (prop.isnum_b ()) - beam_p->quantisation_ = (Beam::Quantisation)(int)prop; - - announce_element (Score_element_info (beam_p, 0)); + announce_element (beam_p, 0); + return beam_p; } @@ -245,7 +284,7 @@ Auto_beam_engraver::typeset_beam () if (finished_beam_p_) { finished_grouping_p_->beamify (); - finished_beam_p_->set_beaming (finished_grouping_p_); + Beam::set_beaming (finished_beam_p_, finished_grouping_p_); typeset_element (finished_beam_p_); finished_beam_p_ = 0; @@ -281,7 +320,7 @@ Auto_beam_engraver::do_removal_processing () { /* finished beams may be typeset */ typeset_beam (); - /* but unfinished may need another announce/acknoledge pass */ + /* but unfinished may need another announce/acknowledge pass */ if (stem_l_arr_p_) junk_beam (); } @@ -289,39 +328,37 @@ Auto_beam_engraver::do_removal_processing () bool Auto_beam_engraver::same_grace_state_b (Score_element* e) { - bool gr = (e->get_elt_property (grace_scm_sym) != SCM_BOOL_F) ; - - return gr == get_property ("weAreGraceContext",0).to_bool (); + bool gr = e->get_elt_property ("grace") == SCM_BOOL_T; + SCM wg =get_property ("weAreGraceContext"); + return (to_boolean (wg)) == gr; } void Auto_beam_engraver::acknowledge_element (Score_element_info info) { - if (!same_grace_state_b (info.elem_l_) || !timer_l_) + if (!same_grace_state_b (info.elem_l_)) return; if (stem_l_arr_p_) { - if (Beam *b = dynamic_cast (info.elem_l_)) + if (Beam::has_interface (info.elem_l_)) { end_beam (); } - else if (Chord_tremolo *b = dynamic_cast (info.elem_l_)) + else if (Bar::has_interface (info.elem_l_)) { end_beam (); } - else if (Bar *b = dynamic_cast (info.elem_l_)) - { - end_beam (); - } - else if (Rest* rest_l = dynamic_cast (info.elem_l_)) + else if (Rest::has_interface (info.elem_l_)) { end_beam (); } } - if (Stem* stem_l = dynamic_cast (info.elem_l_)) + if (Stem::has_interface (info.elem_l_)) { + Item* stem_l = dynamic_cast (info.elem_l_); + Rhythmic_req *rhythmic_req = dynamic_cast (info.req_l_); if (!rhythmic_req) { @@ -332,14 +369,14 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info) /* Don't (start) auto-beam over empty stems; skips or rests */ - if (!stem_l->head_l_arr_.size ()) + if (!Stem::heads_i (stem_l)) { if (stem_l_arr_p_) end_beam (); return; } - if (stem_l->beam_l_) + if (Stem::beam_l (stem_l)) { if (stem_l_arr_p_) junk_beam (); @@ -412,3 +449,4 @@ Auto_beam_engraver::process_acknowledged () } } } +