? Documentation/out ? Documentation/out-www ? Documentation/bibliography/out ? Documentation/bibliography/out-www ? Documentation/misc/out ? Documentation/misc/out-www ? Documentation/pictures/out ? Documentation/pictures/out-www ? Documentation/topdocs/out ? Documentation/topdocs/out-www ? Documentation/user/out ? Documentation/user/out-www ? buildscripts/out ? buildscripts/out-www ? cygwin/out ? cygwin/out-www ? elisp/out ? elisp/out-www ? flower/out ? flower/out-www ? flower/include/out ? flower/include/out-www ? input/out ? input/out-www ? input/mutopia/out ? input/mutopia/out-www ? input/mutopia/E.Satie/out ? input/mutopia/E.Satie/out-www ? input/mutopia/F.Schubert/out ? input/mutopia/F.Schubert/out-www ? input/mutopia/J.S.Bach/out ? input/mutopia/J.S.Bach/out-www ? input/mutopia/R.Schumann/out ? input/mutopia/R.Schumann/out-www ? input/mutopia/W.A.Mozart/out ? input/mutopia/W.A.Mozart/out-www ? input/no-notation/out ? input/no-notation/out-www ? input/regression/out ? input/regression/out-www ? input/test/out ? input/test/out-www ? input/tutorial/out ? input/tutorial/out-www ? lily/foo.pdf ? lily/foo.ps ? lily/out ? lily/out-www ? lily/include/out ? lily/include/out-www ? ly/out ? ly/out-www ? make/out ? make/out-www ? mf/feta-alphabet11.600pk ? mf/feta-alphabet13.600pk ? mf/feta-alphabet14.600pk ? mf/feta-alphabet16.600pk ? mf/feta-alphabet18.600pk ? mf/feta-alphabet20.600pk ? mf/feta-alphabet23.600pk ? mf/feta-alphabet26.600pk ? mf/feta-braces-a.600pk ? mf/feta-braces-b.600pk ? mf/feta-braces-c.600pk ? mf/feta-braces-d.600pk ? mf/feta-braces-e.600pk ? mf/feta-braces-f.600pk ? mf/feta-braces-g.600pk ? mf/feta-braces-h.600pk ? mf/feta-braces-i.600pk ? mf/feta11.600pk ? mf/feta13.600pk ? mf/feta14.600pk ? mf/feta16.600pk ? mf/feta18.600pk ? mf/feta20.600pk ? mf/feta23.600pk ? mf/feta26.600pk ? mf/out ? mf/out-www ? mf/parmesan11.600pk ? mf/parmesan13.600pk ? mf/parmesan14.600pk ? mf/parmesan16.600pk ? mf/parmesan18.600pk ? mf/parmesan20.600pk ? mf/parmesan23.600pk ? mf/parmesan26.600pk ? po/out ? po/out-www ? ps/out ? ps/out-www ? python/out ? python/out-www ? scm/out ? scm/out-www ? scripts/os ? scripts/out ? scripts/out-www ? scripts/string ? scripts/sys ? stepmake/out ? stepmake/out-www ? stepmake/bin/out ? stepmake/bin/out-www ? stepmake/stepmake/out ? stepmake/stepmake/out-www ? tex/out ? tex/out-www ? vim/out ? vim/out-www Index: lily/time-scaled-music-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/time-scaled-music-iterator.cc,v retrieving revision 1.30 diff -u -r1.30 time-scaled-music-iterator.cc --- lily/time-scaled-music-iterator.cc 24 May 2006 07:00:41 -0000 1.30 +++ lily/time-scaled-music-iterator.cc 7 Jun 2006 16:05:17 -0000 @@ -7,40 +7,132 @@ 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 TupletEvents 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; } -SCM -Time_scaled_music_iterator::get_music_list () const + +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_. This trickery has been built for const + correctness reasons. + */ + Music *mus = get_music (); 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); + 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")); + + 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 ()); - return scm_list_3 (start_event, child->self_scm (), stop_event); + Sequential_iterator::derived_mark (); } IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator); Index: lily/tuplet-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/tuplet-engraver.cc,v retrieving revision 1.96 diff -u -r1.96 tuplet-engraver.cc --- lily/tuplet-engraver.cc 26 May 2006 10:42:10 -0000 1.96 +++ lily/tuplet-engraver.cc 7 Jun 2006 16:05:17 -0000 @@ -166,5 +166,5 @@ /* doc */ "Catch TupletSpannerEvent and generate appropriate bracket ", /* create */ "TupletBracket TupletNumber ", /* accept */ "tuplet-spanner-event", - /* read */ "tupletNumberFormatFunction tupletSpannerDuration tupletFullLength ", + /* read */ "tupletNumberFormatFunction tupletFullLength ", /* write */ "");