#include "event.hh"
#include "warn.hh"
-Moment
-Event::get_length () const
+MAKE_SCHEME_CALLBACK(Event,length_callback,1);
+SCM
+Event::length_callback (SCM m)
{
- Duration *d = unsmob_duration (get_property ("duration"));
- if (!d)
+ Music* me = unsmob_music (m);
+ Duration *d = unsmob_duration (me->get_property ("duration"));
+
+ Moment mom;
+ if (d)
{
- Moment m ;
- return m;
+ mom = d->get_length ();
}
- return d->get_length ();
+ return mom.smobbed_copy();
}
void
Event::Event (SCM i)
: Music (i)
{
+ if (!ly_c_procedure_p (length_callback_))
+ {
+ length_callback_ = length_callback_proc;
+ }
}
ADD_MUSIC (Event);
*/
#include "grace-music.hh"
-
#include "grace-iterator.hh"
-Moment
-Grace_music::get_length () const
-{
- Moment m;
- return m;
-}
-
Moment
Grace_music::start_mom () const
{
- Moment l = Music_wrapper::get_length ();
+ Moment *l = unsmob_moment (Music_wrapper::length_callback (self_scm ()));
Moment gl;
- gl.grace_part_ = -(l.main_part_ + l.grace_part_ );
+ gl.grace_part_ = -(l->main_part_ + l->grace_part_ );
return gl;
}
Event (SCM);
VIRTUAL_COPY_CONSTRUCTOR (Music, Event);
virtual void compress (Moment);
- virtual Moment get_length () const;
+ DECLARE_SCHEME_CALLBACK(length_callback,(SCM));
virtual Pitch to_relative_octave (Pitch);
};
VIRTUAL_COPY_CONSTRUCTOR (Music, Grace_music);
Grace_music (SCM);
protected:
- virtual Moment get_length () const;
virtual Moment start_mom () const;
};
public:
Lyric_combine_music (SCM);
VIRTUAL_COPY_CONSTRUCTOR (Music, Lyric_combine_music);
+ DECLARE_SCHEME_CALLBACK(length_callback,(SCM));
Music *get_music () const;
Music *get_lyrics () const;
- virtual Moment get_length () const;
};
#endif /* LYRIC_COMBINE_MUSIC_HH */
VIRTUAL_COPY_CONSTRUCTOR (Music, Simultaneous_music);
virtual Pitch to_relative_octave (Pitch);
- virtual Moment get_length () const;
virtual Moment start_mom () const;
};
{
public:
VIRTUAL_COPY_CONSTRUCTOR (Music, Sequential_music);
- virtual Moment get_length () const;
virtual Moment start_mom () const;
Sequential_music (SCM);
#ifndef MUSIC_SEQUENCE_HH
#define MUSIC_SEQUENCE_HH
+
#include "music.hh"
-/**
- Music can be a list of other "Music" elements
- */
+
class Music_sequence : public Music
{
public:
Music_sequence (SCM h);
VIRTUAL_COPY_CONSTRUCTOR (Music, Music_sequence);
-
+ DECLARE_SCHEME_CALLBACK(cumulative_length_callback, (SCM));
+ DECLARE_SCHEME_CALLBACK(maximum_length_callback, (SCM));
SCM music_list () const;
Pitch do_relative_octave (Pitch p, bool b);
public:
Music_wrapper (SCM);
VIRTUAL_COPY_CONSTRUCTOR (Music, Music_wrapper);
-
+ DECLARE_SCHEME_CALLBACK(length_callback,(SCM));
Music *element () const;
- virtual Moment get_length () const;
virtual Moment start_mom () const;
};
virtual Pitch to_relative_octave (Pitch);
String name () const;
- /// The duration of this piece of music
- virtual Moment get_length () const;
+ Moment get_length () const;
virtual Moment start_mom () const;
void print () const;
/// Transpose, with the interval central C to #p#
DECLARE_SMOBS (Music,);
SCM immutable_property_alist_;
SCM mutable_property_alist_;
+protected:
+ SCM length_callback_;
friend SCM ly_extended_make_music (SCM, SCM);
};
class Time_scaled_music : public Music_wrapper
{
public:
- Time_scaled_music ();
Time_scaled_music (SCM);
VIRTUAL_COPY_CONSTRUCTOR (Music, Time_scaled_music);
};
{
}
-Moment
-Lyric_combine_music::get_length () const
+MAKE_SCHEME_CALLBACK(Lyric_combine_music,length_callback,1);
+SCM
+Lyric_combine_music::length_callback (SCM m)
{
- return get_music ()->get_length ();
+ Music * me = unsmob_music (m);
+ Music *melody = unsmob_music (scm_car (me->get_property ("elements")));
+ return melody->get_length ().smobbed_copy ();
}
Music*
#include "warn.hh"
-typedef Music *(*Music_ctor) ();
-
static std::map<String,Music_ctor> *ctors_map_;
void
return dur;
}
+MAKE_SCHEME_CALLBACK(Music_sequence,maximum_length_callback,1);
+SCM
+Music_sequence::maximum_length_callback (SCM m)
+{
+ Music* me = unsmob_music (m);
+ return maximum_length (me->get_property ("elements")).smobbed_copy();
+}
+
+MAKE_SCHEME_CALLBACK(Music_sequence,cumulative_length_callback,1);
+SCM
+Music_sequence::cumulative_length_callback (SCM m)
+{
+ Music* me = unsmob_music (m);
+ return maximum_length (me->get_property ("elements")).smobbed_copy();
+}
+
Pitch
music_list_to_relative (SCM l,Pitch p, bool ret_first)
{
return m;
}
+
{
}
-Moment
-Music_wrapper::get_length () const
+
+MAKE_SCHEME_CALLBACK(Music_wrapper,length_callback,1);
+SCM
+Music_wrapper::length_callback (SCM m)
{
- return element ()->get_length ();
+ Music * me = unsmob_music (m);
+ Music *elt = unsmob_music (me->get_property ("element"));
+ return elt->get_length ().smobbed_copy ();
}
Music*
immutable_property_alist_ = init;
mutable_property_alist_ = SCM_EOL;
smobify_self ();
+
+ length_callback_ = get_property ("length-callback");
}
Music::Music (Music const &m)
that they won't be protected from GC. */
smobify_self ();
mutable_property_alist_ = ly_music_deep_copy (m.mutable_property_alist_);
+ length_callback_ = m.length_callback_;
set_spot (*m.origin ());
}
if (unsmob_moment (lst))
return *unsmob_moment (lst);
- lst = get_property ("length-callback");
- if (ly_c_procedure_p (lst))
+ if (ly_c_procedure_p (length_callback_))
{
- SCM res = scm_call_1 (lst, self_scm ());
+ SCM res = scm_call_1 (length_callback_, self_scm ());
return *unsmob_moment (res);
}
- return 0;
+ return *unsmob_moment (scm_call_1 (length_callback_, self_scm ()));
}
Moment
#include "music-list.hh"
#include "sequential-music-iterator.hh"
-Sequential_music::Sequential_music ()
- : Music_sequence ()
+Sequential_music::Sequential_music (SCM x)
+ : Music_sequence (x)
{
}
-Moment
-Sequential_music::get_length () const
-{
- return Music_sequence::cumulative_length (get_property ("elements"));
-}
ADD_MUSIC (Sequential_music);
Moment
#include "music-list.hh"
#include "scm-option.hh"
-Moment
-Simultaneous_music::get_length () const
-{
- return Music_sequence::maximum_length (get_property ("elements"));
-}
-
Moment
Simultaneous_music::start_mom () const
{
#include "time-scaled-music-iterator.hh"
-Time_scaled_music::Time_scaled_music ()
+Time_scaled_music::Time_scaled_music (SCM x)
+ : Music_wrapper (x)
{
-
}
+
ADD_MUSIC (Time_scaled_music);
. (
(description . "Interpret the argument as grace notes. ")
(internal-class-name . "Grace_music")
+ (length . ,(ly:make-moment 0 1))
(iterator-ctor . ,Grace_iterator::constructor)
(types . (grace-music music-wrapper-music general-music))
))
Syntax \\sequential @{..@} or simply @{..@} .")
(internal-class-name . "Sequential_music")
+ (length-callback . ,Music_sequence::cumulative_length_callback)
(iterator-ctor . ,Sequential_music_iterator::constructor)
(types . (general-music sequential-music))
))
Syntax @code{R2.*5} for 5 measures in 3/4 time.")
(internal-class-name . "Sequential_music")
+ (length-callback . ,Music_sequence::cumulative_length_callback)
(iterator-ctor . ,Sequential_music_iterator::constructor)
(types . (general-music sequential-music))
))
(internal-class-name . "Simultaneous_music")
(iterator-ctor . ,Simultaneous_music_iterator::constructor)
+ (length-callback . ,Music_sequence::maximum_length_callback)
(types . (general-music simultaneous-music))
))
(description . "Internally used to group a set of events.")
(internal-class-name . "Event_chord")
(iterator-ctor . ,Event_chord_iterator::constructor)
+ (length-callback . ,Music_sequence::maximum_length_callback)
(types . (general-music event-chord simultaneous-music))
)
)