]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/music.cc
* Documentation/user/refman.itely: remove superfluous -'s
[lilypond.git] / lily / music.cc
index 3ca15dc9815631804528c0ba45b7ff1c8a01fbe0..7e6fe2b14fec55a2e17421c447b61111727d6eed 100644 (file)
 #include "pitch.hh"
 #include "ly-smobs.icc"
 
-SCM
-ly_deep_mus_copy (SCM m)
-{
-  if (unsmob_music (m))
-    {
-      SCM ss =  unsmob_music (m)->clone ()->self_scm ();
-      scm_gc_unprotect_object (ss);
-      return ss;
-    }
-  else if (gh_pair_p (m))
-    {
-      return gh_cons (ly_deep_mus_copy (ly_car (m)), ly_deep_mus_copy (ly_cdr (m)));
-    }
-  else
-    return m;
-}
+
+SCM ly_deep_mus_copy (SCM);
 
 bool
 Music::internal_is_music_type (SCM k)const
@@ -53,15 +39,6 @@ Music::name () const
     }
 }
 
-void
-Music::transpose (Pitch)
-{
-}
-
-void
-Music::compress (Moment)
-{
-}
 
 
 Music::Music (Music const &m)
@@ -174,9 +151,39 @@ Music::print_smob (SCM s, SCM p, scm_print_state*)
 }
 
 Pitch
-Music::to_relative_octave (Pitch m)
+Music::to_relative_octave (Pitch p)
 {
-  return m;
+  SCM elt = get_mus_property ("element");
+
+  if (Music* m = unsmob_music (elt))
+    p = m->to_relative_octave (p);
+
+  p = music_list_to_relative (get_mus_property ("elements"),
+                             p, false);
+  return p;
+}
+
+void
+Music::compress (Moment factor)
+{
+  SCM elt = get_mus_property ("element");
+
+  if (Music* m = unsmob_music (elt))
+    m->compress (factor);
+
+  compress_music_list (get_mus_property ("elements"), factor);
+}
+
+
+void
+Music::transpose (Pitch delta)
+{
+  SCM elt = get_mus_property ("element");
+
+  if (Music* m = unsmob_music (elt))
+    m->transpose (delta);
+
+  transpose_music_list (get_mus_property ("elements"), delta);
 }
 
 
@@ -242,7 +249,9 @@ LY_DEFINE(ly_get_music_length,
 
 LY_DEFINE(ly_get_mus_property,
          "ly:get-mus-property", 2, 0, 0,  (SCM mus, SCM sym),
-         "Get the property @var{sym} of music expression @var{mus}.")
+         "Get the property @var{sym} of music expression @var{mus}.\n"
+         "If @var{sym} is undefined, return @code{'()}.\n"
+         )
 {
   Music * sc = unsmob_music (mus);
   SCM_ASSERT_TYPE(sc, mus, SCM_ARG1, __FUNCTION__, "music");
@@ -335,6 +344,40 @@ LY_DEFINE(ly_music_list_p,"music-list?", 1, 0, 0,
 ADD_MUSIC(Music);
 
 
+
+LY_DEFINE(ly_deep_mus_copy,
+         "ly:music-deep-copy", 1,0,0, (SCM m),
+         "Copy @var{m} and all sub expressions of @var{m}")
+{
+  if (unsmob_music (m))
+    {
+      SCM ss =  unsmob_music (m)->clone ()->self_scm ();
+      scm_gc_unprotect_object (ss);
+      return ss;
+    }
+  else if (gh_pair_p (m))
+    {
+      return gh_cons (ly_deep_mus_copy (ly_car (m)), ly_deep_mus_copy (ly_cdr (m)));
+    }
+  else
+    return m;
+}
+
+LY_DEFINE(ly_music_transpose,
+         "ly:music-transpose", 2,0,0, (SCM m, SCM p),
+         "Transpose @var{m} such that central C is mapped to @var{p}. "
+"Return @var{m}.")
+{
+  Music * sc = unsmob_music (m);
+  Pitch * sp = unsmob_pitch (p);
+  SCM_ASSERT_TYPE(sc, m, SCM_ARG1, __FUNCTION__, "music");
+  SCM_ASSERT_TYPE(sp, p, SCM_ARG2, __FUNCTION__, "pitch");
+
+  sc->transpose (*sp);
+  return sc->self_scm();       // SCM_UNDEFINED ? 
+}
+
+
 SCM make_music_proc;