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