#include "music.hh"
#include "duration.hh"
+#include "input.hh"
+#include "lily-imports.hh"
#include "program-option.hh"
#include "warn.hh"
" it as a @code{Moment} object.")
{
LY_ASSERT_SMOB (Music, mus, 1);
- Music *sc = Music::unsmob (mus);
+ Music *sc = unsmob<Music> (mus);
return sc->get_length ().smobbed_copy ();
}
1, 0, 0, (SCM obj),
"Is @var{obj} a music object?")
{
- return ly_bool2scm (Music::is_smob (obj));
+ return ly_bool2scm (unsmob<Music> (obj));
}
LY_DEFINE (ly_event_p, "ly:event?",
1, 0, 0, (SCM obj),
"Is @var{obj} a proper (non-rhythmic) event object?")
{
- if (Music *m = Music::unsmob (obj))
+ if (Music *m = unsmob<Music> (obj))
{
return scm_from_bool (m->is_mus_type ("post-event"));
}
" constant and initialized by the @code{make-music} function.")
{
LY_ASSERT_SMOB (Music, mus, 1);
- Music *m = Music::unsmob (mus);
+ Music *m = unsmob<Music> (mus);
return m->get_property_alist (true);
}
while (scm_is_pair (lst))
{
- if (!Music::is_smob (scm_car (lst)))
+ if (!unsmob<Music> (scm_car (lst)))
return SCM_BOOL_F;
lst = scm_cdr (lst);
}
}
LY_DEFINE (ly_music_deep_copy, "ly:music-deep-copy",
- 1, 0, 0, (SCM m),
+ 1, 1, 0, (SCM m, SCM origin),
"Copy @var{m} and all sub expressions of@tie{}@var{m}."
" @var{m} may be an arbitrary type; cons cells and music"
- " are copied recursively.")
+ " are copied recursively. If @var{origin} is given,"
+ " it is used as the origin for one level of music by calling"
+ " @code{ly:set-origin!} on the copy.")
{
- if (Music::is_smob (m))
- return Music::unsmob (m)->clone ()->unprotect ();
- if (scm_is_pair (m))
- {
- SCM copy = SCM_EOL;
- do
- {
- copy = scm_cons (ly_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, ly_music_deep_copy (m));
- SCM last_cons = copy;
- copy = scm_reverse_x (copy, SCM_EOL);
- scm_set_cdr_x (last_cons, ly_music_deep_copy (m));
- return copy;
- }
+ m = music_deep_copy (m);
+
+ if (SCM_UNBNDP (origin))
+ return m;
+
+ if (Music *mus = unsmob<Music> (origin))
+ origin = mus->get_property ("origin");
+
+ if (scm_is_false (origin) || scm_is_null (origin))
+ return m;
+
+ LY_ASSERT_SMOB (Input, origin, 2);
+
+ set_origin (m, origin);
+ return m;
+}
+
+LY_DEFINE (ly_set_origin_x, "ly:set-origin!",
+ 1, 1, 0, (SCM m, SCM origin),
+ "This sets the origin given in @var{origin} to @var{m}. "
+ " @var{m} will typically be a music expression or a list"
+ " of music. List structures are searched recursively,"
+ " but recursion stops at the changed music expressions"
+ " themselves. "
+ " @var{origin} is generally of type @code{ly:input-location?},"
+ " defaulting to @code{(*location*)}. Other valid values for"
+ " @code{origin} are a music expression which is then used as"
+ " the source of location information, or @code{#f}"
+ " or @code{'()} in which case no action is performed. "
+ " The return value is @var{m} itself.")
+{
+ if (SCM_UNBNDP (origin))
+ origin = scm_fluid_ref (Lily::f_location);
+ else if (Music *mus = unsmob<Music> (origin))
+ origin = mus->get_property ("origin");
+
+ if (scm_is_false (origin) || scm_is_null (origin))
+ return m;
+
+ LY_ASSERT_SMOB (Input, origin, 2);
+
+ set_origin (m, origin);
return m;
}
LY_ASSERT_SMOB (Music, m, 1);
LY_ASSERT_SMOB (Pitch, p, 2);
- Music *sc = Music::unsmob (m);
- Pitch *sp = Pitch::unsmob (p);
+ Music *sc = unsmob<Music> (m);
+ Pitch *sp = unsmob<Pitch> (p);
sc->transpose (*sp);
// SCM_UNDEFINED ?
LY_ASSERT_SMOB (Music, m, 1);
LY_ASSERT_SMOB (Moment, factor, 2);
- Music *sc = Music::unsmob (m);
- sc->compress (*Moment::unsmob (factor));
+ Music *sc = unsmob<Music> (m);
+ sc->compress (*unsmob<Moment> (factor));
return sc->self_scm ();
}
LY_ASSERT_SMOB (Music, music, 1);
LY_ASSERT_SMOB (Pitch, pitch, 2);
- Pitch start = *Pitch::unsmob (pitch);
- Music *m = Music::unsmob (music);
+ Pitch start = *unsmob<Pitch> (pitch);
+ Music *m = unsmob<Music> (music);
Pitch last = m->to_relative_octave (start);
return last.smobbed_copy ();
" length.")
{
LY_ASSERT_SMOB (Music, mus, 1);
- Music *m = Music::unsmob (mus);
+ Music *m = unsmob<Music> (mus);
- Duration *d = Duration::unsmob (m->get_property ("duration"));
+ Duration *d = unsmob<Duration> (m->get_property ("duration"));
Moment len;
if (d)
LY_ASSERT_SMOB (Music, mus, 1);
LY_ASSERT_SMOB (Moment, fact, 2);
- Music *m = Music::unsmob (mus);
- Moment *f = Moment::unsmob (fact);
+ Music *m = unsmob<Music> (mus);
+ Moment *f = unsmob<Moment> (fact);
- Duration *d = Duration::unsmob (m->get_property ("duration"));
+ Duration *d = unsmob<Duration> (m->get_property ("duration"));
if (d)
m->set_property ("duration", d->compressed (f->main_part_).smobbed_copy ());
return SCM_UNSPECIFIED;
" pitch @var{pit}.")
{
SCM newlist = SCM_EOL;
- Pitch *p = Pitch::unsmob (pit);
+ Pitch *p = unsmob<Pitch> (pit);
for (SCM s = l; scm_is_pair (s); s = scm_cdr (s))
{
}
return scm_reverse_x (newlist, SCM_EOL);
}
-