X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffigured-bass-engraver.cc;h=db4d5a3bfd06b89ff33ba195c4623116d0cb6f80;hb=1840ea6591b08721e8a87ed9d3d92a718f0f2123;hp=9e0bf61786704b5a0e1882748789cae163931a69;hpb=c4c0ba811cd526f047de3f4d3c77abcc32a3e076;p=lilypond.git diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc index 9e0bf61786..db4d5a3bfd 100644 --- a/lily/figured-bass-engraver.cc +++ b/lily/figured-bass-engraver.cc @@ -1,10 +1,21 @@ /* - figured-bass-engraver.cc -- implement Figured_bass_engraver + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2005--2010 Han-Wen Nienhuys - (c) 2005--2006 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "engraver.hh" @@ -28,6 +39,10 @@ struct Figure_group SCM number_; SCM alteration_; + SCM augmented_; + SCM diminished_; + SCM augmented_slash_; + SCM text_; Item *figure_item_; Stream_event *current_event_; @@ -40,25 +55,46 @@ struct Figure_group continuation_line_ = 0; number_ = SCM_EOL; alteration_ = SCM_EOL; + augmented_ = SCM_EOL; + diminished_ = SCM_EOL; + augmented_slash_ = SCM_EOL; + text_ = SCM_EOL; group_ = 0; current_event_ = 0; } + /* Mark the members of the struct as used for the GUILE Garbage Collection */ + void gc_mark () const + { + scm_gc_mark (number_); + scm_gc_mark (alteration_); + scm_gc_mark (augmented_); + scm_gc_mark (diminished_); + scm_gc_mark (augmented_slash_); + scm_gc_mark (text_); + } + bool group_is_equal_to (Stream_event *evt) const + { + return + ly_is_equal (number_, evt->get_property ("figure")) + && ly_is_equal (alteration_, evt->get_property ("alteration")) + && ly_is_equal (augmented_, evt->get_property ("augmented")) + && ly_is_equal (diminished_, evt->get_property ("diminished")) + && ly_is_equal (augmented_slash_, evt->get_property ("augmented-slash")) + && ly_is_equal (text_, evt->get_property ("text")); + } bool is_continuation () const { return current_event_ && !force_no_continuation_ - && ly_is_equal (number_, - current_event_->get_property ("figure")) - && ly_is_equal (alteration_, - current_event_->get_property ("alteration")); + && group_is_equal_to (current_event_); } }; struct Figured_bass_engraver : public Engraver { - TRANSLATOR_DECLARATIONS(Figured_bass_engraver); - void clear_spanners(); + TRANSLATOR_DECLARATIONS (Figured_bass_engraver); + void clear_spanners (); void add_brackets (); void create_grobs (); @@ -89,8 +125,7 @@ Figured_bass_engraver::derived_mark () const { for (vsize i = 0; i < groups_.size (); i++) { - scm_gc_mark (groups_[i].number_); - scm_gc_mark (groups_[i].alteration_); + groups_[i].gc_mark (); } } @@ -129,15 +164,26 @@ Figured_bass_engraver::start_translation_timestep () new_events_.clear (); for (vsize i = 0; i < groups_.size (); i++) groups_[i].current_event_ = 0; + continuation_ = false; + + } IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest); void Figured_bass_engraver::listen_rest (Stream_event *ev) { - new_event_found_ = true; - rest_event_ = ev; + if (to_boolean (get_property ("ignoreFiguredBassRest"))) + { + new_event_found_ = true; + + /* + No ASSIGN_EVENT_ONCE () ; otherwise we get warnings about + polyphonic rests. + */ + rest_event_ = ev; + } } IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure); @@ -145,22 +191,24 @@ void Figured_bass_engraver::listen_bass_figure (Stream_event *ev) { new_event_found_ = true; - stop_moment_ = now_mom () + get_event_length (ev); - - SCM fig = ev->get_property ("figure"); - for (vsize i = 0; i < groups_.size (); i++) + Moment stop = now_mom () + get_event_length (ev, now_mom ()); + stop_moment_ = max (stop_moment_, stop); + + if (to_boolean (get_property ("useBassFigureExtenders"))) { - if (!groups_[i].current_event_ - && ly_is_equal (groups_[i].number_, fig)) + 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_event_ + && groups_[i].group_is_equal_to (ev)) + { + groups_[i].current_event_ = ev; + groups_[i].force_no_continuation_ + = to_boolean (ev->get_property ("no-continuation")); + continuation_ = true; + return; + } } - } - + } new_events_.push_back (ev); } @@ -170,13 +218,13 @@ Figured_bass_engraver::center_continuations (vector const &consecutive if (consecutive_lines.size () == 2) { vector left_figs; - for (vsize j = consecutive_lines.size(); j--;) + for (vsize j = consecutive_lines.size (); j--;) left_figs.push_back (consecutive_lines[j]->get_bound (LEFT)); SCM ga = Grob_array::make_array (); unsmob_grob_array (ga)->set_array (left_figs); - for (vsize j = consecutive_lines.size(); j--;) + for (vsize j = consecutive_lines.size (); j--;) consecutive_lines[j]->set_object ("figures", unsmob_grob_array (ga)->smobbed_copy ()); } @@ -186,14 +234,14 @@ void Figured_bass_engraver::center_repeated_continuations () { vector consecutive_lines; - for (vsize i = 0; i <= groups_.size(); i++) + for (vsize i = 0; i <= groups_.size (); i++) { if (i < groups_.size () && groups_[i].continuation_line_ && (consecutive_lines.empty () - || (consecutive_lines[0]->get_bound(LEFT)->get_column () + || (consecutive_lines[0]->get_bound (LEFT)->get_column () == groups_[i].continuation_line_->get_bound (LEFT)->get_column () - && consecutive_lines[0]->get_bound(RIGHT)->get_column () + && consecutive_lines[0]->get_bound (RIGHT)->get_column () == groups_[i].continuation_line_->get_bound (RIGHT)->get_column ()))) consecutive_lines.push_back (groups_[i].continuation_line_); else @@ -217,7 +265,7 @@ Figured_bass_engraver::clear_spanners () } if (to_boolean (get_property ("figuredBassCenterContinuations"))) - center_repeated_continuations(); + center_repeated_continuations (); for (vsize i = 0; i < groups_.size (); i++) { @@ -272,6 +320,10 @@ Figured_bass_engraver::add_brackets () void Figured_bass_engraver::process_music () { + bool use_extenders = to_boolean (get_property ("useBassFigureExtenders")); + if (alignment_ && !use_extenders) + clear_spanners (); + if (rest_event_) { clear_spanners (); @@ -295,7 +347,6 @@ Figured_bass_engraver::process_music () /* Don't need to sync alignments, if we're not using extenders. */ - bool use_extenders = to_boolean (get_property ("useBassFigureExtenders")); if (!use_extenders) { clear_spanners (); @@ -331,21 +382,26 @@ Figured_bass_engraver::process_music () { groups_[i].number_ = SCM_BOOL_F; groups_[i].alteration_ = SCM_BOOL_F; + groups_[i].augmented_ = SCM_BOOL_F; + groups_[i].diminished_ = SCM_BOOL_F; + groups_[i].augmented_slash_ = SCM_BOOL_F; + groups_[i].text_ = SCM_BOOL_F; } } if (use_extenders) { vector junk_continuations; - for (vsize i = 0; i < groups_.size(); i++) + for (vsize i = 0; i < groups_.size (); i++) { - Figure_group &group = groups_[i]; + Figure_group &group = groups_[i]; if (group.is_continuation ()) { if (!group.continuation_line_) { - Spanner * line = make_spanner ("BassFigureContinuation", SCM_EOL); + Spanner * line + = make_spanner ("BassFigureContinuation", SCM_EOL); Item * item = group.figure_item_; group.continuation_line_ = line; line->set_bound (LEFT, item); @@ -372,7 +428,7 @@ Figured_bass_engraver::process_music () { for (vsize i = 0; i <= junk_continuations.size (); i++) { - if (i < junk_continuations.size() + if (i < junk_continuations.size () && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 1)) consecutive.push_back (groups_[junk_continuations[i]].continuation_line_); else @@ -395,7 +451,8 @@ Figured_bass_engraver::process_music () void Figured_bass_engraver::create_grobs () { - Grob *muscol = dynamic_cast (unsmob_grob (get_property ("currentMusicalColumn"))); + Grob *muscol + = dynamic_cast (unsmob_grob (get_property ("currentMusicalColumn"))); if (!alignment_) { alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL); @@ -404,7 +461,7 @@ Figured_bass_engraver::create_grobs () alignment_->set_bound (RIGHT, muscol); SCM proc = get_property ("figuredBassFormatter"); - for (vsize i = 0; i < groups_.size(); i++) + for (vsize i = 0; i < groups_.size (); i++) { Figure_group &group = groups_[i]; @@ -432,8 +489,12 @@ Figured_bass_engraver::create_grobs () 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.current_event_->get_property ("text"); + SCM text = group.text_; if (!Text_interface::is_markup (text) && ly_is_procedure (proc)) { @@ -465,17 +526,14 @@ Figured_bass_engraver::create_grobs () ADD_TRANSLATOR (Figured_bass_engraver, /* doc */ - "Make figured bass numbers.", + /* create */ "BassFigure " "BassFigureAlignment " "BassFigureBracket " "BassFigureContinuation " - "BassFigureLine " - , - /* accept */ - "bass-figure-event rest-event", + "BassFigureLine ", /* read */ "figuredBassAlterationDirection " @@ -483,7 +541,8 @@ ADD_TRANSLATOR (Figured_bass_engraver, "figuredBassFormatter " "implicitBassFigures " "useBassFigureExtenders " - , + "ignoreFiguredBassRest ", /* write */ - ""); + "" + );