X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpercent-repeat-engraver.cc;h=d68a44e274eee71e4cb13da8f1ac6b7547b920db;hb=91821bd59959b1289f2d711509017a4dacebecd2;hp=a7cc0f44dad243febcb2b988c6eb44dbbfd08168;hpb=b1323f33e9aa4b9eea05eefb8755c907d4d762d4;p=lilypond.git diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index a7cc0f44da..d68a44e274 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -1,15 +1,12 @@ -/* - new-chord-tremolo-engraver.cc -- implement Chord_tremolo_engraver - +/* + new-chord-tremolo-engraver.cc -- implement Chord_tremolo_engraver + source file of the GNU LilyPond music typesetter - - (c) 2000--2004 Han-Wen Nienhuys - - */ -#include "engraver.hh" + (c) 2000--2005 Han-Wen Nienhuys +*/ + #include "repeated-music.hh" -#include "engraver-group-engraver.hh" #include "global-context.hh" #include "warn.hh" #include "misc.hh" @@ -17,29 +14,25 @@ #include "item.hh" #include "percent-repeat-iterator.hh" #include "bar-line.hh" - #include "score-engraver.hh" -#include "context.hh" - /** - This acknowledges repeated music with "percent" style. It typesets - a % sign. + This acknowledges repeated music with "percent" style. It typesets + a % sign. - TODO: + TODO: - - BEAT case: Create items for single beat repeats, i.e. c4 / / / + - BEAT case: Create items for single beat repeats, i.e. c4 / / / - - DOUBLE_MEASURE case: attach a % to an appropriate barline. - + - DOUBLE_MEASURE case: attach a % to an appropriate barline. */ class Percent_repeat_engraver : public Engraver { void typeset_perc (); public: - TRANSLATOR_DECLARATIONS(Percent_repeat_engraver); + TRANSLATOR_DECLARATIONS (Percent_repeat_engraver); protected: - Repeated_music * repeat_; + Music *repeat_; /// moment (global time) where beam started. Moment start_mom_; @@ -50,74 +43,80 @@ protected: Moment next_moment_; Moment body_length_; - enum { - UNKNOWN, - MEASURE, - DOUBLE_MEASURE, - } repeat_sign_type_ ; + enum + { + UNKNOWN, + MEASURE, + DOUBLE_MEASURE, + } + repeat_sign_type_; - Item * double_percent_; - Spanner * perc_; - Spanner * finished_perc_; + Item *double_percent_; + Spanner *perc_; + Spanner *finished_perc_; protected: virtual void finalize (); - virtual bool try_music (Music*); - virtual void stop_translation_timestep (); - virtual void start_translation_timestep (); - virtual void process_music (); + virtual bool try_music (Music *); + void stop_translation_timestep (); + void start_translation_timestep (); + void process_music (); }; Percent_repeat_engraver::Percent_repeat_engraver () { - perc_ = 0; + perc_ = 0; finished_perc_ = 0; - repeat_ =0; + repeat_ = 0; double_percent_ = 0; } bool -Percent_repeat_engraver::try_music (Music * m) +Percent_repeat_engraver::try_music (Music *m) { - Repeated_music * rp = dynamic_cast (m); - if (rp - && rp->get_property ("iterator-ctor") - == Percent_repeat_iterator::constructor_proc + if (m->is_mus_type ("repeated-music") + && m->get_property ("iterator-ctor") + == Percent_repeat_iterator::constructor_proc && !repeat_) { - body_length_ = rp->body_get_length (); - int count = rp->repeat_count (); - + body_length_ = Repeated_music::body_get_length (m); + int count = Repeated_music::repeat_count (m); + Moment now = now_mom (); start_mom_ = now; stop_mom_ = start_mom_ + Moment (count) * body_length_; next_moment_ = start_mom_ + body_length_; - SCM m = get_property ("measureLength"); - Moment meas_len; - if (unsmob_moment (m)) - meas_len = *unsmob_moment (m); - + Moment meas_len (robust_scm2moment (get_property ("measureLength"), Moment (1))); if (meas_len == body_length_) repeat_sign_type_ = MEASURE; - else if (Moment (2)* meas_len == body_length_) + else if (Moment (2) * meas_len == body_length_) { repeat_sign_type_ = DOUBLE_MEASURE; - next_moment_ += meas_len ; } else { - warning (_ ("Don't know how to handle a percent repeat of this length.")); + warning (_f ("can't handle a percent repeat of length: %s", + body_length_.to_string ())); return false; } - repeat_ = rp; + repeat_ = m; - Global_context *global = get_global_context (); - for (int i = 0; i < count; i++) - global->add_moment_to_process (next_moment_ + Moment (i) * body_length_); - + for (int i = 1; i < count; i++) + { + Moment m = next_moment_ + Moment (i) * body_length_; + global->add_moment_to_process (m); + + /* bars between % too. */ + if (repeat_sign_type_ == DOUBLE_MEASURE) + global->add_moment_to_process (m - meas_len); + } + + if (repeat_sign_type_ == DOUBLE_MEASURE) + next_moment_ += meas_len; + return true; } @@ -133,25 +132,23 @@ Percent_repeat_engraver::process_music () { finished_perc_ = perc_; typeset_perc (); - perc_ = make_spanner ("PercentRepeat"); - SCM col =get_property ("currentCommandColumn"); + perc_ = make_spanner ("PercentRepeat", repeat_->self_scm ()); + SCM col = get_property ("currentCommandColumn"); perc_->set_bound (LEFT, unsmob_grob (col)); - announce_grob(perc_, repeat_->self_scm()); } else if (repeat_sign_type_ == DOUBLE_MEASURE) { - double_percent_ = make_item ("DoublePercentRepeat"); - announce_grob(double_percent_, repeat_->self_scm()); - - /* - forbid breaks on a % line. Should forbid all breaks, really. - */ - - get_score_engraver ()->forbid_breaks (); // guh. Use properties! + double_percent_ = make_item ("DoublePercentRepeat", repeat_->self_scm ()); + + /* + forbid breaks on a % line. Should forbid all breaks, really. + + Ugh. Why can't this be regular communication between + contexts? + */ + get_score_engraver ()->forbid_breaks (); } next_moment_ = next_moment_ + body_length_; - - get_global_context ()->add_moment_to_process (next_moment_); } } @@ -171,22 +168,14 @@ Percent_repeat_engraver::typeset_perc () { if (finished_perc_) { - SCM col =get_property ("currentCommandColumn"); + SCM col = get_property ("currentCommandColumn"); finished_perc_->set_bound (RIGHT, unsmob_grob (col)); - typeset_grob (finished_perc_); finished_perc_ = 0; } - if (double_percent_) - { - typeset_grob (double_percent_); - double_percent_ = 0; - } + double_percent_ = 0; } - - - void Percent_repeat_engraver::start_translation_timestep () { @@ -203,20 +192,17 @@ Percent_repeat_engraver::start_translation_timestep () } } - void Percent_repeat_engraver::stop_translation_timestep () { typeset_perc (); } +#include "translator.icc" - - -ENTER_DESCRIPTION(Percent_repeat_engraver, -/* descr */ "Make whole bar and double bar repeats.", -/* creats*/ "PercentRepeat DoublePercentRepeat", -/* accepts */ "repeated-music", -/* acks */ "", -/* reads */ "measureLength currentCommandColumn", -/* write */ ""); +ADD_TRANSLATOR (Percent_repeat_engraver, + /* doc */ "Make whole bar and double bar repeats.", + /* create */ "PercentRepeat DoublePercentRepeat", + /* accept */ "repeated-music", + /* read */ "measureLength currentCommandColumn", + /* write */ "");