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