From: Han-Wen Nienhuys Date: Fri, 14 Jan 2005 12:31:04 +0000 (+0000) Subject: (class Music): include SCM init argument. X-Git-Tag: release/2.5.14~263 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=4eee0d110ca632aa8adf3af223f7040c7b9752ff;p=lilypond.git (class Music): include SCM init argument. --- diff --git a/lily/event.cc b/lily/event.cc index 5e93cb84c9..271f1b6ed7 100644 --- a/lily/event.cc +++ b/lily/event.cc @@ -9,16 +9,19 @@ #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 @@ -62,6 +65,10 @@ Event::to_relative_octave (Pitch last) Event::Event (SCM i) : Music (i) { + if (!ly_c_procedure_p (length_callback_)) + { + length_callback_ = length_callback_proc; + } } ADD_MUSIC (Event); diff --git a/lily/grace-music.cc b/lily/grace-music.cc index 8acff19747..02abe88c60 100644 --- a/lily/grace-music.cc +++ b/lily/grace-music.cc @@ -8,22 +8,14 @@ */ #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; } diff --git a/lily/include/event.hh b/lily/include/event.hh index a50e397c4c..f282eb9418 100644 --- a/lily/include/event.hh +++ b/lily/include/event.hh @@ -23,7 +23,7 @@ public: 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); }; diff --git a/lily/include/grace-music.hh b/lily/include/grace-music.hh index ea1eaf3414..9ddb705b9c 100644 --- a/lily/include/grace-music.hh +++ b/lily/include/grace-music.hh @@ -18,7 +18,6 @@ public: VIRTUAL_COPY_CONSTRUCTOR (Music, Grace_music); Grace_music (SCM); protected: - virtual Moment get_length () const; virtual Moment start_mom () const; }; diff --git a/lily/include/lyric-combine-music.hh b/lily/include/lyric-combine-music.hh index 0643f820de..b2489c0e1d 100644 --- a/lily/include/lyric-combine-music.hh +++ b/lily/include/lyric-combine-music.hh @@ -17,10 +17,10 @@ class Lyric_combine_music : public Music 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 */ diff --git a/lily/include/music-list.hh b/lily/include/music-list.hh index 523fef4464..fcbcb78e93 100644 --- a/lily/include/music-list.hh +++ b/lily/include/music-list.hh @@ -22,7 +22,6 @@ public: VIRTUAL_COPY_CONSTRUCTOR (Music, Simultaneous_music); virtual Pitch to_relative_octave (Pitch); - virtual Moment get_length () const; virtual Moment start_mom () const; }; @@ -44,7 +43,6 @@ class Sequential_music : public Music_sequence { public: VIRTUAL_COPY_CONSTRUCTOR (Music, Sequential_music); - virtual Moment get_length () const; virtual Moment start_mom () const; Sequential_music (SCM); diff --git a/lily/include/music-sequence.hh b/lily/include/music-sequence.hh index c1c307b1ec..34e69c16b9 100644 --- a/lily/include/music-sequence.hh +++ b/lily/include/music-sequence.hh @@ -9,16 +9,16 @@ #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); diff --git a/lily/include/music-wrapper.hh b/lily/include/music-wrapper.hh index 4d9c292438..7403095562 100644 --- a/lily/include/music-wrapper.hh +++ b/lily/include/music-wrapper.hh @@ -24,9 +24,8 @@ class Music_wrapper : public Music 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; }; diff --git a/lily/include/music.hh b/lily/include/music.hh index a9a60cbe6b..82de70454b 100644 --- a/lily/include/music.hh +++ b/lily/include/music.hh @@ -46,8 +46,7 @@ public: 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# @@ -60,6 +59,8 @@ protected: DECLARE_SMOBS (Music,); SCM immutable_property_alist_; SCM mutable_property_alist_; +protected: + SCM length_callback_; friend SCM ly_extended_make_music (SCM, SCM); }; diff --git a/lily/include/time-scaled-music.hh b/lily/include/time-scaled-music.hh index efc62bb1bd..18eda762e7 100644 --- a/lily/include/time-scaled-music.hh +++ b/lily/include/time-scaled-music.hh @@ -17,7 +17,6 @@ class Time_scaled_music : public Music_wrapper { public: - Time_scaled_music (); Time_scaled_music (SCM); VIRTUAL_COPY_CONSTRUCTOR (Music, Time_scaled_music); }; diff --git a/lily/lyric-combine-music.cc b/lily/lyric-combine-music.cc index 98777b1dd7..c4678b6074 100644 --- a/lily/lyric-combine-music.cc +++ b/lily/lyric-combine-music.cc @@ -16,10 +16,13 @@ Lyric_combine_music::Lyric_combine_music (SCM x) { } -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* diff --git a/lily/music-constructor.cc b/lily/music-constructor.cc index 120bfef236..97c295e016 100644 --- a/lily/music-constructor.cc +++ b/lily/music-constructor.cc @@ -14,8 +14,6 @@ #include "warn.hh" -typedef Music *(*Music_ctor) (); - static std::map *ctors_map_; void diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc index 35db3471c8..22621393f6 100644 --- a/lily/music-sequence.cc +++ b/lily/music-sequence.cc @@ -66,6 +66,22 @@ Music_sequence::maximum_length (SCM l) 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) { @@ -124,3 +140,4 @@ Music_sequence::first_start (SCM l) return m; } + diff --git a/lily/music-wrapper.cc b/lily/music-wrapper.cc index d6995ac664..939b90db94 100644 --- a/lily/music-wrapper.cc +++ b/lily/music-wrapper.cc @@ -14,10 +14,14 @@ Music_wrapper::Music_wrapper (SCM x) { } -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* diff --git a/lily/music.cc b/lily/music.cc index 4e98b61775..db31a9aec1 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -45,6 +45,8 @@ Music::Music (SCM init) immutable_property_alist_ = init; mutable_property_alist_ = SCM_EOL; smobify_self (); + + length_callback_ = get_property ("length-callback"); } Music::Music (Music const &m) @@ -58,6 +60,7 @@ 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 ()); } @@ -89,14 +92,13 @@ Music::get_length () const 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 diff --git a/lily/sequential-music.cc b/lily/sequential-music.cc index f250e86e37..ada814deb0 100644 --- a/lily/sequential-music.cc +++ b/lily/sequential-music.cc @@ -1,16 +1,11 @@ #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 diff --git a/lily/simultaneous-music.cc b/lily/simultaneous-music.cc index 5816462863..04f0506c2b 100644 --- a/lily/simultaneous-music.cc +++ b/lily/simultaneous-music.cc @@ -12,12 +12,6 @@ #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 { diff --git a/lily/time-scaled-music.cc b/lily/time-scaled-music.cc index c41bb123f0..bfe33e045a 100644 --- a/lily/time-scaled-music.cc +++ b/lily/time-scaled-music.cc @@ -11,8 +11,9 @@ #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); diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index c3ac9e8856..2b52cfd951 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -199,6 +199,7 @@ Syntax: @var{note}\\cr . ( (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)) )) @@ -452,6 +453,7 @@ previously added property from a graphical object definition 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)) )) @@ -463,6 +465,7 @@ to group start-mmrest, skip, stop-mmrest sequence. 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)) )) @@ -497,6 +500,7 @@ SYNTAX (internal-class-name . "Simultaneous_music") (iterator-ctor . ,Simultaneous_music_iterator::constructor) + (length-callback . ,Music_sequence::maximum_length_callback) (types . (general-music simultaneous-music)) )) @@ -593,6 +597,7 @@ For example, transposed 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)) ) )