]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/music.cc
* The grand 2005-2006 replace.
[lilypond.git] / lily / music.cc
index 12066fe04aa67ed9271bc7adf1685a41a83e540c..fddd57fd0a18010235af349c32fe12eb37d5a6da 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "music.hh"
@@ -36,13 +36,9 @@ Music::name () const
 {
   SCM nm = get_property ("name");
   if (scm_is_symbol (nm))
-    {
-      return ly_symbol2string (nm);
-    }
+    return ly_symbol2string (nm);
   else
-    {
-      return classname (this);
-    }
+    return "Music";
 }
 
 Music::Music (SCM init)
@@ -53,6 +49,9 @@ Music::Music (SCM init)
   smobify_self ();
 
   length_callback_ = get_property ("length-callback");
+  if (!ly_is_procedure (length_callback_))
+    length_callback_ = duration_length_callback_proc;
+
   start_callback_ = get_property ("start-callback");
 }
 
@@ -76,8 +75,6 @@ Music::~Music ()
 {
 }
 
-ADD_MUSIC (Music);
-
 SCM
 Music::get_property_alist (bool m) const
 {
@@ -89,8 +86,7 @@ Music::mark_smob (SCM m)
 {
   Music *mus = (Music *) SCM_CELL_WORD_1 (m);
   scm_gc_mark (mus->immutable_property_alist_);
-  scm_gc_mark (mus->mutable_property_alist_);
-  return SCM_EOL;
+  return mus->mutable_property_alist_;
 }
 
 Moment
@@ -100,7 +96,7 @@ Music::get_length () const
   if (unsmob_moment (lst))
     return *unsmob_moment (lst);
 
-  if (ly_c_procedure_p (length_callback_))
+  if (ly_is_procedure (length_callback_))
     {
       SCM res = scm_call_1 (length_callback_, self_scm ());
       return *unsmob_moment (res);
@@ -112,8 +108,8 @@ Music::get_length () const
 Moment
 Music::start_mom () const
 {
-  SCM lst = get_property ("start-callback");
-  if (ly_c_procedure_p (lst))
+  SCM lst = start_callback_;
+  if (ly_is_procedure (lst))
     {
       SCM res = scm_call_1 (lst, self_scm ());
       return *unsmob_moment (res);
@@ -146,7 +142,7 @@ Music::print_smob (SCM s, SCM p, scm_print_state*)
   if (scm_is_symbol (nm) || scm_is_string (nm))
     scm_display (nm, p);
   else
-    scm_puts (classname (m), p);
+    scm_puts ("Music", p);
 
   /* Printing properties takes a lot of time, especially during backtraces.
      For inspecting, it is better to explicitly use an inspection
@@ -195,7 +191,7 @@ Pitch
 Music::to_relative_octave (Pitch last)
 {
   SCM callback = get_property ("to-relative-callback");
-  if (ly_c_procedure_p (callback))
+  if (ly_is_procedure (callback))
     {
       Pitch *p = unsmob_pitch (scm_call_2 (callback, self_scm (), last.smobbed_copy ()));
       return *p;
@@ -236,7 +232,7 @@ Music::transpose (Pitch delta)
 
          if (abs (transposed.get_alteration ()) > DOUBLE_SHARP)
            {
-             warning (_f ("Transposition by %s makes alteration larger than double",
+             warning (_f ("transposition by %s makes alteration larger than double",
                           delta.to_string ()));
            }
        }
@@ -254,9 +250,7 @@ Music::transpose (Pitch delta)
   */
   SCM pa = get_property ("pitch-alist");
   if (scm_is_pair (pa))
-    {
-      set_property ("pitch-alist", ly_transpose_key_alist (pa, delta.smobbed_copy ()));
-    }
+    set_property ("pitch-alist", ly_transpose_key_alist (pa, delta.smobbed_copy ()));
 }
 
 IMPLEMENT_TYPE_P (Music, "ly:music?");
@@ -274,6 +268,18 @@ Music::internal_get_property (SCM sym) const
   return (s == SCM_BOOL_F) ? SCM_EOL : scm_cdr (s);
 }
 
+SCM
+Music::internal_get_object (SCM s) const
+{
+  return internal_get_property (s);
+}
+
+void
+Music::internal_set_object (SCM s, SCM v)
+{
+  return internal_set_property (s, v);
+}
+
 void
 Music::internal_set_property (SCM s, SCM v)
 {
@@ -297,14 +303,6 @@ Music::origin () const
   return ip ? ip : &dummy_input_global;
 }
 
-int
-Music::duration_log () const
-{
-  if (is_mus_type ("rhythmic-event"))
-    return unsmob_duration (get_property ("duration"))->duration_log ();
-  return 0;
-}
-
 Music *
 make_music_by_name (SCM sym)
 {
@@ -312,6 +310,20 @@ make_music_by_name (SCM sym)
   SCM rv = scm_call_1 (make_music_proc, sym);
 
   /* UGH. */
-  scm_gc_protect_object (rv);
-  return unsmob_music (rv);
+  Music *m = unsmob_music (rv);
+  m->protect ();
+  return m;
+}
+
+MAKE_SCHEME_CALLBACK (Music, duration_length_callback, 1);
+SCM
+Music::duration_length_callback (SCM m)
+{
+  Music *me = unsmob_music (m);
+  Duration *d = unsmob_duration (me->get_property ("duration"));
+
+  Moment mom;
+  if (d)
+    mom = d->get_length ();
+  return mom.smobbed_copy ();
 }