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