#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"
SCM alteration_;
Item *figure_item_;
- Music *current_music_;
+ Stream_event *current_event_;
bool force_no_continuation_;
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"));
}
};
void add_brackets ();
void create_grobs ();
- void center_continuations (Link_array<Spanner> const &consecutive_lines);
+ void center_continuations (vector<Spanner*> const &consecutive_lines);
void center_repeated_continuations ();
protected:
- std::vector<Figure_group> groups_;
+ vector<Figure_group> groups_;
Spanner *alignment_;
- Link_array<Music> new_musics_;
+ vector<Stream_event *> 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 ();
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 ();
alignment_ = 0;
continuation_ = false;
rest_event_ = 0;
- new_music_found_ = false;
+ new_event_found_ = false;
}
void
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"))
- {
- rest_event_ = m;
- return true;
- }
- else
- {
- stop_moment_ = now_mom () + m->get_length ();
+ new_event_found_ = true;
+ rest_event_ = ev;
+}
+
+IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure);
+void
+Figured_bass_engraver::listen_bass_figure (Stream_event *ev)
+{
+ new_event_found_ = true;
+ stop_moment_ = now_mom () + get_event_length (ev);
- SCM fig = m->get_property ("figure");
- for (vsize i = 0; i < groups_.size (); i++)
+ SCM fig = ev->get_property ("figure");
+ for (vsize i = 0; i < groups_.size (); i++)
+ {
+ if (!groups_[i].current_event_
+ && ly_is_equal (groups_[i].number_, fig))
{
- 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;
- }
+ groups_[i].current_event_ = ev;
+ groups_[i].force_no_continuation_
+ = to_boolean (ev->get_property ("no-continuation"));
+ continuation_ = true;
+ return;
}
-
- new_musics_.push_back (m);
-
- return true;
}
+
+ new_events_.push_back (ev);
}
void
-Figured_bass_engraver::center_continuations (Link_array<Spanner> const &consecutive_lines)
+Figured_bass_engraver::center_continuations (vector<Spanner*> const &consecutive_lines)
{
if (consecutive_lines.size () == 2)
{
- Link_array<Grob> left_figs;
+ vector<Grob*> left_figs;
for (vsize j = consecutive_lines.size(); j--;)
left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
void
Figured_bass_engraver::center_repeated_continuations ()
{
- Link_array<Spanner> consecutive_lines;
+ vector<Spanner*> consecutive_lines;
for (vsize i = 0; i <= groups_.size(); i++)
{
if (i < groups_.size ()
{
if (!alignment_)
return;
-
- alignment_ = 0;
+
+ if (alignment_)
+ {
+ announce_end_grob (alignment_, SCM_EOL);
+ alignment_ = 0;
+ }
+
if (to_boolean (get_property ("figuredBassCenterContinuations")))
center_repeated_continuations();
- groups_.clear ();
+ for (vsize i = 0; i < groups_.size (); i++)
+ {
+ if (groups_[i].group_)
+ {
+ announce_end_grob (groups_[i].group_ , SCM_EOL);
+ groups_[i].group_ = 0;
+ }
+
+ if (groups_[i].continuation_line_)
+ {
+ announce_end_grob (groups_[i].continuation_line_ , SCM_EOL);
+ groups_[i].continuation_line_ = 0;
+ }
+ }
+
+ /* Check me, groups_.clear () ? */
}
void
Figured_bass_engraver::add_brackets ()
{
- Link_array<Grob> encompass;
+ vector<Grob*> encompass;
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,
if (rest_event_)
{
clear_spanners ();
+ groups_.clear ();
return;
}
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.
bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
if (!use_extenders)
{
- if (to_boolean (get_property ("figuredBassCenterContinuations")))
- center_repeated_continuations ();
- alignment_ = 0;
- for (vsize i = 0; i < groups_.size (); i++)
- {
- groups_[i].group_ = 0;
- groups_[i].continuation_line_ = 0;
- }
+ clear_spanners ();
}
if (!continuation_)
- clear_spanners ();
-
+ {
+ clear_spanners ();
+ groups_.clear ();
+ }
+
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 ())
groups_.push_back (group);
}
- groups_[k].current_music_ = new_musics_[i];
+ groups_[k].current_event_ = new_events_[i];
groups_[k].figure_item_ = 0;
k++;
}
if (use_extenders)
{
- std::vector<int> junk_continuations;
+ vector<int> junk_continuations;
for (vsize i = 0; i < groups_.size(); i++)
{
Figure_group &group = groups_[i];
/*
Ugh, repeated code.
*/
- Link_array<Spanner> consecutive;
+ vector<Spanner*> consecutive;
if (to_boolean (get_property ("figuredBassCenterContinuations")))
{
for (vsize i = 0; i <= junk_continuations.size (); i++)
{
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);
}
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 ());
}
group.figure_item_->set_property ("transparent", SCM_BOOL_T);
group.continuation_line_->set_bound (RIGHT, group.figure_item_);
}
-
if (groups_[i].group_)
groups_[i].group_->set_bound (RIGHT, muscol);
+
}
}