X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Ftuplet-engraver.cc;h=355cb64c09bfd8810c8238a4a77e8e9ecef325e0;hb=c52973e438ce3490d688860bb71849a7b3c26fef;hp=fc7ab50eed5dd97540f047ee5e57dbee3683364c;hpb=fc81e281674f9d3cb627ef84e8597f14ac78a046;p=lilypond.git diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index fc7ab50eed..355cb64c09 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -1,75 +1,144 @@ /* - auto-plet-engraver.cc -- implement Auto_plet_engraver + plet-engraver.cc -- implement Tuplet_engraver source file of the GNU LilyPond music typesetter - (c) 1998 Han-Wen Nienhuys + (c) 1998--2000 Han-Wen Nienhuys */ -#include "tuplet-engraver.hh" + #include "command-request.hh" #include "tuplet-spanner.hh" #include "note-column.hh" -#include "compressed-music.hh" -#include "text-def.hh" +#include "time-scaled-music.hh" #include "beam.hh" +#include "music-list.hh" +#include "engraver.hh" + +class Tuplet_engraver : public Engraver +{ +public: + VIRTUAL_COPY_CONS(Translator); + +protected: + Link_array time_scaled_music_arr_; + /// when does the scaled music stop? Array order is synced with time_scaled_music_arr_ + Array stop_moments_; + /// when does the current spanner stop? Array order is synced with time_scaled_music_arr_ + Array span_stop_moments_; + + /// The spanners. Array order is synced with time_scaled_music_arr_ + Link_array started_span_p_arr_; + + virtual void do_removal_processing (); + virtual void acknowledge_element (Score_element_info); + virtual bool do_try_music (Music*r); + virtual void do_process_music (); + virtual void do_post_move_processing (); +}; bool Tuplet_engraver::do_try_music (Music *r) { - if (Compressed_music * c = dynamic_cast (r)) + if (Time_scaled_music * c = dynamic_cast (r)) { - compressed_music_arr_.push (c); - stop_moments_.push (now_moment () + c->duration ()); + Music *el = c->element_l (); + if (!dynamic_cast (el)) + { + time_scaled_music_arr_.push (c); + Moment m = now_mom () + c->length_mom (); + stop_moments_.push (m); + + SCM s = get_property ("tupletSpannerDuration"); + if (unsmob_moment(s)) + m = m text_str_ = to_str (compressed_music_arr_[i]->den_i_); - glep->tdef_p_.set_p (t); - announce_element (Score_element_info (glep, compressed_music_arr_ [i])); + Tuplet_spanner* glep = new Tuplet_spanner (get_property ("basicTupletSpannerProperties")); + if (i >= started_span_p_arr_.size ()) + started_span_p_arr_.push (glep); + else + started_span_p_arr_[i] = glep; + + glep->set_elt_property ("text", + ly_str02scm (to_str (time_scaled_music_arr_[i]->den_i_).ch_C())); + + announce_element (Score_element_info (glep, time_scaled_music_arr_ [i])); } } void Tuplet_engraver::acknowledge_element (Score_element_info i) { + bool grace= to_boolean (i.elem_l_->get_elt_property ("grace")); + SCM wg = get_property ("weAreGraceContext"); + bool wgb = to_boolean (wg); + if (grace != wgb) + return; + if (Note_column *nc = dynamic_cast (i.elem_l_)) { for (int j =0; j add_column (nc); + if (started_span_p_arr_[j]) + started_span_p_arr_[j]->add_column (nc); } else if (Beam *b = dynamic_cast (i.elem_l_)) { for (int j = 0; j < started_span_p_arr_.size (); j++) - started_span_p_arr_[j]->set_beam (b); + if (started_span_p_arr_[j]) + started_span_p_arr_[j]->add_beam (b); } } void Tuplet_engraver::do_post_move_processing () { - Moment now = now_moment (); + Moment now = now_mom (); + + Moment tsd; + SCM s = get_property ("tupletSpannerDuration"); + if (unsmob_moment (s)) + tsd = *unsmob_moment (s); + for (int i= started_span_p_arr_.size (); i--; ) { + if (now >= span_stop_moments_[i]) + { + if (started_span_p_arr_[i]) + { + typeset_element (started_span_p_arr_[i]); + started_span_p_arr_[i] =0; + } + + if (tsd) + span_stop_moments_[i] += tsd; + } + if (now >= stop_moments_[i]) { - typeset_element (started_span_p_arr_[i]); started_span_p_arr_.del (i); stop_moments_.del(i); - compressed_music_arr_.del(i); + span_stop_moments_.del (i); + time_scaled_music_arr_.del(i); } } } @@ -79,9 +148,11 @@ Tuplet_engraver::do_removal_processing () { for (int i=0; i < started_span_p_arr_.size (); i++) { - typeset_element (started_span_p_arr_[i]); + if (started_span_p_arr_[i]) + typeset_element (started_span_p_arr_[i]); } } ADD_THIS_TRANSLATOR(Tuplet_engraver); +