X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpiano-pedal-performer.cc;h=fd32e92684349e8f3dad98b04b8ce2c5fdecab28;hb=cf33d3709d3b5028fa9c208aa490ce066960ad5c;hp=f5cfd9089587c05076fb5a470062cffd504faa9f;hpb=28d97df78de5e56962730b42119c2d9b73401fa7;p=lilypond.git diff --git a/lily/piano-pedal-performer.cc b/lily/piano-pedal-performer.cc index f5cfd90895..fd32e92684 100644 --- a/lily/piano-pedal-performer.cc +++ b/lily/piano-pedal-performer.cc @@ -1,5 +1,5 @@ /* - piano-pedal-performer.cc -- implement Piano_pedal_performer + piano-pedal-performer.cc -- implement Piano_pedal_performer source file of the GNU LilyPond music typesetter @@ -11,96 +11,132 @@ #include "musical-request.hh" #include "audio-item.hh" - -/* - TODO: - sostenuto - una-chorda ? - */ - /** perform Piano pedals */ class Piano_pedal_performer : public Performer { + struct Pedal_info + { + char const *name_; + Span_req* start_req_l_; + Drul_array req_l_drul_; + }; + public: - VIRTUAL_COPY_CONS (Translator); + TRANSLATOR_DECLARATIONS(Piano_pedal_performer); + ~Piano_pedal_performer (); - Piano_pedal_performer (); - protected: - virtual bool do_try_music (Music*); - virtual void do_process_music (); - virtual void do_pre_move_processing (); - virtual void do_post_move_processing (); + virtual void initialize (); + virtual bool try_music (Music*); + virtual void create_audio_elements (); + virtual void stop_translation_timestep (); + virtual void start_translation_timestep (); private: Link_array audio_p_arr_; - Span_req* span_start_req_l_; - Drul_array span_req_l_drul_; + Pedal_info * info_alist_; }; -ADD_THIS_TRANSLATOR (Piano_pedal_performer); - Piano_pedal_performer::Piano_pedal_performer () { - span_req_l_drul_[START] = 0; - span_req_l_drul_[STOP] = 0; - span_start_req_l_ = 0; + info_alist_ = 0; +} + +Piano_pedal_performer::~Piano_pedal_performer () +{ + delete[] info_alist_; +} + +void +Piano_pedal_performer::initialize () +{ + info_alist_ = new Pedal_info[4]; + Pedal_info *p = info_alist_; + + char * names [] = { "Sostenuto", "Sustain", "UnaCorda", 0 }; + char **np = names ; + do + { + p->name_ = *np; + p->req_l_drul_[START] = 0; + p->req_l_drul_[STOP] = 0; + p->start_req_l_ = 0; + + p++; + } + while (* (np ++)); } void -Piano_pedal_performer::do_process_music () +Piano_pedal_performer::create_audio_elements () { - if (span_req_l_drul_[STOP]) + for (Pedal_info*p = info_alist_; p && p->name_; p ++) + { - if (!span_start_req_l_) + if (p->req_l_drul_[STOP]) { - span_req_l_drul_[STOP]->warning (_ ("can't find start of piano_pedal")); + if (!p->start_req_l_) + { + p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: `%s'", String (p->name_))); + } + else + { + Audio_piano_pedal* a = new Audio_piano_pedal; + a->type_str_ = String (p->name_); + a->dir_ = STOP; + audio_p_arr_.push (a); + } + p->start_req_l_ = 0; } - else + + if (p->req_l_drul_[START]) { - Audio_piano_pedal* p = new Audio_piano_pedal; - p->type_b_ = false; - audio_p_arr_.push (p); + p->start_req_l_ = p->req_l_drul_[START]; + Audio_piano_pedal* a = new Audio_piano_pedal; + a->type_str_ = String (p->name_); + a->dir_ = START; + audio_p_arr_.push (a); } - span_start_req_l_ = 0; - } - - if (span_req_l_drul_[START]) - { - span_start_req_l_ = span_req_l_drul_[START]; - Audio_piano_pedal* p = new Audio_piano_pedal; - p->type_b_ = true; - audio_p_arr_.push (p); + p->req_l_drul_[START] = 0; + p->req_l_drul_[STOP] = 0; } } void -Piano_pedal_performer::do_pre_move_processing () +Piano_pedal_performer::stop_translation_timestep () { - for (int i=0; i < audio_p_arr_.size (); i++) + for (int i=0; i< audio_p_arr_.size (); i++) play_element (audio_p_arr_[i]); audio_p_arr_.clear (); } void -Piano_pedal_performer::do_post_move_processing () +Piano_pedal_performer::start_translation_timestep () { - span_req_l_drul_[STOP] = 0; - span_req_l_drul_[START] = 0; + for (Pedal_info*p = info_alist_; p && p->name_; p ++) + { + p->req_l_drul_[STOP] = 0; + p->req_l_drul_[START] = 0; + } } bool -Piano_pedal_performer::do_try_music (Music* r) +Piano_pedal_performer::try_music (Music* r) { - if (Span_req * s = dynamic_cast(r)) + if (Span_req * s = dynamic_cast (r)) { - if (s-> span_type_str_ == "sustain") + for (Pedal_info*p = info_alist_; p->name_; p ++) { - span_req_l_drul_[s->span_dir_] = s; - return true; + if (scm_equal_p (s->get_mus_property ("span-type"), + ly_str02scm (p->name_)) == SCM_BOOL_T) + { + p->req_l_drul_[s->get_span_dir ()] = s; + return true; + } } } return false; } +ENTER_DESCRIPTION (Piano_pedal_performer, "","","","","" );