X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusic.cc;h=bbf7fe4f585da5c8ed909088627346767bb1971d;hb=e7121831390ef4b0d09c1d509e1ccb0de2ea36a8;hp=a1accb9c3d4a8fb5485a5a06d4c832fa445eb898;hpb=652f454fae6ed31ced7f9c3ce22dbc5752460a8c;p=lilypond.git diff --git a/lily/music.cc b/lily/music.cc index a1accb9c3d..bbf7fe4f58 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -68,7 +68,7 @@ Music::derived_mark () const SCM Music::copy_mutable_properties () const { - return ly_music_deep_copy (mutable_property_alist_); + return music_deep_copy (mutable_property_alist_); } void @@ -198,10 +198,14 @@ Music::compress (Moment factor) /* This mutates alist. Hence, make sure that it is not shared */ + void -transpose_mutable (SCM alist, Pitch delta) +Prob::transpose (Pitch delta) { - for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s)) + if (to_boolean (get_property ("untransposable"))) + return; + + for (SCM s = mutable_property_alist_; scm_is_pair (s); s = scm_cdr (s)) { SCM entry = scm_car (s); SCM prop = scm_car (entry); @@ -220,7 +224,7 @@ transpose_mutable (SCM alist, Pitch delta) } else if (scm_is_eq (prop, ly_symbol2scm ("element"))) { - if (Music *m = unsmob (val)) + if (Prob *m = unsmob (val)) m->transpose (delta); } else if (scm_is_eq (prop, ly_symbol2scm ("elements")) @@ -235,15 +239,6 @@ transpose_mutable (SCM alist, Pitch delta) } } -void -Music::transpose (Pitch delta) -{ - if (to_boolean (get_property ("untransposable"))) - return; - - transpose_mutable (mutable_property_alist_, delta); -} - void Music::set_spot (Input ip) { @@ -329,3 +324,40 @@ Music::duration_length_callback (SCM m) mom = d->get_length (); return mom.smobbed_copy (); } + +SCM +music_deep_copy (SCM m) +{ + if (Music *mus = unsmob (m)) + return mus->clone ()->unprotect (); + if (scm_is_pair (m)) + { + SCM copy = SCM_EOL; + do + { + copy = scm_cons (music_deep_copy (scm_car (m)), copy); + m = scm_cdr (m); + } + while (scm_is_pair (m)); + // Oh, come on, GUILE. Why do you require the second argument + // of scm_reverse_x to be a proper list? That makes no sense. + // return scm_reverse_x (copy, music_deep_copy (m)); + SCM last_cons = copy; + copy = scm_reverse_x (copy, SCM_EOL); + scm_set_cdr_x (last_cons, music_deep_copy (m)); + return copy; + } + return m; +} + +void +set_origin (SCM m, SCM origin) +{ + while (scm_is_pair (m)) + { + set_origin (scm_car (m), origin); + m = scm_cdr (m); + } + if (Music *mus = unsmob (m)) + mus->set_property ("origin", origin); +}