From: Reinhold Kainhofer Date: Wed, 17 Feb 2010 17:17:50 +0000 (+0100) Subject: FiguredBass: method for extracting figure info; Shuffle functions around X-Git-Tag: release/2.13.14-1~26 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=392386cc9874bf94a4656a2074e76e462958e78d;p=lilypond.git FiguredBass: method for extracting figure info; Shuffle functions around Shuffle functions around so their order is more intuitive Also move extracting info from event to figure into a dedicated method of the the Figure struct. --- diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc index 61b6fa2f82..05d3575d4c 100644 --- a/lily/figured-bass-engraver.cc +++ b/lily/figured-bass-engraver.cc @@ -91,6 +91,16 @@ struct Figure_group current_event_ && group_is_equal_to (current_event_); } + void assign_from_event (Stream_event *currevt, Item *item) + { + number_ = current_event_->get_property ("figure"); + alteration_ = currevt->get_property ("alteration"); + augmented_ = currevt->get_property ("augmented"); + diminished_ = currevt->get_property ("diminished"); + augmented_slash_ = currevt->get_property ("augmented-slash"); + text_ = currevt->get_property ("text"); + figure_item_ = item; + } }; struct Figured_bass_engraver : public Engraver @@ -122,6 +132,14 @@ protected: void process_music (); }; +Figured_bass_engraver::Figured_bass_engraver () +{ + alignment_ = 0; + continuation_ = false; + have_rest_ = 0; + new_event_found_ = false; +} + void Figured_bass_engraver::derived_mark () const { @@ -132,44 +150,34 @@ Figured_bass_engraver::derived_mark () const } void -Figured_bass_engraver::stop_translation_timestep () +Figured_bass_engraver::start_translation_timestep () { - if (groups_.empty () - || now_mom ().main_part_ < stop_moment_.main_part_ + if (now_mom ().main_part_ < stop_moment_.main_part_ || now_mom ().grace_part_ < Rational (0)) return ; - - bool found = false; - for (vsize i = 0; !found && i < groups_.size (); i++) - found = found || groups_[i].current_event_; - if (!found) - clear_spanners (); -} + have_rest_ = 0; + new_events_.clear (); + for (vsize i = 0; i < groups_.size (); i++) + groups_[i].current_event_ = 0; -Figured_bass_engraver::Figured_bass_engraver () -{ - alignment_ = 0; continuation_ = false; - have_rest_ = 0; - new_event_found_ = false; } void -Figured_bass_engraver::start_translation_timestep () +Figured_bass_engraver::stop_translation_timestep () { - if (now_mom ().main_part_ < stop_moment_.main_part_ + if (groups_.empty () + || now_mom ().main_part_ < stop_moment_.main_part_ || now_mom ().grace_part_ < Rational (0)) return ; - - have_rest_ = 0; - new_events_.clear (); - for (vsize i = 0; i < groups_.size (); i++) - groups_[i].current_event_ = 0; - continuation_ = false; + bool found = false; + for (vsize i = 0; !found && i < groups_.size (); i++) + found = found || groups_[i].current_event_; - + if (!found) + clear_spanners (); } IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest); @@ -276,38 +284,6 @@ Figured_bass_engraver::clear_spanners () /* Check me, groups_.clear () ? */ } -void -Figured_bass_engraver::add_brackets () -{ - vector encompass; - bool inside = false; - for (vsize i = 0; i < groups_.size (); i ++) - { - if (!groups_[i].current_event_) - continue; - - 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_event_->get_property ("bracket-stop"))) - { - inside = false; - - 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, - ly_symbol2scm ("elements"), - encompass[j]); - } - encompass.clear (); - } - } -} - void Figured_bass_engraver::process_music () { @@ -449,44 +425,33 @@ Figured_bass_engraver::create_grobs () if (group.current_event_) { Item *item - = make_item ("BassFigure", - group.current_event_->self_scm ()); + = make_item ("BassFigure", group.current_event_->self_scm ()); + group.assign_from_event (group.current_event_, item); - - SCM fig = group.current_event_->get_property ("figure"); if (!group.group_) { group.group_ = make_spanner ("BassFigureLine", SCM_EOL); group.group_->set_bound (LEFT, muscol); - Align_interface::add_element (alignment_, - group.group_); + Align_interface::add_element (alignment_, group.group_); } - if (scm_memq (fig, get_property ("implicitBassFigures")) != SCM_BOOL_F) + if (scm_memq (group.number_, get_property ("implicitBassFigures")) != SCM_BOOL_F) { item->set_property ("transparent", SCM_BOOL_T); item->set_property ("implicit", SCM_BOOL_T); } - - group.number_ = fig; - group.alteration_ = group.current_event_->get_property ("alteration"); - group.augmented_ = group.current_event_->get_property ("augmented"); - group.diminished_ = group.current_event_->get_property ("diminished"); - group.augmented_slash_ = group.current_event_->get_property ("augmented-slash"); - group.text_ = group.current_event_->get_property ("text"); SCM text = group.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, group.number_, group.current_event_->self_scm (), context ()->self_scm ()); } item->set_property ("text", text); Axis_group_interface::add_element (group.group_, item); - group.figure_item_ = item; } if (group.continuation_line_) @@ -505,6 +470,38 @@ Figured_bass_engraver::create_grobs () } +void +Figured_bass_engraver::add_brackets () +{ + vector encompass; + bool inside = false; + for (vsize i = 0; i < groups_.size (); i ++) + { + if (!groups_[i].current_event_) + continue; + + 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_event_->get_property ("bracket-stop"))) + { + inside = false; + + 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, + ly_symbol2scm ("elements"), + encompass[j]); + } + encompass.clear (); + } + } +} + ADD_TRANSLATOR (Figured_bass_engraver, /* doc */ "Make figured bass numbers.",