]> git.donarmstrong.com Git - lilypond.git/blob - src/note.cc
release: 0.0.26
[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     if (dur >= 2) {
87         Stem_req * st = new Stem_req(dur,dots);
88         st->plet_factor = Moment(default_plet_dur, default_plet_type);
89         v->add(st);
90     }
91     
92     Note_req * rq = new Note_req;
93     
94     int oct;
95     bool forceacc;
96     parse_pitchmod(pitch, i, oct, forceacc);
97     rq->notename =notename[0];
98     rq->accidental = notename[1];
99     rq->octave = oct;
100     rq->forceacc = forceacc;
101     rq->balltype = dur;
102     rq->dots = dots;
103     rq->plet_factor = Moment(default_plet_dur, default_plet_type);
104     rq->print();
105
106     v->add(rq);
107
108     return v;
109 }
110
111 Voice_element*
112 get_word_element(Text_def* tdef_p, int* duration)
113 {
114     Voice_element* velt_p = new Voice_element;
115
116     
117     int dur = duration[0];
118     int dots=duration[1];
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
127     velt_p->add(lreq_p);
128
129     return velt_p;
130 }
131
132 Voice_element *
133 get_rest_element(String,  int * duration )
134 {    
135     Voice_element*v = new Voice_element;
136
137     Rest_req * rq = new Rest_req;
138     rq->plet_factor = Moment(default_plet_dur, default_plet_type);
139     rq->balltype = duration[0];
140     rq->dots = duration[1];    
141     rq->print();
142     v->add(rq);
143
144     return v;
145 }
146
147 void
148 get_default_duration(int *p)
149 {
150    *p++ = default_duration;
151     *p = default_dots;
152 }
153
154 void
155 set_default_duration(int *p)
156 {
157      default_duration = *p++;
158      default_dots = *p++;
159 }
160
161
162 void
163 set_default_octave(String d)
164 {
165     int i=0;
166     default_octave=0;
167     parse_octave(d, i, default_octave);
168 }
169
170 Request*
171 get_request(char c)
172 {
173     Request* ret=0;
174     switch (c) {
175     case '|':
176         ret = new Barcheck_req;
177         break;
178
179     case '[':
180     case ']':
181     {
182         Beam_req*b = new Beam_req;
183         if (default_plet_type != 1)
184             b->nplet = default_plet_type;
185         ret = b;
186     }
187         break;
188
189
190     case ')':
191     case '(':
192         ret = new Slur_req;
193         break;
194     default:
195         assert(false);
196         break;
197     }
198     
199     switch (c) {
200     case '(':
201     case '[':
202         ret->span()->spantype = Span_req::START;
203         break;
204     case ')':
205     case ']':
206         ret->span()->spantype = Span_req::STOP;
207         break;
208         
209     default:
210         break;
211     }
212
213     return ret;
214 }
215
216 void
217 add_requests(Voice_element *v, Array<Request*> &req)
218 {
219     for (int i = 0; i < req.size(); i++) {
220         v->add(req[i]);
221     }
222     req.set_size(0);
223 }
224
225 Script_def*
226 get_scriptdef(char c)
227 {
228     String s;
229     switch (c) {
230     case '^' : s = "marcato";
231         break;
232     case  '+' : s = "stopped";
233         break;
234     case '-' : s = "tenuto";
235         break;
236     case  '|':  s = "staccatissimo";
237         break;
238     case  'o' : s = "";
239         break;
240     case '>' : s = "accent";
241         break;
242     case  'v' : s = ""; 
243         break;
244     case  '.' : s = "staccato";
245         break;
246     }
247     return lexer->lookup_identifier(s)->script(1);
248 }
249
250 Request*
251 get_script_req(int d , Script_def*def)
252 {
253     return new Script_req(d, def);
254 }
255
256 Request*
257 get_text_req(int d , Text_def*def)
258 {
259     return new Text_req(d, def);
260 }
261
262 Voice_element*
263 get_mark_element(String s)
264 {
265     Voice_element*v_p = new Voice_element;
266     v_p->add( new Mark_req(s));
267     
268     return v_p;
269 }
270 Voice_element*
271 get_command_element(Input_command*com_p)
272 {
273     Voice_element *v_p = new Voice_element;
274     v_p->add(new Staff_command_req(com_p));
275     return v_p;
276 }
277 Voice_element*
278 get_barcheck_element()
279 {
280     Voice_element*v_p = new Voice_element;
281     v_p->add( new Barcheck_req);
282     
283     return v_p;
284 }