+void
+Piano_pedal_engraver::create_bracket_grobs (Pedal_info *p, SCM pedaltype)
+{
+
+ if (p->req_l_drul_[STOP])
+ {
+ if (!p->start_req_l_)
+ {
+ p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: `%s'", p->name_));
+ }
+ else if (!p->req_l_drul_[START])
+ spanner_count_ -- ;
+
+ assert (!p->finished_bracket_p_ && p->bracket_p_);
+
+ Grob *cmc = unsmob_grob (get_property ("currentMusicalColumn"));
+ p->bracket_p_->set_bound (RIGHT, cmc);
+
+ /*
+ Set properties so that the molecule-creating function will
+ know whether the right edge should be flared ___/
+ */
+ SCM eleft = ly_car (p->bracket_p_->get_grob_property ("edge-widen"));
+ SCM eright = (p->req_l_drul_[START] ? edge_width_drul_[RIGHT] : gh_double2scm (0));
+ p->bracket_p_->set_grob_property ("edge-widen", gh_cons (eleft, eright));
+
+ p->finished_bracket_p_ = p->bracket_p_;
+ p->bracket_p_ = 0;
+ p->current_bracket_req_ = 0;
+ p->start_req_l_ = p->req_l_drul_[START];
+ }
+
+ if (p->req_l_drul_[START])
+ {
+ p->start_req_l_ = p->req_l_drul_[START];
+ p->current_bracket_req_ = p->req_l_drul_[START];
+
+ p->bracket_p_ = new Spanner (get_property ("PianoPedalBracket"));
+
+ /*
+ Set properties so that the molecule-creating function will
+ know whether the left edge should be flared \___
+ */
+
+ SCM ew = p->bracket_p_->get_grob_property ("edge-widen");
+ edge_width_drul_[LEFT] = ly_car (ew);
+ edge_width_drul_[RIGHT] = ly_cdr (ew);
+
+ SCM eleft = ( (bool) p->req_l_drul_[STOP] ?
+ edge_width_drul_[LEFT] :
+ gh_double2scm (0));
+ SCM eright = gh_double2scm (0);
+ p->bracket_p_->set_grob_property ("edge-widen", gh_cons (eleft, eright));
+
+ /* Set this property for 'mixed style' pedals, Ped._______/\ ,
+ so the molecule function will shorten the ____ line by the length of the Ped. text.
+ */
+
+ p->bracket_p_->set_grob_property ("text-start",
+ pedaltype == ly_symbol2scm ("mixed") ?
+ gh_bool2scm ( (bool) ! p->req_l_drul_[STOP]) :
+ gh_bool2scm (false));
+
+ /*
+ Mixed style: Store a pointer to the preceding text for use in
+ calculating the length of the line
+ */
+ if (p->item_p_)
+ p->bracket_p_->set_grob_property ("pedal-text", p->item_p_->self_scm ());
+
+ p->bracket_p_->set_bound (LEFT, unsmob_grob (get_property ("currentMusicalColumn")));
+ Axis_group_interface::add_element (p->line_spanner_, p->bracket_p_);
+
+ add_bound_item (p->line_spanner_, p->bracket_p_->get_bound (LEFT));
+ announce_grob (p->bracket_p_, p->req_l_drul_[START]->self_scm ());
+
+ if (!p->req_l_drul_[STOP])
+ {
+ spanner_count_ ++;
+ previous_p_[spanner_count_] = p->line_spanner_;
+
+ if (spanner_count_ > 1)
+ // position new pedal spanner below the current one
+ Side_position_interface::add_support (p->line_spanner_, previous_p_[spanner_count_ - 1]);
+ }
+ }
+
+ p->req_l_drul_[START] = 0;
+ p->req_l_drul_[STOP] = 0;
+}
+
+void
+Piano_pedal_engraver::finalize ()
+{
+ for (Pedal_info*p = info_list_; p && p->name_; p ++)
+ {
+ /*
+ suicide?
+ */
+ if (p->line_spanner_
+ && !p->line_spanner_->live())
+ p->line_spanner_ = 0;
+
+ if (p->line_spanner_)
+ {
+ p->finished_line_spanner_ = p->line_spanner_;
+ typeset_all ();
+ }
+ if (p->bracket_p_
+ && !p->bracket_p_->live())
+ p->bracket_p_ = 0;
+ if (p->bracket_p_)
+ {
+ p->current_bracket_req_->origin ()->warning (_ ("unterminated pedal bracket"));
+ p->bracket_p_->suicide ();
+ p->bracket_p_ = 0;
+ }
+ }
+}
+
+