]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/completion-note-heads-engraver.cc
* VERSION (MY_PATCH_LEVEL): make 1.7.0
[lilypond.git] / lily / completion-note-heads-engraver.cc
index 23748de4ac0c48ae33d9eabbedcadbeb33f4fa5c..ca90b3d5db56156c7c90032625bef99329a8d05a 100644 (file)
 
 class Completion_heads_engraver : public Engraver
 {
-  Link_array<Item> note_p_arr_;
+  Link_array<Item> notes_;
   
-  Link_array<Item> dot_p_arr_;
-  Link_array<Music> note_req_l_arr_;
+  Link_array<Item> dots_;
+  Link_array<Music> note_reqs_;
   Link_array<Music> scratch_note_reqs_;
 
   Moment note_end_mom_;
   bool first_b_;
   Rational left_to_do_;
-
+  Rational do_nothing_until_;
+  
   Moment next_barline_moment ();
   Duration find_nearest_duration (Rational length);
   
@@ -53,7 +54,7 @@ public:
 protected:
   virtual void initialize ();
   virtual void start_translation_timestep ();
-  virtual bool try_music (Music *req_l) ;
+  virtual bool try_music (Music *req) ;
   virtual void process_music ();
   virtual void stop_translation_timestep ();
 };
@@ -69,7 +70,7 @@ Completion_heads_engraver::try_music (Music *m)
 {
   if (Note_req * n =dynamic_cast <Note_req *> (m))
     {
-      note_req_l_arr_.push (n);
+      note_reqs_.push (n);
 
       first_b_ = true;
       Moment musiclen = m->length_mom ();
@@ -81,17 +82,22 @@ Completion_heads_engraver::try_music (Music *m)
          musiclen.main_part_ = Rational (0,1);
        }
       note_end_mom_  = note_end_mom_ >? (now + musiclen);
+      do_nothing_until_ = Rational (0,0);
+      
       return true;
     }
   else if (dynamic_cast<Busy_playing_req*> (m))
     {
-      return note_req_l_arr_.size ();
+      return note_reqs_.size ();
     }
   
   return false;
   
 }
 
+/*
+  The duration _until_ the next barline.
+ */
 Moment
 Completion_heads_engraver::next_barline_moment ( )
 {
@@ -146,8 +152,12 @@ Completion_heads_engraver::process_music ()
 {
   if (!first_b_ && !left_to_do_)
     return ;
-
+  
   first_b_ = false;
+
+  Moment now =  now_mom ();
+  if (do_nothing_until_ > now.main_part_)
+    return ;
   
   Duration note_dur;
   Duration *orig = 0;
@@ -157,18 +167,18 @@ Completion_heads_engraver::process_music ()
     }
   else
     {
-      orig = unsmob_duration (note_req_l_arr_[0]->get_mus_property ("duration"));
+      orig = unsmob_duration (note_reqs_[0]->get_mus_property ("duration"));
       note_dur = *orig;
     }
-
   Moment nb = next_barline_moment ();
   if (nb < note_dur.length_mom ())
     {
       note_dur = find_nearest_duration (nb.main_part_);
 
-      Moment next = now_mom();
+      Moment next = now;
       next.main_part_ += note_dur.length_mom ();
       top_engraver ()->add_moment_to_process (next);
+      do_nothing_until_ = next.main_part_;
     }
 
   if (orig)
@@ -179,40 +189,36 @@ Completion_heads_engraver::process_music ()
   if (orig && note_dur.length_mom() != orig->length_mom())
     {
       if (!scratch_note_reqs_.size ())
-       for (int i = 0; i < note_req_l_arr_.size (); i++)
+       for (int i = 0; i < note_reqs_.size (); i++)
          {
-           Music * m = note_req_l_arr_[i]->clone ();
+           Music * m = note_reqs_[i]->clone ();
            scratch_note_reqs_.push (m);
          }
-
-      for (int i =0; i < scratch_note_reqs_.size (); i++)
-       scratch_note_reqs_[i]->set_mus_property ("duration", note_dur.smobbed_copy ());
     }
 
   
   for (int i = 0;
-       left_to_do_ && i < note_req_l_arr_.size (); i++)
+       left_to_do_ && i < note_reqs_.size (); i++)
     {
-      Item *note_p  = new Item (get_property ("NoteHead"));
-      
-      Staff_symbol_referencer::set_interface (note_p);
+      Item *note  = new Item (get_property ("NoteHead"));
       
-      Music * req =  note_req_l_arr_[i];
+      Music * req =  note_reqs_[i];
       if (scratch_note_reqs_.size())
        {
          req = scratch_note_reqs_[i];
-         SCM pits = note_req_l_arr_[i]->get_mus_property ("pitch");
+         SCM pits = note_reqs_[i]->get_mus_property ("pitch");
          req->set_mus_property ("pitch",pits);
        }
-
-      note_p->set_grob_property ("duration-log",
+      
+      req->set_mus_property ("duration", note_dur.smobbed_copy ());
+      note->set_grob_property ("duration-log",
                                 gh_int2scm (note_dur.duration_log ()));
       
       int dots= note_dur.dot_count ();
       if (dots)
        {
          Item * d = new Item (get_property ("Dots"));
-         Rhythmic_head::set_dots (note_p, d);
+         Rhythmic_head::set_dots (note, d);
 
          /*
           measly attempt to save an eeny-weenie bit of memory.
@@ -220,9 +226,9 @@ Completion_heads_engraver::process_music ()
          if (dots != gh_scm2int (d->get_grob_property ("dot-count")))
            d->set_grob_property ("dot-count", gh_int2scm (dots));
 
-         d->set_parent (note_p, Y_AXIS);
+         d->set_parent (note, Y_AXIS);
          announce_grob (d, SCM_EOL);
-         dot_p_arr_.push (d);
+         dots_.push (d);
        }
 
       Pitch *pit =unsmob_pitch (req->get_mus_property ("pitch"));
@@ -232,18 +238,9 @@ Completion_heads_engraver::process_music ()
       if (gh_number_p (c0))
        pos += gh_scm2int (c0);
 
-      note_p->set_grob_property ("staff-position",   gh_int2scm (pos));
-      if (to_boolean (get_property ("easyPlay")))
-       {
-         char s[2] = "a";
-         s[0] = (pit->notename_i_ + 2)%7 + 'a';
-
-         s[0] = toupper (s[0]);
-         note_p->set_grob_property ("note-character", ly_str02scm (s));
-       }
-      
-      announce_grob (note_p,req->self_scm ());
-      note_p_arr_.push (note_p);
+      note->set_grob_property ("staff-position",   gh_int2scm (pos));
+      announce_grob (note,req->self_scm ());
+      notes_.push (note);
     }
 
   left_to_do_ -= note_dur.length_mom ();
@@ -263,17 +260,17 @@ Completion_heads_engraver::process_music ()
 void
 Completion_heads_engraver::stop_translation_timestep ()
 {
-  for (int i=0; i < note_p_arr_.size (); i++)
+  for (int i=0; i < notes_.size (); i++)
     {
-      typeset_grob (note_p_arr_[i]);
+      typeset_grob (notes_[i]);
     }
-  note_p_arr_.clear ();
+  notes_.clear ();
   
-  for (int i=0; i < dot_p_arr_.size (); i++)
+  for (int i=0; i < dots_.size (); i++)
     {
-      typeset_grob (dot_p_arr_[i]);
+      typeset_grob (dots_[i]);
     }
-  dot_p_arr_.clear ();
+  dots_.clear ();
 
   for (int i = scratch_note_reqs_.size(); i--;)
     {
@@ -291,7 +288,7 @@ Completion_heads_engraver::start_translation_timestep ()
   Moment now = now_mom ();
   if (note_end_mom_.main_part_ <= now.main_part_)
     {
-      note_req_l_arr_.clear ();
+      note_reqs_.clear ();
     }
 
   if (left_to_do_)
@@ -299,7 +296,7 @@ Completion_heads_engraver::start_translation_timestep ()
       if (!tie_req)
        tie_req = new Tie_req;
       
-      bool succ = daddy_trans_l_->try_music (tie_req);
+      bool succ = daddy_trans_->try_music (tie_req);
       if (!succ)
        {
          programming_error ("Completion_heads_engraver: no-one to make tie.");
@@ -317,5 +314,5 @@ ENTER_DESCRIPTION(Completion_heads_engraver,
 break long notes and automatically tie them into the next measure.",
 /* creats*/       "NoteHead Dots",
 /* acks  */       "",
-/* reads */       "easyPlay centralCPosition measurePosition measureLength",
+/* reads */       "centralCPosition measurePosition measureLength",
 /* write */       "");