]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/completion-rest-engraver.cc
Imported Upstream version 2.19.45
[lilypond.git] / lily / completion-rest-engraver.cc
index 61255226eac4eb53b385f1eadbde873507199bdd..2b5693916e96ee25e02d0d1ff9a4882e50b51b1d 100644 (file)
@@ -1,7 +1,7 @@
 /*
   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
@@ -76,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
@@ -85,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)
 {
@@ -105,15 +104,15 @@ Completion_rest_engraver::listen_rest (Stream_event *ev)
 Moment
 Completion_rest_engraver::next_moment (Rational const &note_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)
     {
@@ -152,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<Pitch> (ev->get_property ("pitch")))
     {
       int pos = p->steps ();
       SCM c0 = get_property ("middleCPosition");
@@ -184,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<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 ();
@@ -259,6 +257,12 @@ Completion_rest_engraver::Completion_rest_engraver ()
 {
 }
 
+void
+Completion_rest_engraver::boot ()
+{
+  ADD_LISTENER (Completion_rest_engraver, rest);
+}
+
 ADD_TRANSLATOR (Completion_rest_engraver,
                 /* doc */
                 "This engraver replaces @code{Rest_engraver}.  It plays"
@@ -268,6 +272,7 @@ ADD_TRANSLATOR (Completion_rest_engraver,
                 "Rest ",
 
                 /* read */
+                "completionFactor "
                 "completionUnit "
                 "middleCPosition "
                 "measurePosition "