X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftuplet-engraver.cc;h=2745f3461eb4d16457742c62539aba09270ebbb6;hb=7e72a1e50e94a7f9738d62599de79fe7745f600c;hp=87446d86ebf3252514e06f08002e1a053de6826f;hpb=a4d7106c75b325441063fd9ba9c4131979784aa5;p=lilypond.git diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 87446d86eb..2745f3461e 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -3,13 +3,13 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2000 Han-Wen Nienhuys + (c) 1998--2004 Han-Wen Nienhuys */ -#include "command-request.hh" -#include "tuplet-spanner.hh" + +#include "tuplet-bracket.hh" #include "note-column.hh" #include "time-scaled-music.hh" #include "beam.hh" @@ -20,41 +20,40 @@ class Tuplet_engraver : public Engraver { public: - VIRTUAL_COPY_CONS(Translator); + TRANSLATOR_DECLARATIONS(Tuplet_engraver); 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_; + Link_array time_scaled_musics_; + /// when does the scaled music stop? Array order is synced with time_scaled_musics_ + Array stop_moments_; + /// when does the current spanner stop? Array order is synced with time_scaled_musics_ + 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); - void deprecated_process_music (); - virtual void do_post_move_processing (); - virtual void process_acknowledged (); + /// The spanners. Array order is synced with time_scaled_musics_ + Link_array started_spanners_; + + virtual void finalize (); + virtual void acknowledge_grob (Grob_info); + virtual bool try_music (Music*r); + virtual void start_translation_timestep (); + virtual void process_acknowledged_grobs (); }; bool -Tuplet_engraver::do_try_music (Music *r) +Tuplet_engraver::try_music (Music *c) { - if (Time_scaled_music * c = dynamic_cast (r)) + if (c->is_mus_type ("time-scaled-music")) { - Music *el = c->element (); - if (!dynamic_cast (el)) + Music *el = unsmob_music (c->get_mus_property ("element")); + if (el && !el->is_mus_type ("event-chord")) { - time_scaled_music_arr_.push (c); - Moment m = now_mom () + c->length_mom (); + time_scaled_musics_.push (c); + Rational m = now_mom ().main_part_ + c->get_length ().main_part_; stop_moments_.push (m); SCM s = get_property ("tupletSpannerDuration"); - if (unsmob_moment(s)) - m = m = started_span_p_arr_.size ()) - started_span_p_arr_.push (glep); + Spanner* glep = make_spanner ("TupletBracket"); + + if (i >= started_spanners_.size ()) + started_spanners_.push (glep); else - started_span_p_arr_[i] = glep; + started_spanners_[i] = glep; - glep->set_elt_property ("text", - ly_str02scm (to_str (time_scaled_music_arr_[i]->den_i_).ch_C())); + + SCM proc = get_property ("tupletNumberFormatFunction"); + if (gh_procedure_p (proc)) + { + SCM t = gh_apply (proc, scm_list_n (time_scaled_musics_[i]->self_scm (), SCM_UNDEFINED)); + glep->set_grob_property ("text", t); + } - announce_element (glep, time_scaled_music_arr_ [i]); + announce_grob(glep, time_scaled_musics_ [i]->self_scm()); } } void -Tuplet_engraver::acknowledge_element (Score_element_info i) +Tuplet_engraver::acknowledge_grob (Grob_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::has_interface(i.elem_l_)) + if (Note_column::has_interface (i.grob_)) { - for (int j =0; j (i.elem_l_)); - } - else if (Beam::has_interface (i.elem_l_)) - { - for (int j = 0; j < started_span_p_arr_.size (); j++) - if (started_span_p_arr_[j]) - Tuplet_spanner::add_beam (started_span_p_arr_[j],i.elem_l_); + for (int j =0; j (i.grob_)); } } void -Tuplet_engraver::do_post_move_processing () +Tuplet_engraver::start_translation_timestep () { Moment now = now_mom (); Moment tsd; SCM s = get_property ("tupletSpannerDuration"); if (unsmob_moment (s)) - tsd = *unsmob_moment (s); + tsd = unsmob_moment (s)->main_part_; - for (int i= started_span_p_arr_.size (); i--; ) + for (int i= started_spanners_.size (); i--;) { - if (now >= span_stop_moments_[i]) + if (now.main_part_ >= span_stop_moments_[i]) { - if (started_span_p_arr_[i]) + if (Spanner *sp = started_spanners_[i]) { - typeset_element (started_span_p_arr_[i]); - started_span_p_arr_[i] =0; + if (!sp->get_bound (RIGHT)) + sp->set_bound (RIGHT, sp->get_bound (LEFT)); + + typeset_grob (sp); + + started_spanners_[i] =0; } - if (tsd) - span_stop_moments_[i] += tsd; + if (tsd.to_bool ()) + span_stop_moments_[i] += tsd.main_part_; } - if (now >= stop_moments_[i]) + if (now.main_part_ >= stop_moments_[i]) { - started_span_p_arr_.del (i); - stop_moments_.del(i); + started_spanners_.del (i); + stop_moments_.del (i); span_stop_moments_.del (i); - time_scaled_music_arr_.del(i); + time_scaled_musics_.del (i); } } } void -Tuplet_engraver::do_removal_processing () +Tuplet_engraver::finalize () { - for (int i=0; i < started_span_p_arr_.size (); i++) + for (int i=0; i < started_spanners_.size (); i++) { - if (started_span_p_arr_[i]) - typeset_element (started_span_p_arr_[i]); + if (started_spanners_[i]) + typeset_grob (started_spanners_[i]); } } -ADD_THIS_TRANSLATOR(Tuplet_engraver); +Tuplet_engraver::Tuplet_engraver(){} + +ENTER_DESCRIPTION(Tuplet_engraver, +/* descr */ "Catch Time_scaled_music and generate appropriate bracket ", +/* creats*/ "TupletBracket", +/* accepts */ "time-scaled-music", +/* acks */ "note-column-interface", +/* reads */ "tupletNumberFormatFunction tupletSpannerDuration tupletInvisible", +/* write */ "");