2 clef.cc -- implement Clef_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
7 Mats Bengtsson <matsb@s3.kth.se>
12 #include "clef-engraver.hh"
13 #include "clef-item.hh"
15 #include "command-request.hh"
16 #include "time-description.hh"
19 #include "note-head.hh"
20 #include "key-item.hh"
21 #include "local-key-item.hh"
23 Clef_engraver::Clef_engraver()
34 Ugh. Should have support for Dictionaries in mudela.
37 Clef_engraver::set_type (String s)
39 if (s.right_str(2) == "_8") // Down one octave
42 s = s.left_str(s.length_i() - 2);
44 else if (s.right_str(2) == "^8") // Up one octave
47 s = s.left_str(s.length_i() - 2);
53 s == "G" || s == "G2")
55 clef_type_str_ = "violin";
56 clef_position_i_ = -2;
58 else if (s == "french")
60 clef_type_str_ = "violin";
61 clef_position_i_ = -4;
63 else if (s == "soprano")
65 clef_type_str_ = "alto";
66 clef_position_i_ = -4;
68 else if (s == "mezzosoprano")
70 clef_type_str_ = "alto";
71 clef_position_i_ = -2;
75 clef_type_str_ = "alto";
78 else if (s == "tenor")
80 clef_type_str_ = "alto";
83 else if (s == "baritone")
85 clef_type_str_ = "alto";
88 else if (s == "varbaritone")
90 clef_type_str_ = "bass";
93 else if (s == "bass" || s == "F")
95 clef_type_str_ = "bass";
98 else if (s == "subbass")
100 clef_type_str_ = "bass";
101 clef_position_i_ = 4;
105 switch(toupper (s[0]))
108 clef_type_str_ = "bass";
111 clef_type_str_ = "violin";
114 clef_type_str_ = "alto";
119 clef_position_i_ = 2 * (s[1] - '0') - 6;
121 if (clef_type_str_ == "violin")
122 c0_position_i_ = clef_position_i_ - 4;
123 else if (clef_type_str_ == "alto")
124 c0_position_i_ = clef_position_i_;
125 else if (clef_type_str_ == "bass")
126 c0_position_i_ = clef_position_i_ + 4;
131 c0_position_i_ -= (int) octave_dir_ * 7;
137 Clef_engraver::read_req (Clef_change_req*c_l)
139 if (!set_type (c_l->clef_str_))
140 c_l->error (_ ("unknown clef type "));
145 Generate a clef at the start of a measure. (when you see a Bar,
149 Clef_engraver::acknowledge_element (Score_element_info info)
151 if (info.elem_l_->is_type_b (Bar::static_name ())
152 && clef_type_str_.length_i())
156 clef_p_->default_b_ = true;
159 /* ugh; should make Clef_referenced baseclass */
160 Item * it_l =dynamic_cast <Item *> (info.elem_l_);
163 if (it_l->is_type_b (Note_head::static_name ()))
165 Note_head * h = (Note_head*)it_l;
166 h->position_i_ += c0_position_i_;
168 else if (it_l->is_type_b (Local_key_item::static_name ()))
170 Local_key_item *i = (Local_key_item*)it_l;
171 i->c0_position_i_ =c0_position_i_;
173 else if (it_l->is_type_b (Key_item::static_name ()))
175 Key_item *k = (Key_item*)it_l;
176 k-> set_c_position (c0_position_i_);
182 Clef_engraver::do_creation_processing()
184 Scalar def = get_property ("defaultClef");
185 if (def.to_bool ()) // egcs: Scalar to bool is ambiguous
188 if (clef_type_str_.length_i ())
191 clef_p_->default_b_ = false;
196 Clef_engraver::do_try_request (Request * r_l)
198 Command_req* creq_l= dynamic_cast <Command_req *> (r_l);
199 if (!creq_l || !dynamic_cast <Clef_change_req *> (creq_l))
202 clef_req_l_ = dynamic_cast <Clef_change_req *> (creq_l);
203 read_req (clef_req_l_);
208 Clef_engraver::create_clef()
212 clef_p_ = new Clef_item;
213 clef_p_->break_priority_i_ = -2; // ugh
214 announce_element (Score_element_info (clef_p_,clef_req_l_));
216 clef_p_->read (*this);
220 Clef_engraver::do_process_requests()
225 clef_p_->default_b_ = false;
230 Clef_engraver::do_pre_move_processing()
234 typeset_element (clef_p_);
239 Clef_engraver::do_post_move_processing()
245 Clef_engraver::do_removal_processing()
256 IMPLEMENT_IS_TYPE_B1(Clef_engraver,Engraver);
257 ADD_THIS_TRANSLATOR(Clef_engraver);