2 dynamic-reg.cc -- implement Dynamic_register
4 source file of the LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "crescendo.hh"
10 #include "dynamic-reg.hh"
11 #include "musical-request.hh"
12 #include "text-item.hh"
14 #include "paper-def.hh"
15 #include "score-column.hh"
16 #include "staff-sym.hh"
18 Dynamic_register::Dynamic_register()
21 post_move_processing();
23 to_end_cresc_p_ = cresc_p_ = 0;
28 Dynamic_register::post_move_processing()
30 dynamic_req_l_arr_.set_size(0);
34 Dynamic_register::try_request(Request * r)
36 Musical_req * m = r->musical();
37 if (!m || !m->dynamic())
39 dynamic_req_l_arr_.push(m->dynamic());
43 Dynamic_register::process_requests()
45 Crescendo* new_cresc_p=0;
46 for (int i=0; i < dynamic_req_l_arr_.size(); i++) {
47 Dynamic_req *dreq_l = dynamic_req_l_arr_[i];
48 if (dreq_l->absdynamic()) {
49 Text_def * td_p = new Text_def;
51 String loud =Dynamic_req::loudness_str(
52 dreq_l->absdynamic()->loudness_);
54 td_p->text_str_ = paper()->lookup_l()->dynamic(loud).tex;
55 td_p->style_str_ = "dynamic";
57 assert (!dynamic_p_) ; // TODO
59 dynamic_p_ = new Text_item(td_p);
60 announce_element(Staff_elem_info(dynamic_p_, dreq_l));
61 } else if (dreq_l->span_dynamic()) {
63 Span_dynamic_req* span_l = dreq_l->span_dynamic();
64 if (span_l->spantype == Span_req::STOP) {
66 span_l->warning("Can't find cresc to end " );
68 assert(!to_end_cresc_p_);
69 to_end_cresc_p_ =cresc_p_;
72 } else if (span_l->spantype == Span_req::START) {
73 cresc_req_l_ = span_l;
75 new_cresc_p = new Crescendo;
76 new_cresc_p->grow_dir_i_ = span_l->dynamic_dir_i_;
77 announce_element(Staff_elem_info(new_cresc_p, span_l));
83 cresc_p_ = new_cresc_p;
84 cresc_p_->left_col_l_ = get_staff_info().musical_l()->pcol_l_;
86 cresc_p_->left_dyn_b_ = true;
92 Dynamic_register::pre_move_processing()
94 Staff_symbol* s_l = get_staff_info().staff_sym_l_;
96 dynamic_p_->set_staffsym(s_l);
97 typeset_element(dynamic_p_);
100 if ( to_end_cresc_p_) {
102 to_end_cresc_p_->right_dyn_b_=true;
104 to_end_cresc_p_->right_col_l_ = get_staff_info().musical_l()->pcol_l_;
105 to_end_cresc_p_->set_staffsym(s_l);
106 typeset_element(to_end_cresc_p_);
112 Dynamic_register::acceptable_request_b(Request*r)const
114 Musical_req * m = r->musical();
115 return (m && m->dynamic());
119 Dynamic_register::set_feature(Features i)
121 dir_i_ = i.direction_i_;
124 IMPLEMENT_STATIC_NAME(Dynamic_register);
125 ADD_THIS_REGISTER(Dynamic_register);
127 Dynamic_register::~Dynamic_register()
130 delete to_end_cresc_p_;
132 cresc_req_l_->warning("unended crescendo");