2 piano-pedal-performer.cc -- implement Piano_pedal_performer
4 source file of the GNU LilyPond music typesetter
6 (c) 2000 Jan Nieuwenhuizen <janneke@gnu.org>
9 #include "performer.hh"
10 #include "command-request.hh"
11 #include "musical-request.hh"
12 #include "audio-item.hh"
13 #include "dictionary.hh"
14 #include "dictionary-iter.hh"
19 class Piano_pedal_performer : public Performer
23 Span_req* start_req_l_;
24 Drul_array<Span_req*> req_l_drul_;
28 VIRTUAL_COPY_CONS (Translator);
30 Piano_pedal_performer ();
33 virtual bool do_try_music (Music*);
34 virtual void do_process_music ();
35 virtual void do_pre_move_processing ();
36 virtual void do_post_move_processing ();
39 Link_array<Audio_piano_pedal> audio_p_arr_;
40 Dictionary<Pedal_info> info_dict_;
43 ADD_THIS_TRANSLATOR (Piano_pedal_performer);
45 Piano_pedal_performer::Piano_pedal_performer ()
47 (void)info_dict_["Sostenuto"];
48 (void)info_dict_["Sustain"];
49 (void)info_dict_["UnaChorda"];
50 for (Dictionary_iter <Pedal_info> i (info_dict_); i.ok (); i++)
52 Pedal_info& p = i.val_ref ();
53 p.req_l_drul_[START] = 0;
54 p.req_l_drul_[STOP] = 0;
60 Piano_pedal_performer::do_process_music ()
62 for (Dictionary_iter <Pedal_info> i (info_dict_); i.ok (); i++)
64 Pedal_info& p = i.val_ref ();
65 if (p.req_l_drul_[STOP])
69 p.req_l_drul_[STOP]->warning (_f ("can't find start of piano pedal: %s", i.key ()));
73 Audio_piano_pedal* a = new Audio_piano_pedal;
74 a->type_str_ = i.key ();
76 audio_p_arr_.push (a);
81 if (p.req_l_drul_[START])
83 p.start_req_l_ = p.req_l_drul_[START];
84 Audio_piano_pedal* a = new Audio_piano_pedal;
85 a->type_str_ = i.key ();
87 audio_p_arr_.push (a);
93 Piano_pedal_performer::do_pre_move_processing ()
95 for (int i=0; i < audio_p_arr_.size (); i++)
96 play_element (audio_p_arr_[i]);
97 audio_p_arr_.clear ();
101 Piano_pedal_performer::do_post_move_processing ()
103 for (Dictionary_iter <Pedal_info> i (info_dict_); i.ok (); i++)
105 Pedal_info& p = i.val_ref ();
106 p.req_l_drul_[STOP] = 0;
107 p.req_l_drul_[START] = 0;
112 Piano_pedal_performer::do_try_music (Music* r)
114 for (Dictionary_iter <Pedal_info> i (info_dict_); i.ok (); i++)
116 Pedal_info& p = i.val_ref ();
117 if (Span_req * s = dynamic_cast<Span_req*>(r))
119 if (s->span_type_str_ == i.key ())
121 p.req_l_drul_[s->span_dir_] = s;