X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcompletion-rest-engraver.cc;h=c3b8b10955d767404e34ee2d87bccc0a005e8e82;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=6bd52d6e9a4e259406906d664de05ebad2d1453a;hpb=55c25d3fbd92cf20170cba16c3b8cc2616eb39f1;p=lilypond.git diff --git a/lily/completion-rest-engraver.cc b/lily/completion-rest-engraver.cc index 6bd52d6e9a..c3b8b10955 100644 --- a/lily/completion-rest-engraver.cc +++ b/lily/completion-rest-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -58,7 +58,6 @@ using namespace std; class Completion_rest_engraver : public Engraver { vector rests_; - vector prev_rests_; vector rest_events_; Moment rest_end_mom_; bool is_first_; @@ -77,7 +76,7 @@ protected: void start_translation_timestep (); void process_music (); void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (rest); + void listen_rest (Stream_event *); }; void @@ -86,7 +85,6 @@ Completion_rest_engraver::initialize () is_first_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Completion_rest_engraver, rest); void Completion_rest_engraver::listen_rest (Stream_event *ev) { @@ -106,15 +104,15 @@ 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 (get_property ("measurePosition")); + Moment *l = unsmob (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 (get_property ("completionUnit")); if (unit) { @@ -153,7 +151,7 @@ Item * 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 (ev->get_property ("pitch"))) { int pos = p->steps (); SCM c0 = get_property ("middleCPosition"); @@ -185,25 +183,24 @@ Completion_rest_engraver::process_music () 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 (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 (); @@ -241,8 +238,6 @@ Completion_rest_engraver::process_music () void Completion_rest_engraver::stop_translation_timestep () { - if (rests_.size ()) - prev_rests_ = rests_; rests_.clear (); } @@ -253,14 +248,20 @@ Completion_rest_engraver::start_translation_timestep () 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, @@ -272,6 +273,7 @@ ADD_TRANSLATOR (Completion_rest_engraver, "Rest ", /* read */ + "completionFactor " "completionUnit " "middleCPosition " "measurePosition "