#include "music-sequence.hh"
#include "score.hh"
#include "warn.hh"
+#include "lily-imports.hh"
/*
Music is anything that has (possibly zero) duration and supports
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;
SCM
Music::copy_mutable_properties () const
{
- return ly_music_deep_copy (mutable_property_alist_);
+ return music_deep_copy (mutable_property_alist_);
}
void
/*
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);
}
else if (scm_is_eq (prop, ly_symbol2scm ("element")))
{
- if (Music *m = unsmob<Music> (val))
+ if (Prob *m = unsmob<Prob> (val))
m->transpose (delta);
}
else if (scm_is_eq (prop, ly_symbol2scm ("elements"))
&& 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)
{
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 ())
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<Music> (rv);
mom = d->get_length ();
return mom.smobbed_copy ();
}
+
+SCM
+music_deep_copy (SCM m)
+{
+ if (Music *mus = unsmob<Music> (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<Music> (m))
+ mus->set_property ("origin", origin);
+}