]> git.donarmstrong.com Git - lilypond.git/blob - src/note.cc
release: 0.0.30
[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 "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"
16
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?
20
21 bool last_duration_mode = false;
22
23 void
24 set_duration_mode(String s)
25 {
26     s.upper();
27     last_duration_mode = (s== "LAST");
28 }
29
30 void
31 last_duration(int n)
32 {
33     if (last_duration_mode)
34         default_duration = n;
35 }
36
37 /* triplet is '2/3' */
38 void set_plet(int num,int den)
39 {
40     assert(num >0&& den>0);
41     default_plet_dur = num;
42     default_plet_type = den;
43 }
44
45 Text_def*
46 get_text(String s) return t;
47 {
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;
53 }
54
55 void
56 set_text_style(String s)
57 {
58     textstyle = s;
59 }
60
61 void
62 parse_octave (const char *a, int &j, int &oct)
63 {    
64     while (1) 
65     {   
66         if (a[j] == '\'')
67             oct ++;
68         else if (a[j] == '`')
69             oct --;
70         else
71             break;
72         j++;
73     }
74 }
75
76 void 
77 parse_pitchmod( const char *a, int &j, int &oct, bool & overide_acc)
78 {
79     // octave
80     oct =default_octave;
81     parse_octave(a,j,oct);
82         
83     // accidental
84     overide_acc = false;
85     
86     if (a[j] == '!')
87         {       
88         overide_acc = true;
89         j++;
90         }
91
92     mtor << "oct " << oct;
93     mtor << "override: " << overide_acc<<'\n';
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_m = defined_ch_c_l;
102     int i=0;
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_m = 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     
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();
131
132     v->add(rq);
133
134     return v;
135 }
136
137 Voice_element*
138 get_word_element(Text_def* tdef_p, int* duration)
139 {
140     Voice_element* velt_p = new Voice_element;
141     velt_p->defined_ch_c_l_m = defined_ch_c_l;
142     
143     int dur = duration[0];
144     int dots=duration[1];
145     
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);
154
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;
160
161     velt_p->add(lreq_p);
162
163     return velt_p;
164 }
165
166 Voice_element *
167 get_rest_element(String,  int * duration )
168 {    
169     Voice_element* velt_p = new Voice_element;
170     velt_p->defined_ch_c_l_m = defined_ch_c_l;
171
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;
178
179     velt_p->add(rest_req_p);
180
181     return velt_p;
182 }
183
184 void
185 get_default_duration(int *p)
186 {
187     *p++ = default_duration;
188     *p = default_dots;
189 }
190
191 void
192 set_default_duration(int *p)
193 {
194      default_duration = *p++;
195      default_dots = *p++;
196 }
197
198
199 void
200 set_default_octave(String d)
201 {
202     int i=0;
203     default_octave=0;
204     parse_octave(d, i, default_octave);
205 }
206
207 Request*
208 get_request(char c)
209 {
210     Request* req_p=0;
211     switch (c) {
212     case '|':
213         req_p = new Barcheck_req;
214         break;
215
216     case '[':
217     case ']':
218     {
219         Beam_req*b = new Beam_req;
220         if (default_plet_type != 1)
221             b->nplet = default_plet_type;
222         req_p = b;
223     }
224         break;
225
226
227     case ')':
228     case '(':
229         req_p = new Slur_req;
230         break;
231     default:
232         assert(false);
233         break;
234     }
235     
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;
245         
246     default:
247         break;
248     }
249
250     req_p->defined_ch_c_l_m = req_defined_ch_c_l;
251     return req_p;
252 }
253
254 void
255 add_requests(Voice_element *v, Array<Request*> &req)
256 {
257     for (int i = 0; i < req.size(); i++) {
258         v->add(req[i]);
259     }
260     req.set_size(0);
261 }
262
263 Script_def*
264 get_scriptdef(char c)
265 {
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;
284     }
285     return lexer->lookup_identifier(s)->script(1);
286 }
287
288 Request*
289 get_script_req(int d , Script_def*def)
290 {
291     Script_req* script_req_p = new Script_req(d, def);
292 //    script_req_p->defined_ch_c_l_m = req_defined_ch_c_l;
293     // all terminal symbols, rather set directly here:
294     script_req_p->defined_ch_c_l_m = lexer->here_ch_c_l();
295     return script_req_p;
296 }
297
298 Request*
299 get_text_req(int d , Text_def*def)
300 {
301     Text_req* text_req_p = new Text_req(d, def);
302     text_req_p->defined_ch_c_l_m = defined_ch_c_l;
303     return text_req_p;
304 }
305
306 Voice_element*
307 get_mark_element(String s)
308 {
309     Voice_element*v_p = new Voice_element;
310     v_p->defined_ch_c_l_m = defined_ch_c_l;
311     Mark_req* mark_req_p = new Mark_req(s);
312     mark_req_p->defined_ch_c_l_m = defined_ch_c_l;
313     v_p->add(mark_req_p); 
314     return v_p;
315 }
316 Voice_element*
317 get_command_element(Input_command*com_p)
318 {
319     Voice_element *velt_p = new Voice_element;
320     velt_p->defined_ch_c_l_m = defined_ch_c_l;
321     Staff_command_req* scommand_req_p = new Staff_command_req(com_p);
322     scommand_req_p->defined_ch_c_l_m = defined_ch_c_l;
323     velt_p->add(scommand_req_p);
324     return velt_p;
325 }
326 Voice_element*
327 get_barcheck_element()
328 {
329     Voice_element* velt_p = new Voice_element;
330     velt_p->defined_ch_c_l_m = req_defined_ch_c_l;
331     Barcheck_req* barcheck_req_p = new Barcheck_req;
332     barcheck_req_p->defined_ch_c_l_m = req_defined_ch_c_l;
333     velt_p->add(barcheck_req_p);
334     return velt_p;
335 }
336
337 Voice_element*
338 get_stemdir_element(int d)
339 {
340     Voice_element*v_p = new Voice_element;
341     v_p->defined_ch_c_l_m = req_defined_ch_c_l;
342     Group_feature_req * gfreq_p = new Group_feature_req;
343     gfreq_p->stemdir_i_ =d; 
344     gfreq_p->defined_ch_c_l_m = req_defined_ch_c_l;
345     v_p->add(gfreq_p);
346     return v_p;
347 }