]> git.donarmstrong.com Git - lilypond.git/blob - src/note.cc
95a7d8313d5a6fc831479e2790426bd81ecc4945
[lilypond.git] / src / note.cc
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 "musicalrequest.hh"
10 #include "commandrequest.hh"
11 #include "voice.hh"
12 #include "notename.hh"
13 #include "identparent.hh"
14 #include "varray.hh"
15 #include "textdef.hh"
16 #include "parseconstruct.hh"
17 #include "inputmusic.hh"
18
19 int default_duration = 4, default_dots=0, default_octave=0;
20 int default_plet_type = 1, default_plet_dur = 1;
21 String textstyle="roman";               // in lexer?
22
23 bool last_duration_mode = false;
24
25 void
26 set_duration_mode(String s)
27 {
28     s.upper();
29     last_duration_mode = (s== "LAST");
30 }
31
32 void
33 last_duration(int n)
34 {
35     if (last_duration_mode)
36         default_duration = n;
37 }
38
39 /* triplet is '2/3' */
40 void 
41 set_plet(int num,int den)
42 {
43     assert(num >0&& den>0);
44     default_plet_dur = num;
45     default_plet_type = den;
46 }
47
48 Text_def*
49 get_text(String s) return t;
50 {
51     t= new Text_def;
52     t->text_str_= s;
53     t->style_str_ = textstyle;
54     t->defined_ch_c_l_ = defined_ch_c_l;
55     return t;
56 }
57
58 void
59 set_text_style(String s)
60 {
61     textstyle = s;
62 }
63
64 void
65 parse_octave (const char *a, int &j, int &oct)
66 {    
67     while (1) 
68     {   
69         if (a[j] == '\'')
70             oct ++;
71         else if (a[j] == '`')
72             oct --;
73         else
74             break;
75         j++;
76     }
77 }
78
79 void 
80 parse_pitch( const char *a, Melodic_req* mel_l)
81 {
82     int j=0;
83
84     // octave
85     mel_l->octave_i_ = default_octave;
86     parse_octave(a,j,mel_l->octave_i_);
87
88     // accidental
89     mel_l->forceacc_b_ = false;
90     
91     if (a[j] == '!'){
92         mel_l->forceacc_b_ = true;
93         j++;
94     }
95 }
96
97 Voice_element *
98 get_note_element(String pitch, int * notename, int * duration )
99 {
100     Voice_element*v = new Voice_element;
101     v->defined_ch_c_l_ = defined_ch_c_l;
102
103     
104     int dur = duration[0];
105     int dots = duration[1];
106
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_ = defined_ch_c_l;
111         v->add(stem_req_p);
112     }
113     
114     if ( !defined_ch_c_l )
115         defined_ch_c_l = lexer->here_ch_c_l();
116
117     Note_req * rq = new Note_req;
118     rq->notename_i_ =notename[0];
119     rq->accidental_i_ = notename[1];
120     parse_pitch(pitch, rq);
121     rq->octave_i_ += notename[2];
122
123     rq->balltype = dur;
124     rq->dots = dots;
125     rq->plet_factor = Moment(default_plet_dur, default_plet_type);
126     rq->defined_ch_c_l_ = defined_ch_c_l;
127
128     v->add(rq);
129
130     return v;
131 }
132
133 Voice_element*
134 get_word_element(Text_def* tdef_p, int* duration)
135 {
136     Voice_element* velt_p = new Voice_element;
137     velt_p->defined_ch_c_l_ = defined_ch_c_l;
138     
139     int dur = duration[0];
140     int dots=duration[1];
141     
142     tdef_p->defined_ch_c_l_ = defined_ch_c_l;
143
144     Lyric_req* lreq_p = new Lyric_req(tdef_p);
145
146     lreq_p->balltype = dur;
147     lreq_p->dots = dots;
148     lreq_p->plet_factor = Moment(default_plet_dur, default_plet_type);
149     lreq_p->print();
150     lreq_p->defined_ch_c_l_ = defined_ch_c_l;
151
152     velt_p->add(lreq_p);
153
154     return velt_p;
155 }
156
157 Voice_element *
158 get_rest_element(String,  int * duration )
159 {    
160     Voice_element* velt_p = new Voice_element;
161     velt_p->defined_ch_c_l_ = defined_ch_c_l;
162
163     Rest_req * rest_req_p = new Rest_req;
164     rest_req_p->plet_factor = Moment(default_plet_dur, default_plet_type);
165     rest_req_p->balltype = duration[0];
166     rest_req_p->dots = duration[1];    
167     rest_req_p->print();
168     rest_req_p->defined_ch_c_l_ = defined_ch_c_l;
169
170     velt_p->add(rest_req_p);
171
172     return velt_p;
173 }
174
175 void
176 get_default_duration(int *p)
177 {
178     *p++ = default_duration;
179     *p = default_dots;
180 }
181
182 void
183 set_default_duration(int *p)
184 {
185      default_duration = *p++;
186      default_dots = *p++;
187 }
188
189
190 void
191 set_default_octave(String d)
192 {
193     int i=0;
194     default_octave=0;
195     parse_octave(d, i, default_octave);
196 }
197
198 Request*
199 get_plet_request( char c, int dur_i, int type_i )
200 {
201     Plet_req* plet_req_p = new Plet_req;
202     plet_req_p->dur_i_ = dur_i;
203     plet_req_p->type_i_ = type_i;
204     plet_req_p->type_c_ = c;
205     return plet_req_p;
206 }
207
208 Request*
209 get_request(char c)
210 {
211     Request* req_p=0;
212     switch (c) {
213     case '|':
214         req_p = new Barcheck_req;
215         break;
216
217     case '[':
218     case ']':
219     {
220         Beam_req*b = new Beam_req;
221         if (default_plet_type != 1)
222             b->nplet = default_plet_type;
223         req_p = b;
224     }
225         break;
226
227
228     case ')':
229     case '(':
230         req_p = new Slur_req;
231         break;
232     default:
233         assert(false);
234         break;
235     }
236     
237     switch (c) {
238     case '(':
239     case '[':
240         req_p->span()->spantype = Span_req::START;
241         break;
242     case ')':
243     case ']':
244         req_p->span()->spantype = Span_req::STOP;
245         break;
246         
247     default:
248         break;
249     }
250
251     req_p->defined_ch_c_l_ = req_defined_ch_c_l;
252     return req_p;
253 }
254
255 void
256 add_requests(Voice_element *v, Array<Request*> &req)
257 {
258     for (int i = 0; i < req.size(); i++) {
259         v->add(req[i]);
260     }
261     req.set_size(0);
262 }
263
264 Script_def*
265 get_scriptdef(char c)
266 {
267     String s;
268     switch (c) {
269     case '^' : s = "marcato";
270         break;
271     case  '+' : s = "stopped";
272         break;
273     case '-' : s = "tenuto";
274         break;
275     case  '|':  s = "staccatissimo";
276         break;
277     case  'o' : s = "";
278         break;
279     case '>' : s = "accent";
280         break;
281     case  'v' : s = ""; 
282         break;
283     case  '.' : s = "staccato";
284         break;
285     }
286     return lexer->lookup_identifier(s)->script(1);
287 }
288
289 Request*
290 get_script_req(int d , Script_def*def)
291 {
292     Script_req* script_req_p = new Script_req(d, def);
293     return script_req_p;
294 }
295
296 Request*
297 get_text_req(int d , Text_def*def)
298 {
299     Text_req* text_req_p = new Text_req(d, def);
300     return text_req_p;
301 }
302
303 Request*
304 get_stemdir_req(int d)
305 {
306     Group_feature_req * gfreq_p = new Group_feature_req;
307     gfreq_p->stemdir_i_ =d; 
308     return gfreq_p;
309 }
310
311 Request*
312 get_grouping_req(Array<int> i_arr)
313 {
314     Measure_grouping_req * mr_p = new Measure_grouping_req;
315     for (int i=0; i <i_arr.size(); ) {
316         mr_p->beat_i_arr_.push(i_arr[i++]);
317         mr_p->elt_length_arr_.push(Moment(1, i_arr[i++]));
318     }
319     return mr_p;
320 }