#include "misc.hh"
#include "percent-repeat-iterator.hh"
#include "repeated-music.hh"
+#include "score-context.hh"
#include "side-position-interface.hh"
#include "spanner.hh"
-#include "stream-event.hh"
#include "warn.hh"
#include "translator.icc"
TRANSLATOR_DECLARATIONS (Percent_repeat_engraver);
protected:
- Stream_event *percent_event_;
+ Music *percent_event_;
/// moment (global time) where percent started.
Moment stop_mom_;
protected:
virtual void finalize ();
- DECLARE_TRANSLATOR_LISTENER (percent);
+ virtual bool try_music (Music *);
void stop_translation_timestep ();
void start_translation_timestep ();
percent_event_ = 0;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Percent_repeat_engraver, percent);
-void
-Percent_repeat_engraver::listen_percent (Stream_event *ev)
+bool
+Percent_repeat_engraver::try_music (Music *m)
{
- if (!percent_event_)
+ if (m->is_mus_type ("percent-event")
+ && !percent_event_)
{
- Moment body_length = get_event_length (ev);
+ Moment body_length = m->get_length ();
Moment meas_len (robust_scm2moment (get_property ("measureLength"),
Moment (1)));
+
if (meas_len == body_length)
- {
- repeat_sign_type_ = MEASURE;
- start_mom_ = now_mom ();
- stop_mom_ = now_mom () + body_length;
- get_global_context ()->add_moment_to_process (stop_mom_);
- }
+ {
+ repeat_sign_type_ = MEASURE;
+ start_mom_ = now_mom ();
+ stop_mom_ = now_mom () + body_length;
+ get_global_context ()->add_moment_to_process (stop_mom_);
+ }
else if (Moment (2) * meas_len == body_length)
- {
- repeat_sign_type_ = DOUBLE_MEASURE;
- start_mom_ = now_mom () + meas_len;
- stop_mom_ = now_mom () + body_length; /* never used */
- get_global_context ()->add_moment_to_process (start_mom_);
- }
+ {
+ repeat_sign_type_ = DOUBLE_MEASURE;
+ start_mom_ = now_mom () + meas_len;
+ stop_mom_ = now_mom () + body_length; /* never used */
+ get_global_context ()->add_moment_to_process (start_mom_);
+ }
else
- {
- ev->origin ()->warning (_ ("Junking percent repeat event: Duration must be exactly one or two measures"));
- return;
- }
- percent_event_ = ev;
+ return false;
+
+ percent_event_ = m;
+
+ return true;
}
- else
- /* print a warning: no assignment happens because
- percent_event_ != 0 */
- ASSIGN_EVENT_ONCE (percent_event_, ev);
+
+ return false;
}
void