]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-grav.cc
release: 0.1.61
[lilypond.git] / lily / clef-grav.cc
1 /*
2   clef.cc -- implement Clef_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>,
7   Mats Bengtsson <matsb@s3.kth.se>
8 */
9
10 #include "bar.hh"
11 #include "clef-grav.hh"
12 #include "clef-item.hh"
13 #include "debug.hh"
14 #include "command-request.hh"
15 #include "time-description.hh"
16
17 Clef_engraver::Clef_engraver()
18 {
19   clef_p_ = 0;
20   clef_req_l_ =0;
21   clef_type_str_ = 0;
22   c0_position_i_ =0;
23 }
24
25 /*
26   Ugh.  Should have support for Dictionaries in mudela.
27  */
28 bool
29 Clef_engraver::set_type (String s)
30 {
31   clef_type_str_ = s;
32   if (clef_type_str_ == "violin" || clef_type_str_ == "G" || clef_type_str_ == "G2")
33     c0_position_i_= -6;
34   else if (clef_type_str_ == "french")
35     c0_position_i_= -8;
36   else if (clef_type_str_ == "soprano")
37     c0_position_i_= -4;
38   else if (clef_type_str_ == "mezzosoprano")
39     c0_position_i_ = -2;
40   else if (clef_type_str_ == "alto")
41     c0_position_i_= 0;
42   else if (clef_type_str_ == "tenor")
43     c0_position_i_= 2;
44   else if (clef_type_str_ == "baritone")
45     c0_position_i_ = 4;
46   else if (clef_type_str_ == "varbaritone")
47     c0_position_i_ = 4;
48   else if (clef_type_str_ == "bass" || clef_type_str_ == "F")
49     c0_position_i_= 6;
50   else if (clef_type_str_ == "subbass")
51     c0_position_i_ = 8;
52   else
53     switch(clef_type_str_[0])
54     {
55     case 'F': case 'f':
56             c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 2;
57             break;
58     case  'G': case 'g':
59             c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 10;
60             break;
61     case 'C': case 'c':
62             c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 6;
63             break;
64     default:
65     return false;
66     }               
67   
68   return true;
69 }
70
71 void
72 Clef_engraver::fill_staff_info (Staff_info &i)
73 {
74   i.c0_position_i_l_ = &c0_position_i_;
75 }
76
77 void
78 Clef_engraver::read_req (Clef_change_req*c_l)
79 {
80   if (!set_type (c_l->clef_str_))
81     c_l->error (_("unknown clef type "));
82 }
83
84
85 /** 
86   Generate a clef at the start of a measure. (when you see a Bar,
87   ie. a breakpoint) 
88   */
89 void
90 Clef_engraver::acknowledge_element (Score_elem_info info)
91 {
92   if (info.elem_l_->is_type_b (Bar::static_name ()) 
93       && clef_type_str_.length_i())
94     {
95       create_clef();
96       if (!clef_req_l_)
97         clef_p_->default_b_ = true;
98     }
99 }
100
101 void
102 Clef_engraver::do_creation_processing()
103 {
104   Scalar def = get_property ("defaultclef");
105   if (def.operator bool ()) // egcs: Scalar to bool is ambiguous
106     set_type (def);
107   if (clef_type_str_.length_i ())
108     create_clef();
109   clef_p_->default_b_ = false;
110 }
111
112 bool
113 Clef_engraver::do_try_request (Request * r_l)
114 {
115   Command_req* creq_l= r_l->command();
116   if (!creq_l || !creq_l->clefchange())
117     return false;
118
119   clef_req_l_ = creq_l->clefchange();
120   read_req (clef_req_l_);
121   return true;
122 }
123
124 void
125 Clef_engraver::create_clef()
126 {
127   if (!clef_p_)
128     {
129       clef_p_ = new Clef_item;
130       clef_p_->break_priority_i_ = -2; // ugh
131       announce_element (Score_elem_info (clef_p_,clef_req_l_));
132     }
133   clef_p_->read (*this);
134 }
135
136 void
137 Clef_engraver::do_process_requests()
138 {
139   if (clef_req_l_)
140     {
141       create_clef();
142       clef_p_->default_b_ = false;
143     }
144 }
145
146 void
147 Clef_engraver::do_pre_move_processing()
148 {
149   if (clef_p_)
150     {
151       typeset_element (clef_p_);
152       clef_p_ = 0;
153     }
154 }
155 void
156 Clef_engraver::do_post_move_processing()
157 {
158   clef_req_l_ = 0;
159 }
160
161 void
162 Clef_engraver::do_removal_processing()
163 {
164   delete clef_p_;
165   clef_p_ =0;
166 }
167
168
169 IMPLEMENT_IS_TYPE_B1(Clef_engraver,Engraver);
170 ADD_THIS_TRANSLATOR(Clef_engraver);