lilypond-0.0.32
[lilypond.git] / src / note.cc
blob796090f04dc874e79e93601dd6e38765d7abd8ab
1 /*
2 could use cleanup
3 */
4 #include <ctype.h>
5 #include "lexer.hh"
6 #include "string.hh"
7 #include "real.hh"
8 #include "debug.hh"
9 #include "request.hh"
10 #include "voice.hh"
11 #include "notename.hh"
12 #include "identparent.hh"
13 #include "varray.hh"
14 #include "textdef.hh"
15 #include "parseconstruct.hh"
17 int default_duration = 4, default_dots=0, default_octave=0;
18 int default_plet_type = 1, default_plet_dur = 1;
19 String textstyle="roman"; // in lexer?
21 bool last_duration_mode = false;
23 void
24 set_duration_mode(String s)
26 s.upper();
27 last_duration_mode = (s== "LAST");
30 void
31 last_duration(int n)
33 if (last_duration_mode)
34 default_duration = n;
37 /* triplet is '2/3' */
38 void set_plet(int num,int den)
40 assert(num >0&& den>0);
41 default_plet_dur = num;
42 default_plet_type = den;
45 Text_def*
46 get_text(String s) return t;
48 t= new Text_def;
49 t->text_str_= s;
50 t->style_str_ = textstyle;
51 t->defined_ch_c_l_m = defined_ch_c_l;
52 return t;
55 void
56 set_text_style(String s)
58 textstyle = s;
61 void
62 parse_octave (const char *a, int &j, int &oct)
64 while (1)
66 if (a[j] == '\'')
67 oct ++;
68 else if (a[j] == '`')
69 oct --;
70 else
71 break;
72 j++;
76 void
77 parse_pitchmod( const char *a, int &j, int &oct, bool & overide_acc)
79 // octave
80 oct =default_octave;
81 parse_octave(a,j,oct);
83 // accidental
84 overide_acc = false;
86 if (a[j] == '!')
88 overide_acc = true;
89 j++;
92 mtor << "oct " << oct;
93 mtor << "override: " << overide_acc<<'\n';
97 Voice_element *
98 get_note_element(String pitch, int * notename, int * duration )
100 Voice_element*v = new Voice_element;
101 v->defined_ch_c_l_m = defined_ch_c_l;
102 int i=0;
104 int dur = duration[0];
105 int dots=duration[1];
107 if (dur >= 2) {
108 Stem_req * stem_req_p = new Stem_req(dur,dots);
109 stem_req_p->plet_factor = Moment(default_plet_dur, default_plet_type);
110 stem_req_p->defined_ch_c_l_m = defined_ch_c_l;
111 v->add(stem_req_p);
114 if ( !defined_ch_c_l )
115 defined_ch_c_l = lexer->here_ch_c_l();
117 Note_req * rq = new Note_req;
119 int oct;
120 bool forceacc;
121 parse_pitchmod(pitch, i, oct, forceacc);
122 rq->notename =notename[0];
123 rq->accidental = notename[1];
124 rq->octave = oct + notename[2];
125 rq->forceacc = forceacc;
126 rq->balltype = dur;
127 rq->dots = dots;
128 rq->plet_factor = Moment(default_plet_dur, default_plet_type);
129 rq->defined_ch_c_l_m = defined_ch_c_l;
130 rq->print();
132 v->add(rq);
134 return v;
137 Voice_element*
138 get_word_element(Text_def* tdef_p, int* duration)
140 Voice_element* velt_p = new Voice_element;
141 velt_p->defined_ch_c_l_m = defined_ch_c_l;
143 int dur = duration[0];
144 int dots=duration[1];
146 tdef_p->defined_ch_c_l_m = defined_ch_c_l;
147 #if 0
148 char buf[ 21 ];
149 strncpy( buf, tdef_p->defined_ch_c_l_m, 20 );
150 buf[ 20 ] = 0;
151 cout << hex << (void*)tdef_p->defined_ch_c_l_m << dec << buf << endl;
152 #endif
153 Lyric_req* lreq_p = new Lyric_req(tdef_p);
155 lreq_p->balltype = dur;
156 lreq_p->dots = dots;
157 lreq_p->plet_factor = Moment(default_plet_dur, default_plet_type);
158 lreq_p->print();
159 lreq_p->defined_ch_c_l_m = defined_ch_c_l;
161 velt_p->add(lreq_p);
163 return velt_p;
166 Voice_element *
167 get_rest_element(String, int * duration )
169 Voice_element* velt_p = new Voice_element;
170 velt_p->defined_ch_c_l_m = defined_ch_c_l;
172 Rest_req * rest_req_p = new Rest_req;
173 rest_req_p->plet_factor = Moment(default_plet_dur, default_plet_type);
174 rest_req_p->balltype = duration[0];
175 rest_req_p->dots = duration[1];
176 rest_req_p->print();
177 rest_req_p->defined_ch_c_l_m = defined_ch_c_l;
179 velt_p->add(rest_req_p);
181 return velt_p;
184 void
185 get_default_duration(int *p)
187 *p++ = default_duration;
188 *p = default_dots;
191 void
192 set_default_duration(int *p)
194 default_duration = *p++;
195 default_dots = *p++;
199 void
200 set_default_octave(String d)
202 int i=0;
203 default_octave=0;
204 parse_octave(d, i, default_octave);
207 Request*
208 get_request(char c)
210 Request* req_p=0;
211 switch (c) {
212 case '|':
213 req_p = new Barcheck_req;
214 break;
216 case '[':
217 case ']':
219 Beam_req*b = new Beam_req;
220 if (default_plet_type != 1)
221 b->nplet = default_plet_type;
222 req_p = b;
224 break;
227 case ')':
228 case '(':
229 req_p = new Slur_req;
230 break;
231 default:
232 assert(false);
233 break;
236 switch (c) {
237 case '(':
238 case '[':
239 req_p->span()->spantype = Span_req::START;
240 break;
241 case ')':
242 case ']':
243 req_p->span()->spantype = Span_req::STOP;
244 break;
246 default:
247 break;
250 req_p->defined_ch_c_l_m = req_defined_ch_c_l;
251 return req_p;
254 void
255 add_requests(Voice_element *v, Array<Request*> &req)
257 for (int i = 0; i < req.size(); i++) {
258 v->add(req[i]);
260 req.set_size(0);
263 Script_def*
264 get_scriptdef(char c)
266 String s;
267 switch (c) {
268 case '^' : s = "marcato";
269 break;
270 case '+' : s = "stopped";
271 break;
272 case '-' : s = "tenuto";
273 break;
274 case '|': s = "staccatissimo";
275 break;
276 case 'o' : s = "";
277 break;
278 case '>' : s = "accent";
279 break;
280 case 'v' : s = "";
281 break;
282 case '.' : s = "staccato";
283 break;
285 return lexer->lookup_identifier(s)->script(1);
288 Request*
289 get_script_req(int d , Script_def*def)
291 Script_req* script_req_p = new Script_req(d, def);
292 // all terminal symbols, rather set directly here:
293 script_req_p->defined_ch_c_l_m = lexer->here_ch_c_l();
294 return script_req_p;
297 Request*
298 get_text_req(int d , Text_def*def)
300 Text_req* text_req_p = new Text_req(d, def);
301 text_req_p->defined_ch_c_l_m = defined_ch_c_l;
302 return text_req_p;
305 Voice_element*
306 get_mark_element(String s)
308 Voice_element*v_p = new Voice_element;
309 v_p->defined_ch_c_l_m = defined_ch_c_l;
310 Mark_req* mark_req_p = new Mark_req(s);
311 mark_req_p->defined_ch_c_l_m = defined_ch_c_l;
312 v_p->add(mark_req_p);
313 return v_p;
315 Voice_element*
316 get_command_element(Input_command*com_p)
318 Voice_element *velt_p = new Voice_element;
319 velt_p->defined_ch_c_l_m = defined_ch_c_l;
320 Staff_command_req* scommand_req_p = new Staff_command_req(com_p);
321 scommand_req_p->defined_ch_c_l_m = defined_ch_c_l;
322 velt_p->add(scommand_req_p);
323 return velt_p;
325 Voice_element*
326 get_barcheck_element()
328 Voice_element* velt_p = new Voice_element;
329 velt_p->defined_ch_c_l_m = req_defined_ch_c_l;
330 Barcheck_req* barcheck_req_p = new Barcheck_req;
331 barcheck_req_p->defined_ch_c_l_m = req_defined_ch_c_l;
332 velt_p->add(barcheck_req_p);
333 return velt_p;
336 Voice_element*
337 get_stemdir_element(int d)
339 Voice_element*v_p = new Voice_element;
340 v_p->defined_ch_c_l_m = req_defined_ch_c_l;
341 Group_feature_req * gfreq_p = new Group_feature_req;
342 gfreq_p->stemdir_i_ =d;
343 gfreq_p->defined_ch_c_l_m = req_defined_ch_c_l;
344 v_p->add(gfreq_p);
345 return v_p;