]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/music.cc
2003 -> 2004
[lilypond.git] / lily / music.cc
index 9c51464c1570b8402b5b37f290a3c8dab1005e05..fefeda054dbe86d8beeba3a5a3aaa94fab817a57 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 #include "main.hh"
 #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)
@@ -152,10 +129,19 @@ Music::print_smob (SCM s, SCM p, scm_print_state*)
 {
   scm_puts ("#<Music ", p);
   Music* m = unsmob_music (s);
-  scm_puts (classname (m),p);
 
+  SCM nm = m->get_mus_property ("name");
+  if (gh_symbol_p (nm) || gh_string_p (nm))
+    {
+      scm_display (nm, p);
+    }
+  else
+    {
+      scm_puts (classname (m),p);
+    }
+  
   /*
-    Printing these takes a lot of time, especially during backtraces.
+    Printing properties takes a lot of time, especially during backtraces.
     For inspecting, it is better to explicitly use an inspection
     function.
    */
@@ -165,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);
 }
 
 
@@ -199,8 +215,6 @@ Music::internal_set_mus_property (SCM s, SCM v)
   mutable_property_alist_ =  scm_assq_set_x (mutable_property_alist_, s, v);
 }
 
-
-
 #include "main.hh"
 
 void
@@ -222,8 +236,8 @@ Music::~Music ()
   
 }
 
-LY_DEFINE(ly_get_music_length,
-         "ly:get-music-length", 1, 0, 0,  (SCM mus),
+LY_DEFINE(ly_music_length,
+         "ly:music-length", 1, 0, 0,  (SCM mus),
          "Get the length (in musical time) of music expression @var{mus}.")
 {
   Music * sc = unsmob_music (mus);
@@ -233,7 +247,8 @@ 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");
@@ -326,6 +341,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;
 
 
@@ -343,3 +392,4 @@ make_music_by_name (SCM sym)
   scm_gc_protect_object (rv);
   return unsmob_music (rv);
 }
+