]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/sequential-music-iterator.cc
''
[lilypond.git] / lily / sequential-music-iterator.cc
index 5d8ce337de7cbd604b3c928fa350c2e826aa022a..61cf029270af6e2f81748408fdf42ecdb36613ce 100644 (file)
@@ -3,19 +3,18 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 #include "translator-group.hh"
 #include "debug.hh"
 #include "sequential-music-iterator.hh"
 #include "music-list.hh"
-#include "request-chord-iterator.hh"
 
 
 /*
   
-  TODO: handling of grace notes is excuisite pain.  This handling
+  TODO: handling of grace notes is exquisite pain.  This handling
   should be formally specified and then the implementation verified.
 
 */
@@ -39,7 +38,7 @@
 
 
   if (gh_pair_p (cursor_))
-    iter_p_->music_l_ == unsmob_music (gh_car (cursor_))
+    iter_p_->music_l_ == unsmob_music (ly_car (cursor_))
   else
     iter_p_ == 0;
 
@@ -94,11 +93,11 @@ get_grace_fixups (SCM cursor)
   Grace_fixup *head = 0;
   Grace_fixup **tail = &head;
 
-  for (; gh_pair_p (cursor); cursor = gh_cdr (cursor))
+  for (; gh_pair_p (cursor); cursor = ly_cdr (cursor))
     {
-      Music * mus = unsmob_music (gh_car (cursor));
-      Moment l =mus->length_mom ();
+      Music * mus = unsmob_music (ly_car (cursor));
       Moment s = mus->start_mom ();
+      Moment l =mus->length_mom () - s;
 
       if (s.grace_part_)
        {
@@ -130,7 +129,7 @@ Sequential_music_iterator::construct_children ()
 {
   cursor_ = dynamic_cast<Music_sequence const*> (music_l ())->music_list ();
 
-  iter_p_ = gh_pair_p (cursor_) ?  get_iterator_p (unsmob_music (gh_car (cursor_))) : 0;
+  iter_p_ = gh_pair_p (cursor_) ?  get_iterator_p (unsmob_music (ly_car (cursor_))) : 0;
   while (iter_p_ && !iter_p_->ok ())
     {
       next_element ();
@@ -154,7 +153,7 @@ Sequential_music_iterator::construct_children ()
 void
 Sequential_music_iterator::next_element ()
 {
-  Moment len =iter_p_->music_length_mom ();
+  Moment len =iter_p_->music_length_mom () - iter_p_->music_start_mom ();
   assert (!grace_fixups_  || grace_fixups_->start_ >= here_mom_);
   
   if (len.main_part_ && grace_fixups_ &&
@@ -184,10 +183,10 @@ Sequential_music_iterator::next_element ()
     }
   
   delete iter_p_;
-  cursor_ = gh_cdr (cursor_);
+  cursor_ = ly_cdr (cursor_);
 
   if (gh_pair_p (cursor_))
-    iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_)));
+    iter_p_ = get_iterator_p (unsmob_music (ly_car (cursor_)));
   else
     iter_p_ = 0;
 }
@@ -244,9 +243,11 @@ Sequential_music_iterator::get_music (Moment until)const
       s = gh_append2 (nm, s);
       
       Moment m = 0;
-      for (SCM i = nm; gh_pair_p (i); i = gh_cdr (i))
-       m = m >? unsmob_music (gh_car (i))->length_mom ();
-
+      for (SCM i = nm; gh_pair_p (i); i = ly_cdr (i))
+       {
+         Music *mus=unsmob_music (ly_car (i));
+         m = m >? (mus->length_mom () - mus->start_mom ());
+       }
       if (m > Moment (0))
        break ;
       else
@@ -256,10 +257,13 @@ Sequential_music_iterator::get_music (Moment until)const
   
   return s;
 }
+
+
 /*
   Skip events till UNTIL. We don't do any other side effects such as
   descending to child iterator contexts, because they might depend on
   \context specs and \translator changes being executed
+
   TODO: build support for grace notes here.
  */
 void
@@ -291,9 +295,7 @@ Sequential_music_iterator::process (Moment until)
          /*
            do the stuff/note/rest preceding a grace.
           */
-         iter_p_->process (iter_p_->music_length_mom ()+ 
-                           iter_p_->music_start_mom ());
-
+         iter_p_->process (iter_p_->music_length_mom ());
        }
       else
        iter_p_->process (until - here_mom_ + iter_p_->music_start_mom ());