X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffigured-bass-engraver.cc;h=01b352f28d647f067eab52bb7f2b4fd42f9944d0;hb=9f3572d98bb948c9689cd1f75401a029451fa001;hp=cf3e418883a9f51f74f88eea6dd5b4cad4721d5a;hpb=04265f11d1f21416ccebd2dcaa1d903dc781b36e;p=lilypond.git diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc index cf3e418883..01b352f28d 100644 --- a/lily/figured-bass-engraver.cc +++ b/lily/figured-bass-engraver.cc @@ -9,15 +9,16 @@ #include "engraver.hh" -#include "align-interface.hh" -#include "axis-group-interface.hh" #include "context.hh" -#include "grob-array.hh" +#include "music.hh" #include "item.hh" -#include "pointer-group-interface.hh" #include "spanner.hh" -#include "stream-event.hh" +#include "axis-group-interface.hh" +#include "align-interface.hh" +#include "pointer-group-interface.hh" #include "text-interface.hh" +#include "grob-array.hh" + #include "translator.icc" @@ -30,7 +31,7 @@ struct Figure_group SCM alteration_; Item *figure_item_; - Stream_event *current_event_; + Music *current_music_; bool force_no_continuation_; Figure_group () @@ -41,17 +42,17 @@ struct Figure_group number_ = SCM_EOL; alteration_ = SCM_EOL; group_ = 0; - current_event_ = 0; + current_music_ = 0; } bool is_continuation () const { return - current_event_ + current_music_ && !force_no_continuation_ && ly_is_equal (number_, - current_event_->get_property ("figure")) + current_music_->get_property ("figure")) && ly_is_equal (alteration_, - current_event_->get_property ("alteration")); + current_music_->get_property ("alteration")); } }; @@ -67,16 +68,14 @@ struct Figured_bass_engraver : public Engraver protected: vector groups_; Spanner *alignment_; - vector new_events_; + vector new_musics_; bool continuation_; - bool new_event_found_; + bool new_music_found_; Moment stop_moment_; - Stream_event *rest_event_; - - DECLARE_TRANSLATOR_LISTENER (rest); - DECLARE_TRANSLATOR_LISTENER (bass_figure); - + Music *rest_event_; + + virtual bool try_music (Music *); virtual void derived_mark () const; void start_translation_timestep (); @@ -104,7 +103,7 @@ Figured_bass_engraver::stop_translation_timestep () bool found = false; for (vsize i = 0; !found && i < groups_.size (); i++) - found = found || groups_[i].current_event_; + found = found || groups_[i].current_music_; if (!found) clear_spanners (); @@ -115,7 +114,7 @@ Figured_bass_engraver::Figured_bass_engraver () alignment_ = 0; continuation_ = false; rest_event_ = 0; - new_event_found_ = false; + new_music_found_ = false; } void @@ -126,47 +125,43 @@ Figured_bass_engraver::start_translation_timestep () return ; rest_event_ = 0; - new_events_.clear (); + new_musics_.clear (); for (vsize i = 0; i < groups_.size (); i++) - groups_[i].current_event_ = 0; - + groups_[i].current_music_ = 0; continuation_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest); -void -Figured_bass_engraver::listen_rest (Stream_event *ev) +bool +Figured_bass_engraver::try_music (Music *m) { - if (to_boolean (get_property ("ignoreFiguredBassRest"))) + new_music_found_ = true; + if (m->is_mus_type ("rest-event")) { - new_event_found_ = true; - ASSIGN_EVENT_ONCE (rest_event_, ev); + rest_event_ = m; + return true; } -} - -IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure); -void -Figured_bass_engraver::listen_bass_figure (Stream_event *ev) -{ - new_event_found_ = true; - Moment stop = now_mom () + get_event_length (ev); - stop_moment_ = max (stop_moment_, stop); - - SCM fig = ev->get_property ("figure"); - for (vsize i = 0; i < groups_.size (); i++) + else { - if (!groups_[i].current_event_ - && ly_is_equal (groups_[i].number_, fig)) + stop_moment_ = now_mom () + m->get_length (); + + SCM fig = m->get_property ("figure"); + for (vsize i = 0; i < groups_.size (); i++) { - groups_[i].current_event_ = ev; - groups_[i].force_no_continuation_ - = to_boolean (ev->get_property ("no-continuation")); - continuation_ = true; - return; + if (!groups_[i].current_music_ + && ly_is_equal (groups_[i].number_, fig)) + { + groups_[i].current_music_ = m; + groups_[i].force_no_continuation_ + = to_boolean (m->get_property ("no-continuation")); + continuation_ = true; + return true; + } } + + new_musics_.push_back (m); + + return true; } - - new_events_.push_back (ev); } void @@ -249,20 +244,20 @@ Figured_bass_engraver::add_brackets () bool inside = false; for (vsize i = 0; i < groups_.size (); i ++) { - if (!groups_[i].current_event_) + if (!groups_[i].current_music_) continue; - if (to_boolean (groups_[i].current_event_->get_property ("bracket-start"))) + if (to_boolean (groups_[i].current_music_->get_property ("bracket-start"))) inside = true; if (inside && groups_[i].figure_item_) encompass.push_back (groups_[i].figure_item_); - if (to_boolean (groups_[i].current_event_->get_property ("bracket-stop"))) + if (to_boolean (groups_[i].current_music_->get_property ("bracket-stop"))) { inside = false; - Item * brack = make_item ("BassFigureBracket", groups_[i].current_event_->self_scm ()); + Item * brack = make_item ("BassFigureBracket", groups_[i].current_music_->self_scm ()); for (vsize j = 0; j < encompass.size (); j++) { Pointer_group_interface::add_grob (brack, @@ -285,17 +280,17 @@ Figured_bass_engraver::process_music () } if (!continuation_ - && new_events_.empty ()) + && new_musics_.empty ()) { clear_spanners (); groups_.clear (); return; } - if (!new_event_found_) + if (!new_music_found_) return; - new_event_found_ = false; + new_music_found_ = false; /* Don't need to sync alignments, if we're not using extenders. @@ -313,10 +308,10 @@ Figured_bass_engraver::process_music () } vsize k = 0; - for (vsize i = 0; i < new_events_.size (); i++) + for (vsize i = 0; i < new_musics_.size (); i++) { while (k < groups_.size () - && groups_[k].current_event_) + && groups_[k].current_music_) k++; if (k >= groups_.size ()) @@ -325,7 +320,7 @@ Figured_bass_engraver::process_music () groups_.push_back (group); } - groups_[k].current_event_ = new_events_[i]; + groups_[k].current_music_ = new_musics_[i]; groups_[k].figure_item_ = 0; k++; } @@ -413,14 +408,14 @@ Figured_bass_engraver::create_grobs () { Figure_group &group = groups_[i]; - if (group.current_event_) + if (group.current_music_) { Item *item = make_item ("BassFigure", - group.current_event_->self_scm ()); + group.current_music_->self_scm ()); - SCM fig = group.current_event_->get_property ("figure"); + SCM fig = group.current_music_->get_property ("figure"); if (!group.group_) { group.group_ = make_spanner ("BassFigureLine", SCM_EOL); @@ -436,13 +431,13 @@ Figured_bass_engraver::create_grobs () } group.number_ = fig; - group.alteration_ = group.current_event_->get_property ("alteration"); + group.alteration_ = group.current_music_->get_property ("alteration"); - SCM text = group.current_event_->get_property ("text"); + SCM text = group.current_music_->get_property ("text"); if (!Text_interface::is_markup (text) && ly_is_procedure (proc)) { - text = scm_call_3 (proc, fig, group.current_event_->self_scm (), + text = scm_call_3 (proc, fig, group.current_music_->self_scm (), context ()->self_scm ()); } @@ -480,8 +475,7 @@ ADD_TRANSLATOR (Figured_bass_engraver, "BassFigureLine " , /* accept */ - "bass-figure-event " - "rest-event", + "bass-figure-event rest-event", /* read */ "figuredBassAlterationDirection " @@ -489,7 +483,6 @@ ADD_TRANSLATOR (Figured_bass_engraver, "figuredBassFormatter " "implicitBassFigures " "useBassFigureExtenders " - "ignoreFiguredBassRest " , /* write */