lilypond-0.1.12
[lilypond.git] / lily / dynamic-grav.cc
blob9da5b1386ca53657b63287e5e8b4e2d04737cceb
1 /*
2 dynamic-reg.cc -- implement Dynamic_engraver
4 source file of the GNU LilyPond music typesetter
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"
19 Dynamic_engraver::Dynamic_engraver()
21 dir_ = CENTER;
22 do_post_move_processing();
23 dynamic_p_ =0;
24 to_end_cresc_p_ = cresc_p_ = 0;
25 cresc_req_l_ = 0;
28 void
29 Dynamic_engraver::do_post_move_processing()
31 dynamic_req_l_arr_.clear();
34 bool
35 Dynamic_engraver::do_try_request (Request * r)
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;
43 void
44 Dynamic_engraver::do_process_requests()
46 Crescendo* new_cresc_p=0;
47 for (int i=0; i < dynamic_req_l_arr_.size(); i++)
49 Dynamic_req *dreq_l = dynamic_req_l_arr_[i];
50 if (dreq_l->absdynamic())
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_);
57 td_p->text_str_ = paper()->lookup_l ()->dynamic (loud).tex;
58 td_p->style_str_ = "dynamic";
60 assert (!dynamic_p_) ; // TODO
62 dynamic_p_ = new Text_item (td_p);
63 announce_element (Score_elem_info (dynamic_p_, dreq_l));
65 else if (dreq_l->span_dynamic())
68 Span_dynamic_req* span_l = dreq_l->span_dynamic();
69 if (span_l->spantype == Span_req::STOP)
71 if (!cresc_p_)
73 span_l->warning ("Can't find cresc to end ");
75 else
77 assert (!to_end_cresc_p_);
78 to_end_cresc_p_ =cresc_p_;
79 cresc_p_ = 0;
82 else if (span_l->spantype == Span_req::START)
84 cresc_req_l_ = span_l;
85 assert (!new_cresc_p);
86 new_cresc_p = new Crescendo;
87 new_cresc_p->grow_dir_ = span_l->dynamic_dir_;
88 announce_element (Score_elem_info (new_cresc_p, span_l));
93 if (new_cresc_p)
95 cresc_p_ = new_cresc_p;
96 cresc_p_->set_bounds(LEFT,get_staff_info().musical_l ());
97 if (dynamic_p_)
99 cresc_p_->dyn_b_drul_[LEFT] = true;
104 void
105 Dynamic_engraver::do_pre_move_processing()
107 Staff_symbol* s_l = get_staff_info().staff_sym_l_;
108 if (dynamic_p_)
110 dynamic_p_->set_staffsym (s_l);
111 typeset_element (dynamic_p_);
112 dynamic_p_ = 0;
114 if (to_end_cresc_p_)
116 if (dynamic_p_)
117 to_end_cresc_p_->dyn_b_drul_[RIGHT]=true;
119 to_end_cresc_p_->set_bounds(RIGHT,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;
126 void
127 Dynamic_engraver::set_feature (Feature i)
129 if (i.type_ == "vdir")
130 dir_ = (Direction) int(i.value_);
134 IMPLEMENT_IS_TYPE_B1(Dynamic_engraver,Engraver);
135 ADD_THIS_ENGRAVER(Dynamic_engraver);
137 Dynamic_engraver::~Dynamic_engraver()
139 delete dynamic_p_;
140 delete to_end_cresc_p_;
141 if (cresc_p_)
143 cresc_req_l_->warning ("unended crescendo");
145 delete cresc_p_;
147 void
148 Dynamic_engraver::acknowledge_element (Score_elem_info i)
150 if (i.elem_l_->name() == Note_column::static_name ())
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_);