+void
+Figured_bass_engraver::create_grobs ()
+{
+ Grob *muscol
+ = dynamic_cast<Item *> (unsmob_grob (get_property ("currentMusicalColumn")));
+ if (!alignment_)
+ {
+ alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
+ alignment_->set_bound (LEFT, muscol);
+ }
+ alignment_->set_bound (RIGHT, muscol);
+
+ SCM proc = get_property ("figuredBassFormatter");
+ for (vsize i = 0; i < groups_.size (); i++)
+ {
+ Figure_group &group = groups_[i];
+
+ if (group.current_event_)
+ {
+ Item *item
+ = make_item ("BassFigure", group.current_event_->self_scm ());
+ group.assign_from_event (group.current_event_, item);
+
+ if (!group.group_)
+ {
+ group.group_ = make_spanner ("BassFigureLine", SCM_EOL);
+ group.group_->set_bound (LEFT, muscol);
+ Align_interface::add_element (alignment_, group.group_);
+ }
+
+ 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);
+ }
+
+ SCM text = group.text_;
+ if (!Text_interface::is_markup (text)
+ && ly_is_procedure (proc))
+ {
+ 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);
+ }
+
+ if (group.continuation_line_)
+ {
+ /*
+ UGH should connect to the bass staff, and get the note heads.
+ For now, simply set the hidden figure to a default value to
+ ensure the extenders of different figures always end at the same
+ position, e.g. in <12 5> <12 5>
+ */
+ group.figure_item_->set_property ("transparent", SCM_BOOL_T);
+ group.figure_item_->set_property ("text", ly_string2scm ("0"));
+ group.continuation_line_->set_bound (RIGHT, group.figure_item_);
+ }
+
+ if (groups_[i].group_)
+ groups_[i].group_->set_bound (RIGHT, muscol);
+
+ }
+
+}
+
+void
+Figured_bass_engraver::add_brackets ()
+{
+ vector<Grob *> 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.",
+
+ /* create */
+ "BassFigure "
+ "BassFigureAlignment "
+ "BassFigureBracket "
+ "BassFigureContinuation "
+ "BassFigureLine ",
+
+ /* read */
+ "figuredBassAlterationDirection "
+ "figuredBassCenterContinuations "
+ "figuredBassFormatter "
+ "implicitBassFigures "
+ "useBassFigureExtenders "
+ "ignoreFiguredBassRest ",
+
+ /* write */
+ ""
+ );