]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/music.cc
* lily/context.cc (where_defined): also assign value in
[lilypond.git] / lily / music.cc
index 2c631d25d172ebb9382eb3f7f1b763386fec2296..942e2dbc242af837c02e0be0bd20426e868627d7 100644 (file)
@@ -53,6 +53,11 @@ 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,7 +81,6 @@ Music::~Music ()
 {
 }
 
-ADD_MUSIC (Music);
 
 SCM
 Music::get_property_alist (bool m) const
@@ -89,8 +93,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 +103,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 +115,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);
@@ -195,7 +198,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;
@@ -274,6 +277,19 @@ 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,7 +313,6 @@ Music::origin () const
   return ip ? ip : &dummy_input_global;
 }
 
-
 Music *
 make_music_by_name (SCM sym)
 {
@@ -308,3 +323,19 @@ make_music_by_name (SCM sym)
   scm_gc_protect_object (rv);
   return unsmob_music (rv);
 }
+
+
+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 ();
+}