]> git.donarmstrong.com Git - lilypond.git/blob - lily/dynamic-grav.cc
b451af045e0a1f9c77f1d398dcbabd0ac214f393
[lilypond.git] / lily / dynamic-grav.cc
1 /*
2   dynamic-reg.cc -- implement Dynamic_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8 #include "debug.hh"
9 #include "crescendo.hh"
10 #include "dynamic-grav.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 = r->musical();
38   if (!m || !m->dynamic())
39     return false;
40   dynamic_req_l_arr_.push (m->dynamic());
41   return true;
42 }
43 void
44 Dynamic_engraver::do_process_requests()
45 {
46   Crescendo*  new_cresc_p=0;
47   for (int i=0; i < dynamic_req_l_arr_.size(); i++)
48     {
49       Dynamic_req *dreq_l = dynamic_req_l_arr_[i];
50       if (dreq_l->absdynamic())
51         {
52           Text_def * td_p = new Text_def;
53           td_p->align_i_ = 0;
54           String loud = dreq_l->absdynamic()->loudness_str ();
55           td_p->text_str_ = paper()->lookup_l ()->dynamic (loud).tex_;
56           td_p->style_str_ = "dynamic";
57
58           assert (!dynamic_p_) ; // TODO
59
60           dynamic_p_ = new Text_item (td_p);
61           announce_element (Score_elem_info (dynamic_p_, dreq_l));
62         }
63       else if (dreq_l->span_dynamic())
64         {
65
66           Span_dynamic_req* span_l = dreq_l->span_dynamic();
67           if (span_l->spantype == Span_req::STOP)
68             {
69               if (!cresc_p_)
70                 {
71                   span_l->warning (_("Can't find cresc to end "));
72                 }
73               else
74                 {
75                   assert (!to_end_cresc_p_);
76                   to_end_cresc_p_ =cresc_p_;
77                   cresc_p_ = 0;
78                 }
79             }
80           else if (span_l->spantype == Span_req::START)
81             {
82               cresc_req_l_ = span_l;
83               assert (!new_cresc_p);
84               new_cresc_p  = new Crescendo;
85               new_cresc_p->grow_dir_ = span_l->dynamic_dir_;
86               announce_element (Score_elem_info (new_cresc_p, span_l));
87             }
88         }
89     }
90
91   if (new_cresc_p)
92     {
93       cresc_p_ = new_cresc_p;
94       cresc_p_->set_bounds(LEFT,get_staff_info().musical_l ());
95       if (dynamic_p_)
96         {
97           cresc_p_->dyn_b_drul_[LEFT] = true;
98         }
99     }
100 }
101
102 void
103 Dynamic_engraver::do_pre_move_processing()
104 {
105   Staff_symbol* s_l = get_staff_info().staff_sym_l_;
106   if (dynamic_p_)
107     {
108       
109       dynamic_p_->add_support (s_l);
110       typeset_element (dynamic_p_);
111       dynamic_p_ = 0;
112     }
113   if (to_end_cresc_p_)
114     {
115       if (dynamic_p_)
116         to_end_cresc_p_->dyn_b_drul_[RIGHT]=true;
117
118       to_end_cresc_p_->set_bounds(RIGHT,get_staff_info().musical_l ());
119       to_end_cresc_p_->add_support (s_l);
120       typeset_element (to_end_cresc_p_);
121       to_end_cresc_p_ = 0;
122     }
123 }
124
125
126 IMPLEMENT_IS_TYPE_B1(Dynamic_engraver,Engraver);
127 ADD_THIS_TRANSLATOR(Dynamic_engraver);
128
129 void
130 Dynamic_engraver::do_removal_processing ()
131 {
132   if (cresc_p_)
133     {
134       typeset_element (cresc_p_ );
135       
136       cresc_req_l_->warning (_("unended crescendo"));
137       cresc_p_ =0;
138     }
139   if (to_end_cresc_p_)
140     {
141       typeset_element (to_end_cresc_p_);
142       to_end_cresc_p_ =0;
143     }
144   if (dynamic_p_)
145     {
146       typeset_element (dynamic_p_);
147       dynamic_p_ =0;
148     }
149 }
150
151 void
152 Dynamic_engraver::acknowledge_element (Score_elem_info i)
153 {
154   if (i.elem_l_->is_type_b (Note_column::static_name ()))
155     {
156       if (dynamic_p_) dynamic_p_->add_support (i.elem_l_);
157       if (to_end_cresc_p_)
158         to_end_cresc_p_->add_support (i.elem_l_);
159       if (cresc_p_)
160         cresc_p_->add_support (i.elem_l_);
161     }
162 }