]> git.donarmstrong.com Git - lilypond.git/blob - lily/dynamic-engraver.cc
2b38c4c08eec52421e1b5bd141a116d7773d0ff4
[lilypond.git] / lily / dynamic-engraver.cc
1 /*
2   dynamic-reg.cc -- implement Dynamic_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8 #include "debug.hh"
9 #include "crescendo.hh"
10 #include "dynamic-engraver.hh"
11 #include "musical-request.hh"
12 #include "text-item.hh"
13 #include "lookup.hh"
14 #include "paper-def.hh"
15 #include "score-column.hh"
16 #include "staff-sym.hh"
17 #include "note-column.hh"
18
19 Dynamic_engraver::Dynamic_engraver()
20 {
21   do_post_move_processing();
22   dir_ = CENTER;
23   dynamic_p_ =0;
24   to_end_cresc_p_ = cresc_p_ = 0;
25   cresc_req_l_ = 0;
26 }
27
28 void
29 Dynamic_engraver::do_post_move_processing()
30 {
31   dynamic_req_l_arr_.clear();
32 }
33
34 bool
35 Dynamic_engraver::do_try_request (Request * r)
36 {
37   Musical_req * m = dynamic_cast <Musical_req *> (r);
38   if (!m)
39     return false;
40   Dynamic_req * d = dynamic_cast <Dynamic_req *> (m);
41   if (!d)
42     return false;
43
44 #if 0
45   if (cresc_p_ && dynamic_cast <Span_dynamic_req *> (d)
46       && dynamic_cast <Span_dynamic_req *> (d)->spantype == Span_req::START)
47     return false;
48 #endif
49   for (int i=0; i < dynamic_req_l_arr_.size (); i++)
50     if (d->equal_b (dynamic_req_l_arr_[i]))
51       return true;
52
53   dynamic_req_l_arr_.push (dynamic_cast <Dynamic_req *> (m));
54   return true;
55 }
56 void
57 Dynamic_engraver::do_process_requests()
58 {
59   Crescendo*  new_cresc_p=0;
60   for (int i=0; i < dynamic_req_l_arr_.size(); i++)
61     {
62       Dynamic_req *dreq_l = dynamic_req_l_arr_[i];
63       if (dynamic_cast <Absolute_dynamic_req *> (dreq_l))
64         {
65
66           if (dynamic_p_)
67             {
68               dynamic_req_l_arr_[i]->warning (_("Got a dynamic already.  Continuing dazed and confused"));
69               continue;
70             }
71           
72           Text_def * td_p = new Text_def;
73           td_p->align_dir_ = CENTER;
74           String loud = dynamic_cast <Absolute_dynamic_req *> (dreq_l)->loudness_str ();
75           td_p->text_str_ = paper ()->lookup_l (0)->dynamic (loud).str_;
76           td_p->style_str_ = "dynamic";
77
78           
79
80           dynamic_p_ = new Text_item (td_p);
81           announce_element (Score_element_info (dynamic_p_, dreq_l));
82         }
83       else if (dynamic_cast <Span_dynamic_req *> (dreq_l))
84         {
85           Span_dynamic_req* span_l = dynamic_cast <Span_dynamic_req *> (dreq_l);
86           if (span_l->spantype == Span_req::STOP)
87             {
88               if (!cresc_p_)
89                 {
90                   span_l->warning (_ ("can't find (de)crescendo to end"));
91                 }
92               else
93                 {
94                   assert (!to_end_cresc_p_);
95                   to_end_cresc_p_ =cresc_p_;
96                   cresc_p_ = 0;
97                 }
98             }
99           else if (span_l->spantype == Span_req::START)
100             {
101               cresc_req_l_ = span_l;
102               assert (!new_cresc_p);
103               new_cresc_p  = new Crescendo;
104               new_cresc_p->grow_dir_ = span_l->dynamic_dir_;
105               announce_element (Score_element_info (new_cresc_p, span_l));
106             }
107         }
108     }
109
110   if (new_cresc_p)
111     {
112       if (cresc_p_)
113         {
114           ::warning (_ ("Too many crescendi here"));
115           typeset_element (cresc_p_);
116           cresc_p_ = 0;
117         }
118       
119       cresc_p_ = new_cresc_p;
120       cresc_p_->set_bounds(LEFT,get_staff_info().musical_l ());
121       if (dynamic_p_)
122         {
123           cresc_p_->dyn_b_drul_[LEFT] = true;
124         }
125     }
126 }
127
128 void
129 Dynamic_engraver::do_pre_move_processing()
130 {
131   Staff_symbol* s_l = get_staff_info().staff_sym_l_;
132   if (to_end_cresc_p_)
133     {
134       if (dynamic_p_)
135         to_end_cresc_p_->dyn_b_drul_[RIGHT]=true;
136
137
138       Scalar prop = get_property ("dynamicdir");
139       if (prop.isnum_b ())
140        {
141          to_end_cresc_p_->dir_ = (Direction) (int) prop;
142        }
143       to_end_cresc_p_->set_bounds(RIGHT,get_staff_info().musical_l ());
144       to_end_cresc_p_->add_support (s_l);
145       typeset_element (to_end_cresc_p_);
146       to_end_cresc_p_ = 0;
147     }
148   if (dynamic_p_)
149     {
150       Scalar prop = get_property ("dynamicdir");
151       if (prop.isnum_b ())
152        {
153          dynamic_p_->dir_ = (Direction) (int) prop;
154        }
155       
156       dynamic_p_->add_support (s_l);
157       typeset_element (dynamic_p_);
158       dynamic_p_ = 0;
159     }
160 }
161
162
163 IMPLEMENT_IS_TYPE_B1(Dynamic_engraver,Engraver);
164 ADD_THIS_TRANSLATOR(Dynamic_engraver);
165
166 void
167 Dynamic_engraver::do_removal_processing ()
168 {
169   if (cresc_p_)
170     {
171       typeset_element (cresc_p_ );
172       
173       cresc_req_l_->warning (_ ("unended crescendo"));
174       cresc_p_ =0;
175     }
176   if (to_end_cresc_p_)
177     {
178       typeset_element (to_end_cresc_p_);
179       to_end_cresc_p_ =0;
180     }
181   if (dynamic_p_)
182     {
183       typeset_element (dynamic_p_);
184       dynamic_p_ =0;
185     }
186 }
187
188 void
189 Dynamic_engraver::acknowledge_element (Score_element_info i)
190 {
191   if (i.elem_l_->is_type_b (Note_column::static_name ()))
192     {
193       if (dynamic_p_)
194         dynamic_p_->add_support (i.elem_l_);
195
196       if (to_end_cresc_p_)
197         to_end_cresc_p_->add_support (i.elem_l_);
198
199       if (cresc_p_)
200         cresc_p_->add_support (i.elem_l_);
201     }
202 }