2 dynamic-reg.cc -- implement Dynamic_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "crescendo.hh"
10 #include "musical-request.hh"
12 #include "paper-def.hh"
13 #include "paper-column.hh"
14 #include "staff-symbol.hh"
15 #include "note-column.hh"
16 #include "text-item.hh"
17 #include "side-position-interface.hh"
18 #include "engraver.hh"
20 #include "note-head.hh"
23 print text & hairpin dynamics.
25 class Dynamic_engraver
: public Engraver
28 Crescendo
* to_end_cresc_p_
;
31 Span_req
* cresc_req_l_
;
32 Array
<Request
*> dynamic_req_l_arr_
;
35 VIRTUAL_COPY_CONS(Translator
);
39 virtual void do_removal_processing ();
40 virtual void acknowledge_element (Score_element_info
);
41 virtual bool do_try_music (Music
*req_l
);
42 virtual void do_process_requests();
43 virtual void do_pre_move_processing();
44 virtual void do_post_move_processing();
49 Dynamic_engraver::Dynamic_engraver()
51 do_post_move_processing();
54 to_end_cresc_p_
= cresc_p_
= 0;
60 Dynamic_engraver::do_post_move_processing()
62 dynamic_req_l_arr_
.clear();
66 Dynamic_engraver::do_try_music (Music
* m
)
68 Request
* r
= dynamic_cast<Request
*> (m
);
70 if(Text_script_req
* d
= dynamic_cast <Text_script_req
*> (r
))
72 if (d
->style_str_
!= "dynamic")
75 else if (Span_req
* s
= dynamic_cast <Span_req
*> (r
))
77 if (s
-> span_type_str_
!= "crescendo"
78 && s
->span_type_str_
!= "decrescendo")
84 for (int i
=0; i
< dynamic_req_l_arr_
.size (); i
++)
85 if (r
->equal_b (dynamic_req_l_arr_
[i
]))
88 dynamic_req_l_arr_
.push (r
);
94 Dynamic_engraver::do_process_requests()
96 Crescendo
* new_cresc_p
=0;
98 for (int i
=0; i
< dynamic_req_l_arr_
.size(); i
++)
100 if (Text_script_req
*absd
=
101 dynamic_cast<Text_script_req
*> ( dynamic_req_l_arr_
[i
]))
105 dynamic_req_l_arr_
[i
]->warning (_("Got a dynamic already. Continuing dazed and confused."));
109 String loud
= absd
->text_str_
;
111 text_p_
= new Text_item
;
112 text_p_
->set_elt_property ("text",
113 ly_str02scm (loud
.ch_C()));
114 text_p_
->set_elt_property ("style", gh_str02scm ("dynamic"));
115 text_p_
->set_elt_property ("script-priority",
117 text_p_
->set_elt_property ("staff-support", SCM_BOOL_T
);
119 Side_position_interface (text_p_
).set_axis (Y_AXIS
);
122 if (absd
->get_direction ())
124 text_p_
->set_elt_property ("direction", gh_int2scm (absd
->get_direction ()));
131 SCM prop
= get_property ("dynamicDirection", 0);
134 prop
= get_property ("verticalDirection", 0);
137 if (isdir_b (prop
) && to_dir (prop
))
138 text_p_
->set_elt_property ("direction", prop
);
140 prop
= get_property ("dynamicPadding", 0);
141 if (gh_number_p(prop
))
143 text_p_
->set_elt_property ("padding", prop
);
145 announce_element (Score_element_info (text_p_
, absd
));
147 else if (Span_req
*span_l
148 = dynamic_cast <Span_req
*> (dynamic_req_l_arr_
[i
]))
150 if (span_l
->span_dir_
== STOP
)
154 span_l
->warning (_ ("Can't find (de)crescendo to end"));
158 assert (!to_end_cresc_p_
);
159 to_end_cresc_p_
=cresc_p_
;
164 else if (span_l
->span_dir_
== START
)
166 cresc_req_l_
= span_l
;
167 assert (!new_cresc_p
);
168 new_cresc_p
= new Crescendo
;
170 ->set_elt_property ("grow-direction",
171 gh_int2scm ((span_l
->span_type_str_
== "crescendo") ? BIGGER
: SMALLER
));
173 new_cresc_p
->set_elt_property ("staff-support", SCM_BOOL_T
);
176 Side_position_interface (new_cresc_p
).set_axis (Y_AXIS
);
177 announce_element (Score_element_info (new_cresc_p
, span_l
));
186 ::warning (_ ("Too many crescendi here"));
189 typeset_element (cresc_p_
);
194 cresc_p_
= new_cresc_p
;
195 cresc_p_
->set_bounds(LEFT
,get_staff_info().musical_pcol_l ());
199 index_set_cell (cresc_p_
->get_elt_property ("dynamic-drul"),
202 index_set_cell (to_end_cresc_p_
->get_elt_property ("dynamic-drul"),
209 Dynamic_engraver::do_pre_move_processing()
216 ADD_THIS_TRANSLATOR(Dynamic_engraver
);
219 Dynamic_engraver::do_removal_processing ()
223 typeset_element (cresc_p_
);
224 cresc_req_l_
->warning (_ ("unended crescendo"));
232 Dynamic_engraver::typeset_all ()
236 to_end_cresc_p_
->set_bounds(RIGHT
,get_staff_info().musical_pcol_l ());
237 typeset_element (to_end_cresc_p_
);
245 typeset_element (text_p_
);
252 Dynamic_engraver::acknowledge_element (Score_element_info i
)
254 if (dynamic_cast<Stem
*> (i
.elem_l_
)
255 || dynamic_cast<Note_head
*> (i
.elem_l_
)
259 Side_position_interface (text_p_
).add_support (i
.elem_l_
);
262 Side_position_interface (to_end_cresc_p_
).add_support (i
.elem_l_
);
265 Side_position_interface(cresc_p_
).add_support (i
.elem_l_
);