]> git.donarmstrong.com Git - lilypond.git/blob - src/note.cc
release: 0.0.27
[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     int i=0;
102     
103     int dur = duration[0];
104     int dots=duration[1];
105
106     if (dur >= 2) {
107         Stem_req * st = new Stem_req(dur,dots);
108         st->plet_factor = Moment(default_plet_dur, default_plet_type);
109         v->add(st);
110     }
111     
112     if ( !defined_ch_c_l )
113         defined_ch_c_l = lexer->here_ch_c_l();
114
115     Note_req * rq = new Note_req;
116     
117     int oct;
118     bool forceacc;
119     parse_pitchmod(pitch, i, oct, forceacc);
120     rq->notename =notename[0];
121     rq->accidental = notename[1];
122     rq->octave = oct;
123     rq->forceacc = forceacc;
124     rq->balltype = dur;
125     rq->dots = dots;
126     rq->plet_factor = Moment(default_plet_dur, default_plet_type);
127     rq->defined_ch_c_l_m = defined_ch_c_l;
128     rq->print();
129
130     v->add(rq);
131     v->defined_ch_c_l_m = defined_ch_c_l;
132
133     return v;
134 }
135
136 Voice_element*
137 get_word_element(Text_def* tdef_p, int* duration)
138 {
139     Voice_element* velt_p = new Voice_element;
140
141     
142     int dur = duration[0];
143     int dots=duration[1];
144     
145     tdef_p->defined_ch_c_l_m = defined_ch_c_l;
146 #if 0
147     char buf[ 21 ];
148     strncpy( buf, tdef_p->defined_ch_c_l_m, 20 );
149     buf[ 20 ] = 0;
150     cout << hex << (void*)tdef_p->defined_ch_c_l_m << dec << buf << endl;
151 #endif
152     Lyric_req* lreq_p = new Lyric_req(tdef_p);
153
154     lreq_p->balltype = dur;
155     lreq_p->dots = dots;
156     lreq_p->plet_factor = Moment(default_plet_dur, default_plet_type);
157     lreq_p->print();
158
159     velt_p->add(lreq_p);
160
161     return velt_p;
162 }
163
164 Voice_element *
165 get_rest_element(String,  int * duration )
166 {    
167     Voice_element*v = new Voice_element;
168
169     Rest_req * rq = new Rest_req;
170     rq->plet_factor = Moment(default_plet_dur, default_plet_type);
171     rq->balltype = duration[0];
172     rq->dots = duration[1];    
173     rq->print();
174     v->add(rq);
175
176     return v;
177 }
178
179 void
180 get_default_duration(int *p)
181 {
182     *p++ = default_duration;
183     *p = default_dots;
184 }
185
186 void
187 set_default_duration(int *p)
188 {
189      default_duration = *p++;
190      default_dots = *p++;
191 }
192
193
194 void
195 set_default_octave(String d)
196 {
197     int i=0;
198     default_octave=0;
199     parse_octave(d, i, default_octave);
200 }
201
202 Request*
203 get_request(char c)
204 {
205     Request* req_p=0;
206     switch (c) {
207     case '|':
208         req_p = new Barcheck_req;
209         break;
210
211     case '[':
212     case ']':
213     {
214         Beam_req*b = new Beam_req;
215         if (default_plet_type != 1)
216             b->nplet = default_plet_type;
217         req_p = b;
218     }
219         break;
220
221
222     case ')':
223     case '(':
224         req_p = new Slur_req;
225         break;
226     default:
227         assert(false);
228         break;
229     }
230     
231     switch (c) {
232     case '(':
233     case '[':
234         req_p->span()->spantype = Span_req::START;
235         break;
236     case ')':
237     case ']':
238         req_p->span()->spantype = Span_req::STOP;
239         break;
240         
241     default:
242         break;
243     }
244
245     req_p->defined_ch_c_l_m = req_defined_ch_c_l;
246     return req_p;
247 }
248
249 void
250 add_requests(Voice_element *v, Array<Request*> &req)
251 {
252     for (int i = 0; i < req.size(); i++) {
253         v->add(req[i]);
254     }
255     req.set_size(0);
256 }
257
258 Script_def*
259 get_scriptdef(char c)
260 {
261     String s;
262     switch (c) {
263     case '^' : s = "marcato";
264         break;
265     case  '+' : s = "stopped";
266         break;
267     case '-' : s = "tenuto";
268         break;
269     case  '|':  s = "staccatissimo";
270         break;
271     case  'o' : s = "";
272         break;
273     case '>' : s = "accent";
274         break;
275     case  'v' : s = ""; 
276         break;
277     case  '.' : s = "staccato";
278         break;
279     }
280     return lexer->lookup_identifier(s)->script(1);
281 }
282
283 Request*
284 get_script_req(int d , Script_def*def)
285 {
286     return new Script_req(d, def);
287 }
288
289 Request*
290 get_text_req(int d , Text_def*def)
291 {
292     return new Text_req(d, def);
293 }
294
295 Voice_element*
296 get_mark_element(String s)
297 {
298     Voice_element*v_p = new Voice_element;
299     v_p->add( new Mark_req(s));
300     
301     return v_p;
302 }
303 Voice_element*
304 get_command_element(Input_command*com_p)
305 {
306     Voice_element *v_p = new Voice_element;
307     v_p->add(new Staff_command_req(com_p));
308     return v_p;
309 }
310 Voice_element*
311 get_barcheck_element()
312 {
313     Voice_element*v_p = new Voice_element;
314     v_p->add( new Barcheck_req);
315     
316     return v_p;
317 }
318
319 Voice_element*
320 get_stemdir_element(int d)
321 {
322     Voice_element*v_p = new Voice_element;
323     Group_feature_req * gfreq_p = new Group_feature_req;
324     gfreq_p->stemdir_i_ =d; 
325     v_p->add(gfreq_p);
326     return v_p;
327 }