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