X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpiano-pedal-align-engraver.cc;h=0d07872db08b18eeb82ad7aef6a1d6747879908a;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=c82cb7eae135d361571d7e169fa626fbb25094b5;hpb=0e5d83a9ceb4a143f83d22406d7eb816314ff9f7;p=lilypond.git diff --git a/lily/piano-pedal-align-engraver.cc b/lily/piano-pedal-align-engraver.cc index c82cb7eae1..0d07872db0 100644 --- a/lily/piano-pedal-align-engraver.cc +++ b/lily/piano-pedal-align-engraver.cc @@ -1,12 +1,22 @@ -/* - piano-pedal-align-engraver.cc -- implement Piano_pedal_align_engraver - - source file of the GNU LilyPond music typesetter - - (c) 2006--2009 Han-Wen Nienhuys - -*/ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2006--2015 Han-Wen Nienhuys + + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ #include "engraver.hh" @@ -17,18 +27,17 @@ #include "warn.hh" #include "axis-group-interface.hh" +#include "translator.icc" /* TODO: * Detach from pedal specifics, - + * Also use this engraver for dynamics. - */ - struct Pedal_align_info { Spanner *line_spanner_; @@ -66,18 +75,19 @@ public: protected: virtual void finalize (); - - DECLARE_ACKNOWLEDGER (piano_pedal_script); - DECLARE_ACKNOWLEDGER (piano_pedal_bracket); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_END_ACKNOWLEDGER (piano_pedal_bracket); + void acknowledge_piano_pedal_script (Grob_info); + void acknowledge_piano_pedal_bracket (Grob_info); + void acknowledge_note_column (Grob_info); + + void acknowledge_end_piano_pedal_bracket (Grob_info); void stop_translation_timestep (); void start_translation_timestep (); - + private: - enum Pedal_type { + enum Pedal_type + { SOSTENUTO, SUSTAIN, UNA_CORDA, @@ -90,7 +100,8 @@ private: Spanner *make_line_spanner (Pedal_type t, SCM); }; -Piano_pedal_align_engraver::Piano_pedal_align_engraver () +Piano_pedal_align_engraver::Piano_pedal_align_engraver (Context *c) + : Engraver (c) { } @@ -103,46 +114,45 @@ Piano_pedal_align_engraver::start_translation_timestep () void Piano_pedal_align_engraver::stop_translation_timestep () { - for (int i = 0; i < NUM_PEDAL_TYPES; i ++) + for (int i = 0; i < NUM_PEDAL_TYPES; i++) { if (pedal_info_[i].line_spanner_) - { - - if (pedal_info_[i].carrying_item_) - { - if (!pedal_info_[i].line_spanner_->get_bound (LEFT)) - pedal_info_[i].line_spanner_->set_bound (LEFT, - pedal_info_[i].carrying_item_); - - pedal_info_[i].line_spanner_->set_bound (RIGHT, - pedal_info_[i].carrying_item_); - } - else if (pedal_info_[i].carrying_spanner_ - || pedal_info_[i].finished_carrying_spanner_ - ) - { - if (!pedal_info_[i].line_spanner_->get_bound (LEFT) - && pedal_info_[i].carrying_spanner_->get_bound (LEFT)) - pedal_info_[i].line_spanner_->set_bound (LEFT, - pedal_info_[i].carrying_spanner_->get_bound (LEFT)); - - - if (pedal_info_[i].finished_carrying_spanner_) - pedal_info_[i].line_spanner_->set_bound (RIGHT, - pedal_info_[i].finished_carrying_spanner_->get_bound (RIGHT)); - } - - for (vsize j = 0; j < supports_.size (); j++) - { - Side_position_interface::add_support (pedal_info_[i].line_spanner_, supports_[j]); - } - - if (pedal_info_[i].is_finished ()) - { - announce_end_grob (pedal_info_[i].line_spanner_, SCM_EOL); - pedal_info_[i].clear (); - } - } + { + + if (pedal_info_[i].carrying_item_) + { + if (!pedal_info_[i].line_spanner_->get_bound (LEFT)) + pedal_info_[i].line_spanner_->set_bound (LEFT, + pedal_info_[i].carrying_item_); + + pedal_info_[i].line_spanner_->set_bound (RIGHT, + pedal_info_[i].carrying_item_); + } + else if (pedal_info_[i].carrying_spanner_ + || pedal_info_[i].finished_carrying_spanner_ + ) + { + if (!pedal_info_[i].line_spanner_->get_bound (LEFT) + && pedal_info_[i].carrying_spanner_->get_bound (LEFT)) + pedal_info_[i].line_spanner_->set_bound (LEFT, + pedal_info_[i].carrying_spanner_->get_bound (LEFT)); + + if (pedal_info_[i].finished_carrying_spanner_) + pedal_info_[i].line_spanner_->set_bound (RIGHT, + pedal_info_[i].finished_carrying_spanner_->get_bound (RIGHT)); + } + + for (vsize j = 0; j < supports_.size (); j++) + { + Side_position_interface::add_support (pedal_info_[i].line_spanner_, supports_[j]); + } + + if (pedal_info_[i].is_finished ()) + { + announce_end_grob (pedal_info_[i].line_spanner_, SCM_EOL); + pedal_info_[i].clear (); + } + } pedal_info_[i].carrying_item_ = 0; } @@ -158,11 +168,10 @@ Piano_pedal_align_engraver::get_grob_pedal_type (Grob_info g) if (g.event_cause ()->in_event_class ("una-corda-event")) return UNA_CORDA; - programming_error ("Unknown piano pedal type. Defaulting to sustain"); + programming_error ("Unknown piano pedal type. Defaulting to sustain"); return SUSTAIN; } - Spanner * Piano_pedal_align_engraver::make_line_spanner (Pedal_type t, SCM cause) { @@ -170,24 +179,24 @@ Piano_pedal_align_engraver::make_line_spanner (Pedal_type t, SCM cause) if (!sp) { switch (t) - { - case (SOSTENUTO): - sp = make_spanner ("SostenutoPedalLineSpanner", cause); - break; - case (SUSTAIN): - sp = make_spanner ("SustainPedalLineSpanner", cause); - break; - case (UNA_CORDA): - sp = make_spanner ("UnaCordaPedalLineSpanner", cause); - break; - default: - programming_error ("No pedal type fonud!") ; - return sp; - } - + { + case (SOSTENUTO): + sp = make_spanner ("SostenutoPedalLineSpanner", cause); + break; + case (SUSTAIN): + sp = make_spanner ("SustainPedalLineSpanner", cause); + break; + case (UNA_CORDA): + sp = make_spanner ("UnaCordaPedalLineSpanner", cause); + break; + default: + programming_error ("No pedal type fonud!"); + return sp; + } + pedal_info_[t].line_spanner_ = sp; } - + return sp; } @@ -218,50 +227,51 @@ void Piano_pedal_align_engraver::acknowledge_piano_pedal_script (Grob_info gi) { Pedal_type type = get_grob_pedal_type (gi); - + Grob *sp = make_line_spanner (type, gi.grob ()->self_scm ()); Axis_group_interface::add_element (sp, gi.grob ()); pedal_info_[type].carrying_item_ = gi.grob (); } - void Piano_pedal_align_engraver::finalize () { - for (int i = 0; i < NUM_PEDAL_TYPES; i ++) + for (int i = 0; i < NUM_PEDAL_TYPES; i++) { if (pedal_info_[i].line_spanner_) - { - SCM cc = get_property ("currentCommandColumn"); - Item *c = unsmob_item (cc); - pedal_info_[i].line_spanner_->set_bound (RIGHT, c); + { + SCM cc = get_property ("currentCommandColumn"); + Item *c = unsmob (cc); + pedal_info_[i].line_spanner_->set_bound (RIGHT, c); - pedal_info_[i].clear (); - } + pedal_info_[i].clear (); + } } } -#include "translator.icc" - -ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, note_column); -ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); -ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_script); -ADD_END_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); +void +Piano_pedal_align_engraver::boot () +{ + ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, note_column); + ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); + ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_script); + ADD_END_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); +} ADD_TRANSLATOR (Piano_pedal_align_engraver, - /* doc */ - "Align piano pedal symbols and brackets.", + /* doc */ + "Align piano pedal symbols and brackets.", - /* create */ - "SostenutoPedalLineSpanner " - "SustainPedalLineSpanner " - "UnaCordaPedalLineSpanner ", + /* create */ + "SostenutoPedalLineSpanner " + "SustainPedalLineSpanner " + "UnaCordaPedalLineSpanner ", - /* read */ - "currentCommandColumn ", + /* read */ + "currentCommandColumn ", - /* write */ - "" - ); + /* write */ + "" + );