X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpiano-pedal-performer.cc;h=8393fbe83d7079a1167f155b9a3b530552293444;hb=9bea477a992947adbbba48bc479c3f551cde8225;hp=f5cfd9089587c05076fb5a470062cffd504faa9f;hpb=28d97df78de5e56962730b42119c2d9b73401fa7;p=lilypond.git diff --git a/lily/piano-pedal-performer.cc b/lily/piano-pedal-performer.cc index f5cfd90895..8393fbe83d 100644 --- a/lily/piano-pedal-performer.cc +++ b/lily/piano-pedal-performer.cc @@ -1,106 +1,145 @@ /* - piano-pedal-performer.cc -- implement Piano_pedal_performer + piano-pedal-performer.cc -- implement Piano_pedal_performer source file of the GNU LilyPond music typesetter - (c) 2000 Jan Nieuwenhuizen + (c) 2000--2005 Jan Nieuwenhuizen */ #include "performer.hh" -#include "command-request.hh" -#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_; + Music *start_req_; + Drul_array req_drul_; + }; + public: - VIRTUAL_COPY_CONS (Translator); - - Piano_pedal_performer (); + TRANSLATOR_DECLARATIONS (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_; + Link_array audios_; + 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::do_process_music () +Piano_pedal_performer::initialize () { - if (span_req_l_drul_[STOP]) + info_alist_ = new Pedal_info[4]; + Pedal_info *p = info_alist_; + + char *names [] = { "Sostenuto", "Sustain", "UnaCorda", 0 }; + char **np = names; + do { - if (!span_start_req_l_) + p->name_ = *np; + p->req_drul_[START] = 0; + p->req_drul_[STOP] = 0; + p->start_req_ = 0; + + p++; + } + while (* (np++)); +} + +void +Piano_pedal_performer::create_audio_elements () +{ + for (Pedal_info *p = info_alist_; p && p->name_; p++) + + { + if (p->req_drul_[STOP]) { - span_req_l_drul_[STOP]->warning (_ ("can't find start of piano_pedal")); + if (!p->start_req_) + { + p->req_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_string_ = String (p->name_); + a->dir_ = STOP; + audios_.push (a); + } + p->start_req_ = 0; } - else + + if (p->req_drul_[START]) { - Audio_piano_pedal* p = new Audio_piano_pedal; - p->type_b_ = false; - audio_p_arr_.push (p); + p->start_req_ = p->req_drul_[START]; + Audio_piano_pedal *a = new Audio_piano_pedal; + a->type_string_ = String (p->name_); + a->dir_ = START; + audios_.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_drul_[START] = 0; + p->req_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++) - play_element (audio_p_arr_[i]); - audio_p_arr_.clear (); + for (int i = 0; i < audios_.size (); i++) + play_element (audios_[i]); + audios_.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_drul_[STOP] = 0; + p->req_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 (r->is_mus_type ("pedal-event")) { - 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; + String nm = p->name_ + String ("Event"); + if (ly_c_equal_p (r->get_property ("name"), + scm_str2symbol (nm.to_str0 ()))) + { + Direction d = to_dir (r->get_property ("span-direction")); + p->req_drul_[d] = r; + return true; + } } } return false; } + +ADD_TRANSLATOR (Piano_pedal_performer, "", "", + "pedal-event", + "", "", "");