X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusic.cc;h=ae75ff795273da024d404a76d144f10da52613bd;hb=90e4d7057f3857da049dfda3d130017d4719bd6b;hp=613b5387ff772989ad19adf62b0338c89ba33553;hpb=0c14539bc83d6bb405141b6f21430b33d1e8fcf0;p=lilypond.git diff --git a/lily/music.cc b/lily/music.cc index 613b5387ff..ae75ff7952 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -28,6 +28,7 @@ #include "music-sequence.hh" #include "score.hh" #include "warn.hh" +#include "lily-imports.hh" /* Music is anything that has (possibly zero) duration and supports @@ -44,12 +45,15 @@ Music::internal_is_music_type (SCM k) const return scm_is_true (scm_c_memq (k, ifs)); } -Music::Music (SCM init) - : Prob (ly_symbol2scm ("Music"), init) +Preinit_Music::Preinit_Music () { length_callback_ = SCM_EOL; start_callback_ = SCM_EOL; +} +Music::Music (SCM init) + : Prob (ly_symbol2scm ("Music"), init) +{ length_callback_ = get_property ("length-callback"); if (!ly_is_procedure (length_callback_)) length_callback_ = duration_length_callback_proc; @@ -67,7 +71,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 @@ -197,10 +201,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); @@ -219,7 +227,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")) @@ -229,20 +237,11 @@ transpose_mutable (SCM alist, Pitch delta) && scm_is_pair (val)) new_val = ly_transpose_key_alist (val, delta.smobbed_copy ()); - if (val != new_val) + if (!scm_is_eq (val, new_val)) scm_set_cdr_x (entry, new_val); } } -void -Music::transpose (Pitch delta) -{ - if (to_boolean (get_property ("untransposable"))) - return; - - transpose_mutable (mutable_property_alist_, delta); -} - void Music::set_spot (Input ip) { @@ -269,7 +268,7 @@ Music::to_event () const programming_error ("Not a music type"); Stream_event *e = new Stream_event - (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), class_name), + (Lily::ly_make_event_class (class_name), mutable_property_alist_); Moment length = get_length (); if (length.to_bool ()) @@ -308,8 +307,7 @@ Music::send_to_context (Context *c) Music * make_music_by_name (SCM sym) { - SCM make_music_proc = ly_lily_module_constant ("make-music"); - SCM rv = scm_call_1 (make_music_proc, sym); + SCM rv = Lily::make_music (sym); /* UGH. */ Music *m = unsmob (rv); @@ -329,3 +327,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); +}