]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/repeated-music.cc
patch::: 1.3.130.jcn1
[lilypond.git] / lily / repeated-music.cc
index fec8d7be73845d6da7907e3e6652bcebd16a489a..5785e114cff6742a68141c84b4c1efce2cf4b8d0 100644 (file)
@@ -24,29 +24,12 @@ Repeated_music::alternatives ()const
   return dynamic_cast<Music_sequence*>  (unsmob_music (get_mus_property ("alternatives")));
 }
 
-Repeated_music::Repeated_music(Music *beg, int times, Music_sequence * alts)
+Repeated_music::Repeated_music(SCM l)
+  : Music (l)
 {
-  if (beg)
-    {
-      set_mus_property ("body", beg->self_scm ());
-      scm_unprotect_object (beg->self_scm ());
-    }
-  set_mus_property ("repeat-count", gh_int2scm (times));
-
-  if (alts)
-    {
-      alts->truncate (times);
-      set_mus_property ("alternatives", alts->self_scm ());
-      scm_unprotect_object (alts->self_scm ());  
-    }
   set_mus_property ("type", ly_symbol2scm ("repeated-music"));
 }
 
-Repeated_music::Repeated_music (Repeated_music const &s)
-  : Music (s)
-{
-}
-
 
 Pitch
 Repeated_music::to_relative_octave (Pitch p)
@@ -106,6 +89,26 @@ Repeated_music::alternatives_length_mom (bool fold) const
   return m;
 }
 
+/*
+  Sum all duration of all available alternatives. This is for the case
+  of volta repeats, where the alternatives are iterated just as they
+  were entered.  */
+Moment
+Repeated_music::alternatives_volta_length_mom () const
+{
+  if (!alternatives ())
+    return 0;
+
+  Moment m;
+  SCM p = alternatives ()->music_list ();
+  while (gh_pair_p (p))
+    {
+      m = m + unsmob_music (gh_car (p))->length_mom ();
+      p = gh_cdr (p);
+    }
+  return m;
+}
+
 Moment
 Repeated_music::body_length_mom () const
 {
@@ -150,6 +153,6 @@ SCM
 Repeated_music::volta_music_length (SCM m)
 {
   Repeated_music* r = dynamic_cast<Repeated_music*> (unsmob_music (m));
-  Moment l =  r->body_length_mom () + r->alternatives_length_mom (false);
+  Moment l =  r->body_length_mom () + r->alternatives_volta_length_mom ();
   return l.smobbed_copy ();
 }