]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/completion-note-heads-engraver.cc
Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / completion-note-heads-engraver.cc
index ede37181b9b84485566242f8c8966689053604ce..cb4471528623ed66c9a7ce5ded3c4b708a533fc9 100644 (file)
@@ -1,25 +1,28 @@
 /*
   completion-note-heads-engraver.cc -- Completion_heads_engraver
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cctype>
+using namespace std;
 
-#include "rhythmic-head.hh"
-#include "output-def.hh"
-#include "music.hh"
-#include "dots.hh"
 #include "dot-column.hh"
-#include "staff-symbol-referencer.hh"
+#include "dots.hh"
+#include "duration.hh"
+#include "global-context.hh"
 #include "item.hh"
+#include "output-def.hh"
+#include "pitch.hh"
+#include "rhythmic-head.hh"
 #include "score-engraver.hh"
-#include "warn.hh"
 #include "spanner.hh"
+#include "staff-symbol-referencer.hh"
+#include "stream-event.hh"
 #include "tie.hh"
-#include "global-context.hh"
-#include "duration.hh"
-#include "pitch.hh"
+#include "warn.hh"
+
+#include "translator.icc"
 
 /*
   TODO: make matching rest engraver.
 
 class Completion_heads_engraver : public Engraver
 {
-  Link_array<Item> notes_;
-  Link_array<Item> prev_notes_;
-  Link_array<Grob> ties_;
+  vector<Item*> notes_;
+  vector<Item*> prev_notes_;
+  vector<Grob*> ties_;
 
-  Link_array<Item> dots_;
-  Link_array<Music> note_events_;
-  Link_array<Music> scratch_note_events_;
+  vector<Item*> dots_;
+  vector<Stream_event*> note_events_;
+  vector<Stream_event*> scratch_note_events_;
 
   Moment note_end_mom_;
   bool is_first_;
@@ -64,9 +67,9 @@ public:
 protected:
   virtual void initialize ();
   void start_translation_timestep ();
-  virtual bool try_music (Music *event);
   void process_music ();
   void stop_translation_timestep ();
+  DECLARE_TRANSLATOR_LISTENER (note);
 };
 
 void
@@ -75,31 +78,24 @@ Completion_heads_engraver::initialize ()
   is_first_ = false;
 }
 
-bool
-Completion_heads_engraver::try_music (Music *m)
+IMPLEMENT_TRANSLATOR_LISTENER (Completion_heads_engraver, note);
+void
+Completion_heads_engraver::listen_note (Stream_event *ev)
 {
-  if (m->is_mus_type ("note-event"))
-    {
-      note_events_.push (m);
-
-      is_first_ = true;
-      Moment musiclen = m->get_length ();
-      Moment now = now_mom ();
-
-      if (now_mom ().grace_part_)
-       {
-         musiclen.grace_part_ = musiclen.main_part_;
-         musiclen.main_part_ = Rational (0, 1);
-       }
-      note_end_mom_ = max (note_end_mom_, (now + musiclen));
-      do_nothing_until_ = Rational (0, 0);
+  note_events_.push_back (ev);
+  
+  is_first_ = true;
+  Moment musiclen = get_event_length (ev);
+  Moment now = now_mom ();
 
-      return true;
+  if (now_mom ().grace_part_)
+    {
+      musiclen.grace_part_ = musiclen.main_part_;
+      musiclen.main_part_ = Rational (0, 1);
     }
-  else if (m->is_mus_type ("busy-playing-event"))
-    return note_events_.size () && is_first_;
 
-  return false;
+  note_end_mom_ = max (note_end_mom_, (now + musiclen));
+  do_nothing_until_ = Rational (0, 0);
 }
 
 /*
@@ -191,17 +187,24 @@ Completion_heads_engraver::process_music ()
   if (orig && note_dur.get_length () != orig->get_length ())
     {
       if (!scratch_note_events_.size ())
-       for (int i = 0; i < note_events_.size (); i++)
+       for (vsize i = 0; i < note_events_.size (); i++)
          {
-           Music *m = note_events_[i]->clone ();
-           scratch_note_events_.push (m);
+           Stream_event *m = note_events_[i]->clone ();
+           scratch_note_events_.push_back (m);
          }
     }
-
-  for (int i = 0;
-       left_to_do_ && i < note_events_.size (); i++)
+  else
+    {
+      for (vsize i = 0; i < note_events_.size (); i++)
+       {
+         Stream_event *c =  note_events_[i]->clone ();
+         scratch_note_events_.push_back (c);
+       }
+    }
+  
+  for (vsize i = 0; left_to_do_ && i < note_events_.size (); i++)
     {
-      Music *event = note_events_[i];
+      Stream_event *event = note_events_[i];
       if (scratch_note_events_.size ())
        {
          event = scratch_note_events_[i];
@@ -221,14 +224,10 @@ Completion_heads_engraver::process_music ()
          Item *d = make_item ("Dots", SCM_EOL);
          Rhythmic_head::set_dots (note, d);
 
-         /*
-           measly attempt to save an eeny-weenie bit of memory.
-         */
-         if (dots != scm_to_int (d->get_property ("dot-count")))
-           d->set_property ("dot-count", scm_from_int (dots));
+         d->set_property ("dot-count", scm_from_int (dots));
 
          d->set_parent (note, Y_AXIS);
-         dots_.push (d);
+         dots_.push_back (d);
        }
 
       Pitch *pit = unsmob_pitch (event->get_property ("pitch"));
@@ -239,18 +238,18 @@ Completion_heads_engraver::process_music ()
        pos += scm_to_int (c0);
 
       note->set_property ("staff-position", scm_from_int (pos));
-      notes_.push (note);
+      notes_.push_back (note);
     }
 
   if (prev_notes_.size () == notes_.size ())
     {
-      for (int i = 0; i < notes_.size (); i++)
+      for (vsize i = 0; i < notes_.size (); i++)
        {
          Grob *p = make_spanner ("Tie", SCM_EOL);
          Tie::set_head (p, LEFT, prev_notes_[i]);
          Tie::set_head (p, RIGHT, notes_[i]);
 
-         ties_.push (p);
+         ties_.push_back (p);
        }
     }
 
@@ -275,7 +274,7 @@ Completion_heads_engraver::stop_translation_timestep ()
 
   dots_.clear ();
 
-  for (int i = scratch_note_events_.size (); i--;)
+  for (vsize i = scratch_note_events_.size (); i--;)
     scratch_note_events_[i]->unprotect ();
 
   scratch_note_events_.clear ();
@@ -296,13 +295,17 @@ Completion_heads_engraver::Completion_heads_engraver ()
 {
 }
 
-#include "translator.icc"
-
 ADD_TRANSLATOR (Completion_heads_engraver,
                /* doc */ "This engraver replaces "
                "@code{Note_heads_engraver}. It plays some trickery to "
                "break long notes and automatically tie them into the next measure.",
-               /* create */ "NoteHead Dots Tie",
-               /* accept */ "busy-playing-event note-event",
-               /* read */ "middleCPosition measurePosition measureLength",
+               /* create */
+               "NoteHead "
+               "Dots "
+               "Tie",
+               /* read */
+               "middleCPosition "
+               "measurePosition "
+               "measureLength",
+
                /* write */ "");