X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flyric-combine-music-iterator.cc;h=c1076cd792534a3d4da7522b546302df3dd45c19;hb=b7b68363b15a8f723b55338b613de077ce5e1bdd;hp=e1c72a5e9d7774fc9c58371f2503692e6bbe90d4;hpb=9f3df01392cdaf8120bf67c5034e507242be90e7;p=lilypond.git diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index e1c72a5e9d..c1076cd792 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -3,40 +3,75 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2002 Han-Wen Nienhuys + (c) 1999--2004 Han-Wen Nienhuys */ -#include "translator-group.hh" -#include "lyric-combine-music-iterator.hh" +#include "context.hh" #include "lyric-combine-music.hh" -#include "musical-request.hh" +#include "event.hh" #include "note-head.hh" #include "grob.hh" +#include "music-iterator.hh" + +class Lyric_combine_music_iterator : public Music_iterator +{ +public: + Lyric_combine_music_iterator (); + Lyric_combine_music_iterator (Lyric_combine_music_iterator const&src); + DECLARE_SCHEME_CALLBACK (constructor, ()); +protected: + virtual void construct_children (); + virtual Moment pending_moment () const; + virtual void do_quit (); + virtual void process (Moment); + virtual Music_iterator *try_music_in_children (Music *) const; + + virtual bool ok () const; + virtual void derived_mark () const; + virtual void derived_substitute (Context *,Context *) ; +private: + bool get_busy_status ()const ; + bool melisma_busy (); + + Music_iterator * music_iter_; + Music_iterator * lyric_iter_; +}; + + +bool +melisma_busy (Context* tr) +{ + SCM melisma_properties = tr->get_property ("melismaBusyProperties"); + bool busy = false; + + for (; scm_is_pair (melisma_properties); + melisma_properties = scm_cdr (melisma_properties)) + busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties))); + + return busy; +} + /* Ugh, why static? */ -Busy_playing_req *busy_req; -Melisma_req *melisma_start_req; -Melisma_req *melisma_stop_req; -Melisma_playing_req * melisma_playing_req; +Music *busy_req; +Music *melisma_playing_req; Lyric_combine_music_iterator::Lyric_combine_music_iterator () { + music_iter_ = 0; + lyric_iter_ = 0; + if (!busy_req) { - busy_req = new Busy_playing_req; - melisma_playing_req = new Melisma_playing_req; - melisma_stop_req = new Melisma_req; - melisma_start_req = new Melisma_req; - melisma_start_req->set_span_dir (START); - melisma_stop_req->set_span_dir (STOP); + busy_req + = make_music_by_name (ly_symbol2scm ("BusyPlayingEvent")); + melisma_playing_req + = make_music_by_name (ly_symbol2scm ("MelismaPlayingEvent")); } - - music_iter_ =0; - lyric_iter_ =0; } Moment @@ -53,12 +88,21 @@ Lyric_combine_music_iterator::ok () const } void -Lyric_combine_music_iterator::derived_mark()const +Lyric_combine_music_iterator::derived_mark ()const { if (music_iter_) - scm_gc_mark (music_iter_->self_scm()); + scm_gc_mark (music_iter_->self_scm ()); if (lyric_iter_) - scm_gc_mark (lyric_iter_->self_scm()); + scm_gc_mark (lyric_iter_->self_scm ()); +} + +void +Lyric_combine_music_iterator::derived_substitute (Context *f,Context * t) +{ + if (music_iter_) + music_iter_->substitute_outlet (f,t); + if (lyric_iter_) + lyric_iter_->substitute_outlet (f,t); } void @@ -74,20 +118,20 @@ bool Lyric_combine_music_iterator::get_busy_status () const { /* - We have to use both the request and the busyGrobs queue. The + We have to use both the event and the busyGrobs queue. The busyGrobs queue doesn't contain any notes that have started this instant. */ if (try_music (busy_req)) return true; - Translator_group * tr = music_iter_->report_to (); + Context * tr = music_iter_->get_outlet (); SCM grobs = tr->get_property ("busyGrobs"); - Moment now = tr->now_mom(); - for (; gh_pair_p (grobs); grobs = gh_cdr (grobs)) + Moment now = tr->now_mom (); + for (; scm_is_pair (grobs); grobs = scm_cdr (grobs)) { - SCM grob = gh_cdar (grobs); - Moment end =*unsmob_moment (gh_caar (grobs)); + SCM grob = scm_cdar (grobs); + Moment end =*unsmob_moment (scm_caar (grobs)); /* @@ -101,6 +145,18 @@ Lyric_combine_music_iterator::get_busy_status () const return false; } + +bool +Lyric_combine_music_iterator::melisma_busy () +{ + /* + We can not read the property, since music_iter_->get_outlet () might + not be the context that sets the melisma properties, but rather a + parent context. + */ + return music_iter_->try_music (melisma_playing_req); +} + void Lyric_combine_music_iterator::process (Moment m) { @@ -110,44 +166,20 @@ Lyric_combine_music_iterator::process (Moment m) music_iter_->process (m); - if (get_busy_status ()) + if (get_busy_status () && !melisma_busy () && lyric_iter_->ok ()) { - bool melisma_b = try_music (melisma_playing_req); - if (!melisma_b) - { - if (lyric_iter_->ok ()) - { - Moment m= lyric_iter_->pending_moment (); - lyric_iter_->process (m); - } - } + Moment m = lyric_iter_->pending_moment (); + lyric_iter_->process (m); } - } + void Lyric_combine_music_iterator::do_quit () { if (music_iter_) - music_iter_->quit(); + music_iter_->quit (); if (lyric_iter_) - lyric_iter_->quit(); - -} -Lyric_combine_music_iterator::Lyric_combine_music_iterator (Lyric_combine_music_iterator const & src) - : Music_iterator (src) -{ - lyric_iter_ = 0; - music_iter_ = 0; - - if (src.lyric_iter_) - lyric_iter_ = src.lyric_iter_->clone (); - if (src.music_iter_) - music_iter_ = src.music_iter_->clone (); - - if (lyric_iter_) - scm_gc_unprotect_object (lyric_iter_->self_scm()); - if (music_iter_) - scm_gc_unprotect_object (music_iter_->self_scm()); + lyric_iter_->quit (); } Music_iterator*