X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftuplet-engraver.cc;h=7bec0b218e4632597fd2874ceb00ddeba5275821;hb=a7f82e4dc22fc6219a9fe0f6874f8c91e3f31f24;hp=b751d5eae7d4d4a9ae825e4642c3e786ba9f79d0;hpb=3a46c107cba4b3d2dba74e21f9046cc399c8baf1;p=lilypond.git diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index b751d5eae7..7bec0b218e 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -1,31 +1,64 @@ -/* - auto-plet-engraver.cc -- implement Auto_plet_engraver - +/* + tuplet-engraver.cc -- implement Tuplet_engraver + source file of the GNU LilyPond music typesetter - - (c) 1998 Han-Wen Nienhuys - - */ - -#include "tuplet-engraver.hh" -#include "command-request.hh" -#include "tuplet-spanner.hh" + + (c) 1998--2005 Han-Wen Nienhuys +*/ + +#include "tuplet-bracket.hh" #include "note-column.hh" -#include "compressed-music.hh" -#include "text-def.hh" #include "beam.hh" -#include "music-list.hh" +#include "engraver.hh" +#include "spanner.hh" + +#include "translator.icc" + +struct Tuplet_description +{ + Music *music_; + Rational stop_; + Rational span_stop_; + Spanner *spanner_; + Tuplet_description () + { + music_ = 0; + spanner_ = 0; + } +}; + +class Tuplet_engraver : public Engraver +{ +public: + TRANSLATOR_DECLARATIONS (Tuplet_engraver); + +protected: + Array tuplets_; + + virtual void acknowledge_grob (Grob_info); + virtual bool try_music (Music *r); + PRECOMPUTED_VIRTUAL void start_translation_timestep (); + PRECOMPUTED_VIRTUAL void process_music (); +}; bool -Tuplet_engraver::do_try_music (Music *r) +Tuplet_engraver::try_music (Music *music) { - if (Compressed_music * c = dynamic_cast (r)) + if (music->is_mus_type ("time-scaled-music")) { - Music *el = c->element_l (); - if (!dynamic_cast (el)) + Music *el = unsmob_music (music->get_property ("element")); + if (el && !el->is_mus_type ("event-chord")) { - compressed_music_arr_.push (c); - stop_moments_.push (now_mom () + c->length_mom ()); + Tuplet_description d; + d.music_ = music; + d.stop_ = now_mom ().main_part_ + music->get_length ().main_part_; + d.span_stop_ = d.stop_; + + SCM s = get_property ("tupletSpannerDuration"); + if (unsmob_moment (s)) + d.span_stop_ = min (d.span_stop_, (now_mom () + *unsmob_moment (s)).main_part_); + + tuplets_.push (d); } return true; } @@ -33,60 +66,79 @@ Tuplet_engraver::do_try_music (Music *r) } void -Tuplet_engraver::do_process_requests () +Tuplet_engraver::process_music () { - for (int i= started_span_p_arr_.size (); - i < compressed_music_arr_.size (); i++) + for (int i = 0; i < tuplets_.size (); i++) { - Tuplet_spanner* glep = new Tuplet_spanner; - started_span_p_arr_.push (glep); + if (tuplets_[i].spanner_) + continue; + + Spanner *spanner = make_spanner ("TupletBracket", + tuplets_[i].music_->self_scm ()); + tuplets_[i].spanner_ = spanner; - Text_def *t = new Text_def; - t->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])); + SCM proc = get_property ("tupletNumberFormatFunction"); + if (ly_is_procedure (proc)) + { + SCM t = scm_apply_0 (proc, scm_list_1 (tuplets_[i].music_->self_scm ())); + spanner->set_property ("text", t); + } } } void -Tuplet_engraver::acknowledge_element (Score_element_info i) +Tuplet_engraver::acknowledge_grob (Grob_info i) { - if (Note_column *nc = dynamic_cast (i.elem_l_)) - { - for (int j =0; j add_column (nc); - } - else if (Beam *b = dynamic_cast (i.elem_l_)) + if (Note_column::has_interface (i.grob ())) { - for (int j = 0; j < started_span_p_arr_.size (); j++) - started_span_p_arr_[j]->set_beam (b); + for (int j = 0; j < tuplets_.size (); j++) + if (tuplets_[j].spanner_) + Tuplet_bracket::add_column (tuplets_[j].spanner_, + dynamic_cast (i.grob ())); } } void -Tuplet_engraver::do_post_move_processing () +Tuplet_engraver::start_translation_timestep () { Moment now = now_mom (); - for (int i= started_span_p_arr_.size (); i--; ) + + Moment tsd; + SCM s = get_property ("tupletSpannerDuration"); + if (unsmob_moment (s)) + tsd = unsmob_moment (s)->main_part_; + + for (int i = tuplets_.size (); i--;) { - if (now >= stop_moments_[i]) + if (now.main_part_ >= tuplets_[i].span_stop_) { - typeset_element (started_span_p_arr_[i]); - started_span_p_arr_.del (i); - stop_moments_.del(i); - compressed_music_arr_.del(i); + if (Spanner *sp = tuplets_[i].spanner_) + { + if (!sp->get_bound (RIGHT)) + sp->set_bound (RIGHT, sp->get_bound (LEFT)); + + tuplets_[i].spanner_ = 0; + } + + if (tsd.to_bool ()) + tuplets_[i].span_stop_ += tsd.main_part_; + } + + if (now.main_part_ >= tuplets_[i].stop_) + { + tuplets_.del (i); } } } -void -Tuplet_engraver::do_removal_processing () +Tuplet_engraver::Tuplet_engraver () { - for (int i=0; i < started_span_p_arr_.size (); i++) - { - typeset_element (started_span_p_arr_[i]); - } } -ADD_THIS_TRANSLATOR(Tuplet_engraver); - +ADD_TRANSLATOR (Tuplet_engraver, + /* descr */ "Catch Time_scaled_music and generate appropriate bracket ", + /* creats*/ "TupletBracket", + /* accepts */ "time-scaled-music", + /* acks */ "note-column-interface", + /* reads */ "tupletNumberFormatFunction tupletSpannerDuration", + /* write */ "");