]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/completion-note-heads-engraver.cc
Run grand replace for 2015.
[lilypond.git] / lily / completion-note-heads-engraver.cc
index b606ab4e2b4ec6019cd504c1b96d58cf6a2462e0..677ede56a6558b91dc76d06bd3462362314d144f 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>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -59,8 +59,6 @@ class Completion_heads_engraver : public Engraver
   vector<Item *> notes_;
   vector<Item *> prev_notes_;
   // Must remember notes for explicit ties.
-  vector<Item *> tie_note_candidates_;
-  vector<Stream_event *> tie_note_candidate_events_;
   vector<Grob *> ties_;
   vector<Stream_event *> note_events_;
   Spanner *tie_column_;
@@ -111,15 +109,21 @@ Completion_heads_engraver::listen_note (Stream_event *ev)
 Moment
 Completion_heads_engraver::next_moment (Rational const &note_len)
 {
-  Moment *e = unsmob_moment (get_property ("measurePosition"));
-  Moment *l = unsmob_moment (get_property ("measureLength"));
+  Moment *e = Moment::unsmob (get_property ("measurePosition"));
+  Moment *l = Moment::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"));
+  if (result < 0)
+    {
+      programming_error ("invalid measure position: "
+                         + e->to_string () + " of " + l->to_string ());
+      return 0;
+    }
+  Moment const *unit = Moment::unsmob (get_property ("completionUnit"));
 
   if (unit)
     {
@@ -158,7 +162,7 @@ Item *
 Completion_heads_engraver::make_note_head (Stream_event *ev)
 {
   Item *note = make_item ("NoteHead", ev->self_scm ());
-  Pitch *pit = unsmob_pitch (ev->get_property ("pitch"));
+  Pitch *pit = Pitch::unsmob (ev->get_property ("pitch"));
 
   int pos = pit->steps ();
   SCM c0 = get_property ("middleCPosition");
@@ -190,25 +194,24 @@ Completion_heads_engraver::process_music ()
         note that note_dur may be strictly less than left_to_do_
         (say, if left_to_do_ == 5/8)
       */
-      if (factor_.denominator () == 1 && factor_ > Rational (1, 1))
-        note_dur = Duration (left_to_do_, false);
-      else
-        note_dur = Duration (left_to_do_ / factor_, false).compressed (factor_);
+      note_dur = Duration (left_to_do_ / factor_, false).compressed (factor_);
     }
   else
     {
-      orig = unsmob_duration (note_events_[0]->get_property ("duration"));
+      orig = Duration::unsmob (note_events_[0]->get_property ("duration"));
       note_dur = *orig;
-      factor_ = note_dur.factor ();
+      SCM factor = get_property ("completionFactor");
+      if (ly_is_procedure (factor))
+        factor = scm_call_2 (factor,
+                             context ()->self_scm (),
+                             note_dur.smobbed_copy ());
+      factor_ = robust_scm2rational (factor, note_dur.factor ());
       left_to_do_ = orig->get_length ();
     }
   Moment nb = next_moment (note_dur.get_length ());
   if (nb.main_part_ && nb < note_dur.get_length ())
     {
-      if (factor_.denominator () == 1 && factor_.numerator () > 1)
-        note_dur = Duration (nb.main_part_, false);
-      else
-        note_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_);
+      note_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_);
     }
 
   do_nothing_until_ = now.main_part_ + note_dur.get_length ();
@@ -271,6 +274,7 @@ Completion_heads_engraver::make_tie (Grob *left, Grob *right)
   Grob *p = make_spanner ("Tie", SCM_EOL);
   Tie::set_head (p, LEFT, left);
   Tie::set_head (p, RIGHT, right);
+  announce_end_grob (p, SCM_EOL);
   ties_.push_back (p);
 }
 
@@ -291,9 +295,6 @@ Completion_heads_engraver::start_translation_timestep ()
   Moment now = now_mom ();
   if (note_end_mom_.main_part_ <= now.main_part_)
     {
-      tie_note_candidate_events_ = note_events_;
-      tie_note_candidates_ = prev_notes_;
-
       note_events_.clear ();
       prev_notes_.clear ();
     }
@@ -318,6 +319,7 @@ ADD_TRANSLATOR (Completion_heads_engraver,
                 "TieColumn ",
 
                 /* read */
+                "completionFactor "
                 "completionUnit "
                 "measureLength "
                 "measurePosition "