2 figured-bass-position-engraver.cc -- implement Figured_bass_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #include "engraver.hh"
14 #include "side-position-interface.hh"
15 #include "translator.icc"
16 #include "axis-group-interface.hh"
18 class Figured_bass_position_engraver : public Engraver
20 TRANSLATOR_DECLARATIONS(Figured_bass_position_engraver);
22 Spanner *bass_figure_alignment_;
24 vector<Grob*> support_;
25 vector<Grob*> span_support_;
27 DECLARE_ACKNOWLEDGER (note_column);
28 DECLARE_ACKNOWLEDGER (slur);
29 DECLARE_END_ACKNOWLEDGER (slur);
30 DECLARE_ACKNOWLEDGER (tie);
31 DECLARE_ACKNOWLEDGER (bass_figure_alignment);
32 DECLARE_END_ACKNOWLEDGER (bass_figure_alignment);
34 virtual void finalize ();
35 void start_spanner ();
37 void stop_translation_timestep ();
40 Figured_bass_position_engraver::Figured_bass_position_engraver ()
43 bass_figure_alignment_ = 0;
47 Figured_bass_position_engraver::start_spanner ()
49 assert (!positioner_);
51 positioner_ = make_spanner("BassFigureAlignmentPositioning", bass_figure_alignment_->self_scm ());
52 positioner_->set_bound (LEFT, bass_figure_alignment_->get_bound (LEFT));
53 Axis_group_interface::add_element (positioner_, bass_figure_alignment_);
57 Figured_bass_position_engraver::stop_spanner ()
59 if (positioner_ && !positioner_->get_bound (RIGHT))
61 positioner_->set_bound (RIGHT, bass_figure_alignment_->get_bound (RIGHT));
65 bass_figure_alignment_ = 0;
69 Figured_bass_position_engraver::finalize ()
75 Figured_bass_position_engraver::acknowledge_note_column (Grob_info info)
77 support_.push_back (info.grob ());
81 Figured_bass_position_engraver::acknowledge_end_slur (Grob_info info)
83 vector<Grob*>::iterator i = find (span_support_.begin (), span_support_.end (),
86 if (i < span_support_.end ())
87 span_support_.erase (i);
91 Figured_bass_position_engraver::acknowledge_slur (Grob_info info)
93 span_support_.push_back (info.grob ());
97 Figured_bass_position_engraver::acknowledge_tie (Grob_info info)
99 support_.push_back (info.grob ());
103 Figured_bass_position_engraver::stop_translation_timestep ()
107 for (vsize i = 0; i < span_support_.size (); i++)
108 Side_position_interface::add_support (positioner_, span_support_[i]);
109 for (vsize i = 0; i < support_.size (); i++)
110 Side_position_interface::add_support (positioner_, support_[i]);
117 Figured_bass_position_engraver::acknowledge_end_bass_figure_alignment (Grob_info info)
124 Figured_bass_position_engraver::acknowledge_bass_figure_alignment (Grob_info info)
126 bass_figure_alignment_ = dynamic_cast<Spanner*> (info.grob ());
131 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,note_column);
132 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,slur);
133 ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,slur);
135 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,tie);
136 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
137 ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
139 ADD_TRANSLATOR (Figured_bass_position_engraver,
141 "Position figured bass alignments over notes.",
144 "BassFigureAlignmentPositioning ",