/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
class Completion_rest_engraver : public Engraver
{
vector<Item *> rests_;
- vector<Item *> prev_rests_;
vector<Stream_event *> rest_events_;
Moment rest_end_mom_;
bool is_first_;
void start_translation_timestep ();
void process_music ();
void stop_translation_timestep ();
- DECLARE_TRANSLATOR_LISTENER (rest);
+ void listen_rest (Stream_event *);
};
void
is_first_ = false;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Completion_rest_engraver, rest);
void
Completion_rest_engraver::listen_rest (Stream_event *ev)
{
Moment
Completion_rest_engraver::next_moment (Rational const ¬e_len)
{
- Moment *e = unsmob_moment (get_property ("measurePosition"));
- Moment *l = unsmob_moment (get_property ("measureLength"));
+ Moment *e = unsmob<Moment> (get_property ("measurePosition"));
+ Moment *l = unsmob<Moment> (get_property ("measureLength"));
if (!e || !l || !to_boolean (get_property ("timing")))
{
return Moment (0, 0);
}
Moment result = *l - *e;
- Moment const *unit = unsmob_moment (get_property ("completionUnit"));
+ Moment const *unit = unsmob<Moment> (get_property ("completionUnit"));
if (unit)
{
Completion_rest_engraver::make_rest (Stream_event *ev)
{
Item *rest = make_item ("Rest", ev->self_scm ());
- if (Pitch *p = unsmob_pitch (ev->get_property ("pitch")))
+ if (Pitch *p = unsmob<Pitch> (ev->get_property ("pitch")))
{
int pos = p->steps ();
SCM c0 = get_property ("middleCPosition");
note that rest_dur may be strictly less than left_to_do_
(say, if left_to_do_ == 5/8)
*/
- if (factor_.denominator () == 1 && factor_ > Rational (1, 1))
- rest_dur = Duration (left_to_do_, false);
- else
- rest_dur = Duration (left_to_do_ / factor_, false).compressed (factor_);
+ rest_dur = Duration (left_to_do_ / factor_, false).compressed (factor_);
}
else
{
- orig = unsmob_duration (rest_events_[0]->get_property ("duration"));
+ orig = unsmob<Duration> (rest_events_[0]->get_property ("duration"));
rest_dur = *orig;
- factor_ = rest_dur.factor ();
+ SCM factor = get_property ("completionFactor");
+ if (ly_is_procedure (factor))
+ factor = scm_call_2 (factor,
+ context ()->self_scm (),
+ rest_dur.smobbed_copy ());
+ factor_ = robust_scm2rational (factor, rest_dur.factor());
left_to_do_ = orig->get_length ();
}
Moment nb = next_moment (rest_dur.get_length ());
if (nb.main_part_ && nb < rest_dur.get_length ())
{
- if (factor_.denominator () == 1 && factor_.numerator () > 1)
- rest_dur = Duration (nb.main_part_, false);
- else
- rest_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_);
+ rest_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_);
}
do_nothing_until_ = now.main_part_ + rest_dur.get_length ();
void
Completion_rest_engraver::stop_translation_timestep ()
{
- if (rests_.size ())
- prev_rests_ = rests_;
rests_.clear ();
}
if (rest_end_mom_.main_part_ <= now.main_part_)
{
rest_events_.clear ();
- prev_rests_.clear ();
}
context ()->set_property ("restCompletionBusy",
ly_bool2scm (rest_events_.size ()));
}
-Completion_rest_engraver::Completion_rest_engraver ()
+Completion_rest_engraver::Completion_rest_engraver (Context *c)
+ : Engraver (c)
+{
+}
+
+void
+Completion_rest_engraver::boot ()
{
+ ADD_LISTENER (Completion_rest_engraver, rest);
}
ADD_TRANSLATOR (Completion_rest_engraver,
"Rest ",
/* read */
+ "completionFactor "
"completionUnit "
"middleCPosition "
"measurePosition "