X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftuplet-engraver.cc;h=49bfc8bc3a204322c70fad8b73ae10a784450d2d;hb=30eb1ded55e8d8b17495b96a3741750fe34d3599;hp=8d783526bc447e3f99cc40349614dd4ee08bddae;hpb=332da9f4d25f9f63a3222efc87fae06b0c7abbdd;p=lilypond.git diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 8d783526bc..49bfc8bc3a 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -1,31 +1,35 @@ -/* - tuplet-engraver.cc -- implement Tuplet_engraver - +/* + tuplet-engraver.cc -- implement Tuplet_engraver + source file of the GNU LilyPond music typesetter - - (c) 1998--2004 Han-Wen Nienhuys - - */ + + (c) 1998--2005 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 "translator.icc" + struct Tuplet_description { Music *music_; Rational stop_; Rational span_stop_; + Rational length_; Spanner *spanner_; - Tuplet_description() + Tuplet_description () { music_ = 0; spanner_ = 0; } + static int compare (Tuplet_description const &a, Tuplet_description const &b) + { + return ::compare (a.length_, b.length_); + } }; class Tuplet_engraver : public Engraver @@ -35,11 +39,12 @@ public: protected: Array tuplets_; - - virtual void acknowledge_grob (Grob_info); - virtual bool try_music (Music*r); - virtual void start_translation_timestep (); - virtual void process_music (); + Link_array last_tuplets_; + DECLARE_ACKNOWLEDGER (note_column); + virtual bool try_music (Music *r); + virtual void finalize (); + void start_translation_timestep (); + void process_music (); }; bool @@ -52,13 +57,14 @@ Tuplet_engraver::try_music (Music *music) { Tuplet_description d; d.music_ = music; - d.stop_ = now_mom ().main_part_ + music->get_length ().main_part_; + d.length_ = music->get_length ().main_part_; + d.stop_ = now_mom ().main_part_ + d.length_; d.span_stop_ = d.stop_; - + SCM s = get_property ("tupletSpannerDuration"); if (unsmob_moment (s)) - d.span_stop_ = d.span_stop_ self_scm ()); tuplets_[i].spanner_ = spanner; + if (i > 0 && tuplets_[i - 1].spanner_) + Tuplet_bracket::add_tuplet_bracket (tuplets_[i].spanner_, tuplets_[i - 1].spanner_); + if (i < tuplets_.size () - 1 && tuplets_[i + 1].spanner_) + Tuplet_bracket::add_tuplet_bracket (tuplets_[i + 1].spanner_, tuplets_[i].spanner_); + SCM proc = get_property ("tupletNumberFormatFunction"); - if (ly_c_procedure_p (proc)) + if (ly_is_procedure (proc)) { SCM t = scm_apply_0 (proc, scm_list_1 (tuplets_[i].music_->self_scm ())); spanner->set_property ("text", t); @@ -88,15 +103,12 @@ Tuplet_engraver::process_music () } void -Tuplet_engraver::acknowledge_grob (Grob_info i) +Tuplet_engraver::acknowledge_note_column (Grob_info i) { - if (Note_column::has_interface (i.grob_)) - { - for (int j = 0; j < tuplets_.size (); j++) - if (tuplets_[j].spanner_) - Tuplet_bracket::add_column (tuplets_[j].spanner_, - dynamic_cast (i.grob_)); - } + for (int j = 0; j < tuplets_.size (); j++) + if (tuplets_[j].spanner_) + Tuplet_bracket::add_column (tuplets_[j].spanner_, + dynamic_cast (i.grob ())); } void @@ -104,30 +116,53 @@ Tuplet_engraver::start_translation_timestep () { Moment now = now_mom (); - Moment tsd; - SCM s = get_property ("tupletSpannerDuration"); - if (unsmob_moment (s)) - tsd = unsmob_moment (s)->main_part_; + last_tuplets_.clear (); + if (tuplets_.is_empty ()) + return; + + Moment tsdmom = robust_scm2moment (get_property ("tupletSpannerDuration"), Moment (0)); + bool full_length = to_boolean (get_property ("tupletFullLength")); for (int i = tuplets_.size (); i--;) { + Rational tsd = tsdmom.main_part_; + if (now.main_part_ >= tuplets_[i].span_stop_) { - if (Spanner *sp = tuplets_[i].spanner_) + if (tuplets_[i].spanner_) { - if (!sp->get_bound (RIGHT)) - sp->set_bound (RIGHT, sp->get_bound (LEFT)); - + if (full_length) + { + Item *col = unsmob_item (get_property ("currentMusicalColumn")); + + tuplets_[i].spanner_->set_bound (RIGHT, col); + } + else if (!tuplets_[i].spanner_->get_bound (RIGHT)) + tuplets_[i].spanner_->set_bound (RIGHT, + tuplets_[i].spanner_->get_bound (LEFT)); + + last_tuplets_.push (tuplets_[i].spanner_); tuplets_[i].spanner_ = 0; } - - if (tsd.to_bool ()) - tuplets_[i].span_stop_ += tsd.main_part_; + + if (tsd) + tuplets_[i].span_stop_ += tsd; } if (now.main_part_ >= tuplets_[i].stop_) + tuplets_.del (i); + } +} + +void +Tuplet_engraver::finalize () +{ + if (to_boolean (get_property ("tupletFullLength"))) + { + for (int i = 0; i < last_tuplets_.size (); i++) { - tuplets_.del (i); + Item *col = unsmob_item (get_property ("currentCommandColumn")); + last_tuplets_[i]->set_bound (RIGHT, col); } } } @@ -136,10 +171,10 @@ 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", -/* write */ ""); +ADD_ACKNOWLEDGER (Tuplet_engraver, note_column); +ADD_TRANSLATOR (Tuplet_engraver, + /* doc */ "Catch Time_scaled_music and generate appropriate bracket ", + /* create */ "TupletBracket", + /* accept */ "time-scaled-music", + /* read */ "tupletNumberFormatFunction tupletSpannerDuration tupletFullLength", + /* write */ "");