+ const char * nm = classname (m);
+ return scm_makfrom0str (nm);
+}
+
+
+
+// to do property args
+LY_DEFINE(ly_extended_make_music,
+ "ly:make-bare-music", 2, 0, 0, (SCM type, SCM props),
+ "Make a music object/expression of type @var{type}, init with\n"
+"@var{props}. Warning: this interface will likely change in the near\n"
+"future.\n"
+"\n"
+"Music is the data type that music expressions are stored in. The data\n"
+"type does not yet offer many manipulations.\n"
+"\n"
+"WARNING: only for internal use. Please use make-music-by-name. \n"
+)
+{
+ SCM_ASSERT_TYPE(gh_string_p (type), type, SCM_ARG1, __FUNCTION__, "string");
+
+ SCM s = make_music (ly_scm2string (type))->self_scm ();
+ unsmob_music (s)->immutable_property_alist_ = props;
+ scm_gc_unprotect_object (s);
+ return s;
+}
+
+// to do property args
+LY_DEFINE(ly_get_mutable_properties,
+ "ly:get-mutable-properties", 1, 0, 0, (SCM mus),
+"Return an alist signifying the mutable properties of @var{mus}.\n"
+"The immutable properties are not available; they should be initialized\n"
+"by the functions make-music-by-name function.\n"
+)
+{
+ Music *m = unsmob_music (mus);
+ SCM_ASSERT_TYPE(m, mus, SCM_ARG1, __FUNCTION__, "music");
+
+ return m->get_property_alist (true);
+}
+
+LY_DEFINE(ly_music_list_p,"music-list?", 1, 0, 0,
+ (SCM l),"Type predicate: return true if @var{l} is a list of music objects.")
+{
+ if (scm_list_p (l) != SCM_BOOL_T)
+ return SCM_BOOL_F;
+
+ while (gh_pair_p (l))
+ {
+ if (!unsmob_music (gh_car (l)))
+ return SCM_BOOL_F;
+ l =gh_cdr (l);
+ }
+ return SCM_BOOL_T;
+}
+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}")