/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2005--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2005--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
void add_brackets ();
void create_grobs ();
- void center_continuations (vector<Spanner*> const &consecutive_lines);
+ void center_continuations (vector<Spanner *> const &consecutive_lines);
void center_repeated_continuations ();
protected:
vector<Figure_group> groups_;
Moment stop_moment_;
bool have_rest_;
- DECLARE_TRANSLATOR_LISTENER (rest);
- DECLARE_TRANSLATOR_LISTENER (bass_figure);
+ void listen_rest (Stream_event *);
+ void listen_bass_figure (Stream_event *);
virtual void derived_mark () const;
void process_music ();
};
-Figured_bass_engraver::Figured_bass_engraver ()
+Figured_bass_engraver::Figured_bass_engraver (Context *c)
+ : Engraver (c)
{
alignment_ = 0;
continuation_ = false;
{
if (now_mom ().main_part_ < stop_moment_.main_part_
|| now_mom ().grace_part_ < Rational (0))
- return ;
+ return;
have_rest_ = 0;
new_events_.clear ();
if (groups_.empty ()
|| now_mom ().main_part_ < stop_moment_.main_part_
|| now_mom ().grace_part_ < Rational (0))
- return ;
+ return;
bool found = false;
for (vsize i = 0; !found && i < groups_.size (); i++)
- found = found || groups_[i].current_event_;
+ found = found || groups_[i].current_event_;
if (!found)
clear_spanners ();
}
-IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest);
void
Figured_bass_engraver::listen_rest (Stream_event *)
{
have_rest_ = true;
}
-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, now_mom ());
+ Moment stop = now_mom () + get_event_length (ev, now_mom ());
stop_moment_ = max (stop_moment_, stop);
// Handle no-continuation here, don't even add it to the already existing
}
void
-Figured_bass_engraver::center_continuations (vector<Spanner*> const &consecutive_lines)
+Figured_bass_engraver::center_continuations (vector<Spanner *> const &consecutive_lines)
{
- if (consecutive_lines.size () == 2)
- {
- vector<Grob*> left_figs;
- for (vsize j = consecutive_lines.size (); j--;)
- left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
+ vector<Grob *> left_figs;
+ 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);
+ SCM ga = Grob_array::make_array ();
+ unsmob<Grob_array> (ga)->set_array (left_figs);
- for (vsize j = consecutive_lines.size (); j--;)
- consecutive_lines[j]->set_object ("figures",
- unsmob_grob_array (ga)->smobbed_copy ());
- }
+ for (vsize j = consecutive_lines.size (); j--;)
+ consecutive_lines[j]->set_object ("figures",
+ unsmob<Grob_array> (ga)->smobbed_copy ());
}
void
Figured_bass_engraver::center_repeated_continuations ()
{
- vector<Spanner*> consecutive_lines;
+ vector<Spanner *> consecutive_lines;
for (vsize i = 0; i <= groups_.size (); i++)
{
if (i < groups_.size ()
{
if (groups_[i].group_)
{
- announce_end_grob (groups_[i].group_ , SCM_EOL);
+ 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);
+ announce_end_grob (groups_[i].continuation_line_, SCM_EOL);
groups_[i].continuation_line_ = 0;
}
}
// If we have a rest, or we have no new or continued events, clear all spanners
bool ignore_rest = to_boolean (get_property ("ignoreFiguredBassRest"));
- if ((ignore_rest && have_rest_) ||
- (!continuation_ && new_events_.empty ()))
+ if ((ignore_rest && have_rest_)
+ || (!continuation_ && new_events_.empty ()))
{
clear_spanners ();
groups_.clear ();
{
if (!group.continuation_line_)
{
- Spanner * line
+ Spanner *line
= make_spanner ("BassFigureContinuation", SCM_EOL);
- Item * item = group.figure_item_;
+ Item *item = group.figure_item_;
group.continuation_line_ = line;
line->set_bound (LEFT, item);
/*
Ugh, repeated code.
*/
- vector<Spanner*> consecutive;
+ vector<Spanner *> consecutive;
if (to_boolean (get_property ("figuredBassCenterContinuations")))
{
for (vsize i = 0; i <= junk_continuations.size (); i++)
{
if (i < junk_continuations.size ()
- && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 1))
+ && (i == 0 || junk_continuations[i - 1] == junk_continuations[i] - 1))
consecutive.push_back (groups_[junk_continuations[i]].continuation_line_);
else
{
Figured_bass_engraver::create_grobs ()
{
Grob *muscol
- = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
+ = unsmob<Item> (get_property ("currentMusicalColumn"));
if (!alignment_)
{
alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
Align_interface::add_element (alignment_, group.group_);
}
- if (scm_memq (group.number_, get_property ("implicitBassFigures")) != SCM_BOOL_F)
+ if (scm_is_true (scm_memq (group.number_, get_property ("implicitBassFigures"))))
{
item->set_property ("transparent", SCM_BOOL_T);
item->set_property ("implicit", SCM_BOOL_T);
void
Figured_bass_engraver::add_brackets ()
{
- vector<Grob*> encompass;
+ vector<Grob *> encompass;
bool inside = false;
- for (vsize i = 0; i < groups_.size (); i ++)
+ for (vsize i = 0; i < groups_.size (); i++)
{
if (!groups_[i].current_event_)
continue;
if (inside && groups_[i].figure_item_)
encompass.push_back (groups_[i].figure_item_);
- if (to_boolean (groups_[i].current_event_->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_event_->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,
}
}
+void
+Figured_bass_engraver::boot ()
+{
+ ADD_LISTENER (Figured_bass_engraver, rest);
+ ADD_LISTENER (Figured_bass_engraver, bass_figure);
+}
+
ADD_TRANSLATOR (Figured_bass_engraver,
/* doc */
"Make figured bass numbers.",
/* write */
""
- );
+ );