]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/music.cc
Release: bump Welcome versions.
[lilypond.git] / lily / music.cc
index 613b5387ff772989ad19adf62b0338c89ba33553..ae75ff795273da024d404a76d144f10da52613bd 100644 (file)
@@ -28,6 +28,7 @@
 #include "music-sequence.hh"
 #include "score.hh"
 #include "warn.hh"
+#include "lily-imports.hh"
 
 /*
   Music is anything that has (possibly zero) duration and supports
@@ -44,12 +45,15 @@ Music::internal_is_music_type (SCM k) const
   return scm_is_true (scm_c_memq (k, ifs));
 }
 
-Music::Music (SCM init)
-  : Prob (ly_symbol2scm ("Music"), init)
+Preinit_Music::Preinit_Music ()
 {
   length_callback_ = SCM_EOL;
   start_callback_ = SCM_EOL;
+}
 
+Music::Music (SCM init)
+  : Prob (ly_symbol2scm ("Music"), init)
+{
   length_callback_ = get_property ("length-callback");
   if (!ly_is_procedure (length_callback_))
     length_callback_ = duration_length_callback_proc;
@@ -67,7 +71,7 @@ Music::derived_mark () const
 SCM
 Music::copy_mutable_properties () const
 {
-  return ly_music_deep_copy (mutable_property_alist_);
+  return music_deep_copy (mutable_property_alist_);
 }
 
 void
@@ -197,10 +201,14 @@ Music::compress (Moment factor)
 /*
   This mutates alist.  Hence, make sure that it is not shared
 */
+
 void
-transpose_mutable (SCM alist, Pitch delta)
+Prob::transpose (Pitch delta)
 {
-  for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s))
+  if (to_boolean (get_property ("untransposable")))
+    return;
+
+  for (SCM s = mutable_property_alist_; scm_is_pair (s); s = scm_cdr (s))
     {
       SCM entry = scm_car (s);
       SCM prop = scm_car (entry);
@@ -219,7 +227,7 @@ transpose_mutable (SCM alist, Pitch delta)
         }
       else if (scm_is_eq (prop, ly_symbol2scm ("element")))
         {
-          if (Music *m = unsmob<Music> (val))
+          if (Prob *m = unsmob<Prob> (val))
             m->transpose (delta);
         }
       else if (scm_is_eq (prop, ly_symbol2scm ("elements"))
@@ -229,20 +237,11 @@ transpose_mutable (SCM alist, Pitch delta)
                && scm_is_pair (val))
         new_val = ly_transpose_key_alist (val, delta.smobbed_copy ());
 
-      if (val != new_val)
+      if (!scm_is_eq (val, new_val))
         scm_set_cdr_x (entry, new_val);
     }
 }
 
-void
-Music::transpose (Pitch delta)
-{
-  if (to_boolean (get_property ("untransposable")))
-    return;
-
-  transpose_mutable (mutable_property_alist_, delta);
-}
-
 void
 Music::set_spot (Input ip)
 {
@@ -269,7 +268,7 @@ Music::to_event () const
     programming_error ("Not a music type");
 
   Stream_event *e = new Stream_event
-    (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), class_name),
+    (Lily::ly_make_event_class (class_name),
      mutable_property_alist_);
   Moment length = get_length ();
   if (length.to_bool ())
@@ -308,8 +307,7 @@ Music::send_to_context (Context *c)
 Music *
 make_music_by_name (SCM sym)
 {
-  SCM make_music_proc = ly_lily_module_constant ("make-music");
-  SCM rv = scm_call_1 (make_music_proc, sym);
+  SCM rv = Lily::make_music (sym);
 
   /* UGH. */
   Music *m = unsmob<Music> (rv);
@@ -329,3 +327,40 @@ Music::duration_length_callback (SCM m)
     mom = d->get_length ();
   return mom.smobbed_copy ();
 }
+
+SCM
+music_deep_copy (SCM m)
+{
+  if (Music *mus = unsmob<Music> (m))
+      return mus->clone ()->unprotect ();
+  if (scm_is_pair (m))
+    {
+      SCM copy = SCM_EOL;
+      do
+        {
+          copy = scm_cons (music_deep_copy (scm_car (m)), copy);
+          m = scm_cdr (m);
+        }
+      while (scm_is_pair (m));
+      // Oh, come on, GUILE.  Why do you require the second argument
+      // of scm_reverse_x to be a proper list?  That makes no sense.
+      // return scm_reverse_x (copy, music_deep_copy (m));
+      SCM last_cons = copy;
+      copy = scm_reverse_x (copy, SCM_EOL);
+      scm_set_cdr_x (last_cons, music_deep_copy (m));
+      return copy;
+    }
+  return m;
+}
+
+void
+set_origin (SCM m, SCM origin)
+{
+  while (scm_is_pair (m))
+    {
+      set_origin (scm_car (m), origin);
+      m = scm_cdr (m);
+    }
+  if (Music *mus = unsmob<Music> (m))
+    mus->set_property ("origin", origin);
+}