+#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;
+}
+