2 clef.cc -- implement Clef_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
8 Mats Bengtsson <matsb@s3.kth.se>
13 #include "clef-engraver.hh"
14 #include "clef-item.hh"
16 #include "command-request.hh"
17 #include "time-description.hh"
18 #include "note-head.hh"
19 #include "key-item.hh"
20 #include "local-key-item.hh"
22 Clef_engraver::Clef_engraver()
30 create_default_b_
= true;
36 struct Clef_settings
{
41 {"treble", "treble", -2},
42 {"violin", "treble", -2},
45 {"french", "treble",-4 },
46 {"soprano", "alto",-4 },
47 {"mezzosoprano", "alto",-2 },
50 {"baritone", "alto",4 },
51 {"varbaritone", "bass",0 },
54 {"subbass", "bass",4},
59 Clef_engraver::set_type (String s
)
61 if (s
.right_str(2) == "_8") // Down one octave
64 s
= s
.left_str(s
.length_i() - 2);
66 else if (s
.right_str(2) == "^8") // Up one octave
69 s
= s
.left_str(s
.length_i() - 2);
75 for (Clef_settings
*c
= clef_settings
; !found
&& c
->name
; c
++)
79 clef_type_str_
= c
->cleftype
;
80 clef_position_i_
= c
->position
;
87 switch(toupper (s
[0]))
90 clef_type_str_
= "bass";
93 clef_type_str_
= "treble";
96 clef_type_str_
= "alto";
101 clef_position_i_
= 2 * (s
[1] - '0') - 6;
104 if (clef_type_str_
== "treble")
105 c0_position_i_
= clef_position_i_
- 4;
106 else if (clef_type_str_
== "alto")
107 c0_position_i_
= clef_position_i_
;
108 else if (clef_type_str_
== "bass")
109 c0_position_i_
= clef_position_i_
+ 4;
113 c0_position_i_
-= (int) octave_dir_
* 7;
120 Generate a clef at the start of a measure. (when you see a Bar,
124 Clef_engraver::acknowledge_element (Score_element_info info
)
126 if (dynamic_cast<Bar
*>(info
.elem_l_
)
127 && clef_type_str_
.length_i())
132 clef_p_
->set_elt_property(visibility_lambda_scm_sym
,
133 gh_eval_str ("postbreak_only_visibility"));
136 /* ugh; should make Clef_referenced baseclass */
137 Item
* it_l
=dynamic_cast <Item
*> (info
.elem_l_
);
140 if (Note_head
* h
= dynamic_cast<Note_head
*>(it_l
))
142 // h->position_i_ += c0_position_i_;
143 h
->position_i_
+= c0_position_i_
;
145 else if (Local_key_item
*i
= dynamic_cast<Local_key_item
*> (it_l
))
147 i
->c0_position_i_
=c0_position_i_
;
149 else if (Key_item
*k
= dynamic_cast<Key_item
*>(it_l
))
151 k
-> set_c_position (c0_position_i_
);
157 Clef_engraver::do_creation_processing()
159 create_default_b_
= true; // should read property.
160 Scalar def
= get_property ("createInitdefaultClef", 0);
161 if (def
.to_bool ()) // egcs: Scalar to bool is ambiguous
164 if (clef_type_str_
.length_i ())
167 clef_p_
->set_elt_property (non_default_scm_sym
, SCM_BOOL_T
);
172 Clef_engraver::do_try_music (Music
* r_l
)
174 if (Clef_change_req
*cl
= dynamic_cast <Clef_change_req
*> (r_l
))
177 if (!set_type (cl
->clef_str_
))
178 cl
->error (_ ("unknown clef type "));
188 Clef_engraver::create_clef()
192 Clef_item
*c
= new Clef_item
;
193 c
->set_elt_property (break_priority_scm_sym
, gh_int2scm (-2)); // ugh
194 String clefstyle
= get_property ("clefStyle", 0);
195 if (clefstyle
.length_i ())
196 c
->set_elt_property (style_scm_sym
,
197 gh_str02scm (clefstyle
.ch_C()));
199 announce_element (Score_element_info (c
, clef_req_l_
));
203 clef_p_
->symbol_
= clef_type_str_
;
204 clef_p_
->y_position_i_
= clef_position_i_
;
207 clef_p_
->set_elt_property (octave_dir_scm_sym
, gh_int2scm (octave_dir_
));
213 Clef_engraver::do_process_requests()
219 else if (create_default_b_
)
221 String type
= get_property ("defaultClef", 0);
222 set_type (type
.length_i () ? type
: "treble");
224 create_default_b_
=0;
229 Clef_engraver::do_pre_move_processing()
233 typeset_element (clef_p_
);
236 create_default_b_
= false;
240 Clef_engraver::do_post_move_processing()
246 Clef_engraver::do_removal_processing()
253 ADD_THIS_TRANSLATOR(Clef_engraver
);