X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Ftuplet-engraver.cc;h=a160d0e4440ec2dc44e216787965c460e4f39192;hb=7dcae7597fae14ce5c4e2e7d50c2709d162b7332;hp=c067169a8c4aeb906470d2fa99c291e91d44e768;hpb=014f0f6a4f09a4b93d0041cc8237fd3c7a5ad389;p=lilypond.git diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index c067169a8c..a160d0e444 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -1,105 +1,171 @@ -/* - auto-plet-engraver.cc -- implement Auto_plet_engraver - +/* + tuplet-engraver.cc -- implement Tuplet_engraver + source file of the GNU LilyPond music typesetter - - (c) 1998--1999 Han-Wen Nienhuys - - */ -#include "tuplet-engraver.hh" -#include "command-request.hh" -#include "tuplet-spanner.hh" + (c) 1998--2006 Han-Wen Nienhuys +*/ + +#include "tuplet-bracket.hh" #include "note-column.hh" -#include "time-scaled-music.hh" #include "beam.hh" -#include "music-list.hh" +#include "engraver.hh" +#include "spanner.hh" +#include "stream-event.hh" -bool -Tuplet_engraver::do_try_music (Music *r) +#include "translator.icc" + +struct Tuplet_description { - if (Time_scaled_music * c = dynamic_cast (r)) - { - Music *el = c->element_l (); - if (!dynamic_cast (el)) - { - time_scaled_music_arr_.push (c); - stop_moments_.push (now_mom () + c->length_mom ()); - } - return true; - } - return false; -} + Stream_event *event_; + Spanner *bracket_; + Spanner *number_; -void -Tuplet_engraver::do_process_requests () + bool full_length_; + bool full_length_note_; + + Tuplet_description () + { + event_ = 0; + full_length_note_ = false; + full_length_ = false; + bracket_ = 0; + number_ = 0; + } +}; + +class Tuplet_engraver : public Engraver { - int dir = 0; - Scalar prop = get_property ("tupletDirection", 0); - if (prop.isnum_b()) - dir = (int)prop; - int visibility = 3; - prop = get_property ("tupletVisibility", 0); - if (prop.isnum_b()) - visibility = (int)prop; - - for (int i= started_span_p_arr_.size (); - i < time_scaled_music_arr_.size (); i++) - { - Tuplet_spanner* glep = new Tuplet_spanner; - started_span_p_arr_.push (glep); - glep->number_str_ = to_str (time_scaled_music_arr_[i]->den_i_); - glep->set_elt_property(tuplet_visibility_scm_sym, - gh_int2scm (visibility)); - if (dir != 0) - glep->set_elt_property(dir_forced_scm_sym, gh_int2scm (dir)); - announce_element (Score_element_info (glep, time_scaled_music_arr_ [i])); - } -} +public: + TRANSLATOR_DECLARATIONS (Tuplet_engraver); + +protected: + vector tuplets_; + vector stopped_tuplets_; + vector last_tuplets_; + DECLARE_ACKNOWLEDGER (note_column); + DECLARE_TRANSLATOR_LISTENER (tuplet_span); + virtual void finalize (); + void start_translation_timestep (); + void process_music (); +}; +IMPLEMENT_TRANSLATOR_LISTENER (Tuplet_engraver, tuplet_span); void -Tuplet_engraver::acknowledge_element (Score_element_info i) +Tuplet_engraver::listen_tuplet_span (Stream_event *ev) { - bool grace= (i.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F); - if (grace != get_property ("weAreGraceContext",0).to_bool ()) - return; - - if (Note_column *nc = dynamic_cast (i.elem_l_)) + Direction dir = to_dir (ev->get_property ("span-direction")); + if (dir == START) { - for (int j =0; j add_column (nc); + Tuplet_description d; + d.event_ = ev; + tuplets_.push_back (d); } - else if (Beam *b = dynamic_cast (i.elem_l_)) + if (dir == STOP) { - for (int j = 0; j < started_span_p_arr_.size (); j++) - started_span_p_arr_[j]->add_beam (b); + stopped_tuplets_.push_back (tuplets_.back ()); + tuplets_.pop_back (); } } void -Tuplet_engraver::do_post_move_processing () +Tuplet_engraver::process_music () { - Moment now = now_mom (); - for (int i= started_span_p_arr_.size (); i--; ) + for (vsize i = 0; i < stopped_tuplets_.size (); i++) { - if (now >= stop_moments_[i]) + if (stopped_tuplets_[i].bracket_) { - typeset_element (started_span_p_arr_[i]); - started_span_p_arr_.del (i); - stop_moments_.del(i); - time_scaled_music_arr_.del(i); + if (stopped_tuplets_[i].full_length_) + { + Item *col = + unsmob_item (stopped_tuplets_[i].full_length_note_ + ? get_property ("currentMusicalColumn") + : get_property ("currentCommandColumn")); + + stopped_tuplets_[i].bracket_->set_bound (RIGHT, col); + stopped_tuplets_[i].number_->set_bound (RIGHT, col); + } + else if (!stopped_tuplets_[i].bracket_->get_bound (RIGHT)) + { + stopped_tuplets_[i].bracket_->set_bound (RIGHT, + stopped_tuplets_[i].bracket_->get_bound (LEFT)); + stopped_tuplets_[i].number_->set_bound (RIGHT, + stopped_tuplets_[i].bracket_->get_bound (LEFT)); + } + // todo: scrap last_tuplets_, use stopped_tuplets_ only. + // clear stopped_tuplets_ at start_translation_timestep + last_tuplets_.push_back (tuplets_[i].bracket_); + last_tuplets_.push_back (tuplets_[i].number_); } } + stopped_tuplets_.clear (); + + for (vsize j = tuplets_.size (); j > 0; j--) + { + /* i goes from size-1 downto 0, inclusively */ + vsize i = j - 1; + + + if (tuplets_[i].bracket_) + continue; + + tuplets_[i].full_length_ = to_boolean (get_property ("tupletFullLength")); + tuplets_[i].full_length_note_ + = to_boolean (get_property ("tupletFullLengthNote")); + + tuplets_[i].bracket_ = make_spanner ("TupletBracket", + tuplets_[i].event_->self_scm ()); + tuplets_[i].number_ = make_spanner ("TupletNumber", + tuplets_[i].event_->self_scm ()); + tuplets_[i].number_->set_object ("bracket", tuplets_[i].bracket_->self_scm ()); + tuplets_[i].bracket_->set_object ("tuplet-number", tuplets_[i].number_->self_scm ()); + + if (i < tuplets_.size () - 1 && tuplets_[i + 1].bracket_) + Tuplet_bracket::add_tuplet_bracket (tuplets_[i].bracket_, tuplets_[i + 1].bracket_); + + if (i > 0 && tuplets_[i - 1].bracket_) + Tuplet_bracket::add_tuplet_bracket (tuplets_[i - 1].bracket_, tuplets_[i].bracket_); + + } } void -Tuplet_engraver::do_removal_processing () +Tuplet_engraver::acknowledge_note_column (Grob_info inf) { - for (int i=0; i < started_span_p_arr_.size (); i++) - { - typeset_element (started_span_p_arr_[i]); - } + for (vsize j = 0; j < tuplets_.size (); j++) + if (tuplets_[j].bracket_) + { + Item *i = dynamic_cast (inf.grob ()); + Tuplet_bracket::add_column (tuplets_[j].bracket_, i); + add_bound_item (tuplets_[j].number_, i); + } +} + +void +Tuplet_engraver::start_translation_timestep () +{ + last_tuplets_.clear (); } -ADD_THIS_TRANSLATOR(Tuplet_engraver); +void +Tuplet_engraver::finalize () +{ + if (to_boolean (get_property ("tupletFullLength"))) + for (vsize i = 0; i < last_tuplets_.size (); i++) + { + Item *col = unsmob_item (get_property ("currentCommandColumn")); + last_tuplets_[i]->set_bound (RIGHT, col); + } +} + +Tuplet_engraver::Tuplet_engraver () +{ +} +ADD_ACKNOWLEDGER (Tuplet_engraver, note_column); +ADD_TRANSLATOR (Tuplet_engraver, + /* doc */ "Catch TupletSpannerEvent and generate appropriate bracket ", + /* create */ "TupletBracket TupletNumber ", + /* accept */ "tuplet-span-event", + /* read */ "tupletFullLength ", + /* write */ "");