X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftime-scaled-music-iterator.cc;h=7406d884697f6508e9e09a231dbfea7b50917e35;hb=9f3572d98bb948c9689cd1f75401a029451fa001;hp=9ab2673eeb86a23a7694700e886f5b0a13242086;hpb=04265f11d1f21416ccebd2dcaa1d903dc781b36e;p=lilypond.git diff --git a/lily/time-scaled-music-iterator.cc b/lily/time-scaled-music-iterator.cc index 9ab2673eeb..7406d88469 100644 --- a/lily/time-scaled-music-iterator.cc +++ b/lily/time-scaled-music-iterator.cc @@ -7,137 +7,40 @@ Erik Sandberg */ +#include "time-scaled-music-iterator.hh" + #include "context.hh" #include "input.hh" #include "international.hh" #include "music.hh" -#include "sequential-iterator.hh" - -/* - Iterates \times, by sending TupletSpanEvents at the start/end of each - tuplet bracket. Extra stop/start events are sent at regular - intervals if tupletSpannerDuration is set. -*/ -class Time_scaled_music_iterator : public Sequential_iterator -{ -public: - DECLARE_SCHEME_CALLBACK (constructor, ()); - /* construction */ - DECLARE_CLASSNAME(Time_scaled_music_iterator); - Time_scaled_music_iterator (); -protected: - virtual SCM get_music_list () const; - virtual void process (Moment m); - virtual void construct_children (); - virtual void derived_mark () const; - virtual Moment pending_moment () const; -private: - - /* tupletSpannerDuration */ - Moment spanner_duration_; - - /* next time to add a stop/start pair */ - Moment next_split_mom_; - - /* Recycle start/stop events if tupletSpannerDuration is set. */ - Music *start_; - Music *stop_; -}; Time_scaled_music_iterator::Time_scaled_music_iterator () { - spanner_duration_ = next_split_mom_ = 0; -} - - -Moment -Time_scaled_music_iterator::pending_moment () const -{ - Moment next_mom = Sequential_iterator::pending_moment (); - - if (spanner_duration_.to_bool () && - next_mom.main_part_ > next_split_mom_) - { - next_mom = next_split_mom_; - } - - return next_mom; -} - - -void -Time_scaled_music_iterator::process (Moment m) -{ - if (spanner_duration_.to_bool () && - m.main_part_ == next_split_mom_) - { - report_event (stop_); - report_event (start_); - - next_split_mom_ += spanner_duration_; - /* avoid sending events twice at the end */ - if (next_split_mom_ == get_music ()->get_length ().main_part_) - next_split_mom_.set_infinite (1); - } - Sequential_iterator::process(m); -} - -void -Time_scaled_music_iterator::construct_children () -{ - /* - Inheritance trickery: - Time_scaled_music_iterator::construct_children initialises start_ - and stop_, and calls Sequential_music::construct_children, which - in turn calls Time_scaled_music_iterator::get_music which reads - start_ and stop_. - */ - - Music *mus = get_music (); - Input *origin = mus->origin (); - - SCM tuplet_symbol = ly_symbol2scm ("TupletSpanEvent"); - SCM start_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tuplet_symbol, scm_from_int (START)); - start_ = unsmob_music (start_scm); - start_->set_spot (*origin); - start_->set_property ("numerator", mus->get_property ("numerator")); - start_->set_property ("denominator", mus->get_property ("denominator")); - start_->set_property ("tweaks", mus->get_property ("tweaks")); - - - SCM stop_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tuplet_symbol, scm_from_int (STOP)); - stop_ = unsmob_music (stop_scm); - stop_->set_spot (*origin); - - Moment *mp = unsmob_moment (get_outlet ()->get_property ("tupletSpannerDuration")); - - if (mp) - { - spanner_duration_ = mp->main_part_; - next_split_mom_ = spanner_duration_; - } - - Sequential_iterator::construct_children (); } SCM Time_scaled_music_iterator::get_music_list () const { Music *mus = get_music (); - SCM child = mus->get_property ("element"); - - return scm_list_3 (start_->self_scm (), child, stop_->self_scm ()); -} - -void -Time_scaled_music_iterator::derived_mark () const -{ - if (start_) - scm_gc_mark (start_->self_scm ()); - if (stop_) - scm_gc_mark (stop_->self_scm ()); - - Sequential_iterator::derived_mark (); + Input *origin = mus->origin (); + Music *child = unsmob_music (mus->get_property ("element")); + + /* Create tuplet start/stop span events before/after the music */ + SCM tuplet_symbol = ly_symbol2scm ("TupletEvent"); + SCM start_event = scm_call_2 (ly_lily_module_constant ("make-span-event"), tuplet_symbol, scm_from_int (START)); + Music *start = unsmob_music (start_event); + start->set_spot (*origin); + start->set_property ("numerator", mus->get_property ("numerator")); + start->set_property ("denominator", mus->get_property ("denominator")); + start_event = scm_call_1 (ly_lily_module_constant ("make-event-chord"), scm_list_1 (start_event)); + unsmob_music (start_event)->set_spot (*origin); + + SCM stop_event = scm_call_2 (ly_lily_module_constant ("make-span-event"), tuplet_symbol, scm_from_int (STOP)); + unsmob_music (stop_event)->set_spot (*origin); + stop_event = scm_call_1 (ly_lily_module_constant ("make-event-chord"), scm_list_1 (stop_event)); + unsmob_music (stop_event)->set_spot (*origin); + + return scm_list_3 (start_event, child->self_scm (), stop_event); } IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator);