+ Pitch *p = unsmob_pitch (get_mus_property ("pitch"));
+ if (!p)
+ return ;
+
+ Pitch np = *p;
+ np.transpose (delta);
+
+ if (abs (np.alteration_i_) > 2)
+ {
+ warning (_f ("Transposition by %s makes accidental larger than two",
+ delta.str ()));
+ }
+
+ set_mus_property ("pitch", np.smobbed_copy ());
+}
+
+IMPLEMENT_TYPE_P (Music, "music?");
+
+IMPLEMENT_SMOBS (Music);
+IMPLEMENT_DEFAULT_EQUAL_P (Music);
+
+/****************************/
+
+SCM
+Music::internal_get_mus_property (SCM sym) const
+{
+ SCM s = scm_sloppy_assq (sym, mutable_property_alist_);
+ if (s != SCM_BOOL_F)
+ return ly_cdr (s);
+
+ s = scm_sloppy_assq (sym, immutable_property_alist_);
+ return (s == SCM_BOOL_F) ? SCM_EOL : ly_cdr (s);
+}
+
+#if 0
+/*
+ Remove the value associated with KEY, and return it. The result is
+ that a next call will yield SCM_EOL (and not the underlying
+ `basic' property.
+*/
+SCM
+Music::remove_mus_property (const char* key)
+{
+ SCM val = get_mus_property (key);
+ if (val != SCM_EOL)
+ set_mus_property (key, SCM_EOL);
+ return val;
+}
+
+SCM
+Music::get_mus_property (const char *nm) const
+{
+ SCM sym = ly_symbol2scm (nm);
+ return get_mus_property (sym);
+}
+
+void
+Music::set_mus_property (const char* k, SCM v)
+{
+ SCM s = ly_symbol2scm (k);
+ set_mus_property (s, v);
+}
+
+void
+Music::set_immutable_mus_property (SCM s, SCM v)
+{
+ immutable_property_alist_ = gh_cons (gh_cons (s,v), mutable_property_alist_);
+ mutable_property_alist_ = scm_assq_remove_x (mutable_property_alist_, s);