]> git.donarmstrong.com Git - lilypond.git/blob - lily/dynamic-grav.cc
a159d32d7268dfa34460f2bff1ad64a107962f5f
[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   dir_i_ =0;
22   do_post_move_processing();
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 =Dynamic_req::loudness_str (
55                 dreq_l->absdynamic()->loudness_);
56             
57             td_p->text_str_ = paper()->lookup_l ()->dynamic (loud).tex;
58             td_p->style_str_ = "dynamic";
59
60             assert (!dynamic_p_) ; // TODO
61                 
62             dynamic_p_ = new Text_item (td_p);
63             announce_element (Score_elem_info (dynamic_p_, dreq_l));
64           }
65         else if (dreq_l->span_dynamic()) 
66           {
67
68             Span_dynamic_req* span_l = dreq_l->span_dynamic();
69             if (span_l->spantype == Span_req::STOP) 
70               {
71                 if (!cresc_p_) 
72                   {
73                     span_l->warning ("Can't find cresc to end ");
74                   }
75                 else 
76                   {
77                     assert (!to_end_cresc_p_);
78                     to_end_cresc_p_ =cresc_p_;
79                     cresc_p_ = 0;
80                   }
81               }
82             else if (span_l->spantype == Span_req::START) 
83               {
84                 cresc_req_l_ = span_l;
85                 assert (!new_cresc_p);
86                 new_cresc_p  = new Crescendo;
87                 new_cresc_p->grow_dir_i_ = span_l->dynamic_dir_i_;
88                 announce_element (Score_elem_info (new_cresc_p, span_l));
89               }
90           }
91     }
92
93   if ( new_cresc_p) 
94     {
95         cresc_p_ = new_cresc_p;
96         cresc_p_->left_col_l_ = get_staff_info().musical_l ();
97         if (dynamic_p_) 
98           {
99             cresc_p_->left_dyn_b_ = true;
100           }
101     }
102 }
103
104 void
105 Dynamic_engraver::do_pre_move_processing()
106 {
107   Staff_symbol* s_l = get_staff_info().staff_sym_l_;
108   if (dynamic_p_) 
109     {
110         dynamic_p_->set_staffsym (s_l);
111         typeset_element (dynamic_p_);
112         dynamic_p_ = 0;
113     }
114   if ( to_end_cresc_p_) 
115     {
116         if (dynamic_p_)
117             to_end_cresc_p_->right_dyn_b_=true;
118         
119         to_end_cresc_p_->right_col_l_ = get_staff_info().musical_l ();
120         to_end_cresc_p_->set_staffsym (s_l);
121         typeset_element (to_end_cresc_p_);
122         to_end_cresc_p_ = 0;
123     }
124 }
125
126 void
127 Dynamic_engraver::set_feature (Feature i)
128 {
129   if (i.type_ == "vdir")        
130         dir_i_ = i.value_;
131 }
132
133
134 IMPLEMENT_IS_TYPE_B1(Dynamic_engraver,Engraver);
135 ADD_THIS_ENGRAVER(Dynamic_engraver);
136
137 Dynamic_engraver::~Dynamic_engraver()
138 {
139   delete dynamic_p_;
140   delete to_end_cresc_p_;
141   if (cresc_p_) 
142     {
143         cresc_req_l_->warning ("unended crescendo");
144     }
145   delete cresc_p_;
146 }
147 void
148 Dynamic_engraver::acknowledge_element (Score_elem_info i)
149 {
150   if (i.elem_l_->name() == Note_column::static_name ()) 
151     {
152         if (dynamic_p_) dynamic_p_->add_support (i.elem_l_);
153         if (to_end_cresc_p_)
154             to_end_cresc_p_->add_support (i.elem_l_);
155         if (cresc_p_) 
156             cresc_p_->add_support (i.elem_l_);
157     }
158 }