]> git.donarmstrong.com Git - lilypond.git/blob - src/note.cc
f5911c0edad611c963299d78135bbfc9798b6fe8
[lilypond.git] / src / note.cc
1 #include <ctype.h>
2
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 "vray.hh"
10
11 int default_duration = 4, default_dots=0, default_octave=0;
12
13 void
14 parse_duration(const char *a, int &j, int &intdur, int &dots)
15 {    
16     String durstr;    
17     while (isdigit(a[j])) 
18         {
19         durstr += a[j++];
20         }
21
22     dots=default_dots;
23     
24     while (a[j] == '.') 
25         {
26         j++;
27         dots++;
28         }
29     
30     intdur = (durstr.len()) ?
31         durstr.value():default_duration;
32
33     mtor << "dur " << intdur << "dots " << dots<<eol;
34 }
35
36
37 void
38 parse_octave (const char *a, int &j, int &oct)
39 {    
40     while (1) 
41     {   
42         if (a[j] == '\'')
43             oct ++;
44         else if (a[j] == '`')
45             oct --;
46         else
47             break;
48         j++;
49     }
50 }
51
52 void 
53 parse_pitch( const char *a, int &j, int &oct, bool & overide_acc,
54              int & large, int & small)
55 {
56     // octave
57     oct =default_octave;
58     parse_octave(a,j,oct);
59
60     mtor << "oct " << oct;
61         
62     // accidental
63     overide_acc = false;
64     
65     if (a[j] == '!')
66         {       
67         overide_acc = true;
68         j++;
69         }
70
71     
72     // notename.
73     String nm;
74     while (isalpha(a[j])) 
75         {
76         nm += a[j++];
77         }
78     if (isupper(nm[0]))
79         {
80         oct--;  
81         nm.lower();
82         }
83         
84
85     lookup_notename(large,small,nm);
86     mtor << "override: " << overide_acc;    
87     mtor << "pitch "<< large <<", "<<small<<"\n";    
88 }
89
90
91 Voice_element *
92 get_note_element(String pitch, String durstr)
93 {
94     Voice_element*v = new Voice_element;
95     int i=0;
96     
97     int dur, dots;
98     parse_duration(durstr, i, dur, dots);
99     i=0;
100
101     Note_req * rq = new Note_req;
102
103     if (dur >= 2) {
104         Stem_req * st = new Stem_req(dur);
105         v->add(st);
106     }
107     
108     int oct, pit, acc;
109     bool forceacc;
110     parse_pitch(pitch, i, oct, forceacc, pit, acc);
111     rq->name =pit;
112     
113     rq->octave = oct;
114     rq->accidental = acc;
115     rq->forceacc = forceacc;
116     rq->balltype = dur;
117     rq->dots = dots;
118     
119     rq->print();
120
121     v->add(rq);
122
123     return v;
124 }
125
126 Voice_element *
127 get_rest_element(String, String durstr)
128 {    
129     Voice_element*v = new Voice_element;
130     int i=0;
131     
132     int dur, dots;
133     parse_duration(durstr, i, dur, dots);
134     i=0;
135
136     Rest_req * rq = new Rest_req;
137   
138     rq->balltype = dur;
139     rq->dots = dots;    
140     rq->print();
141     v->add(rq);
142
143     return v;
144 }
145
146 void
147 set_default_duration(String d)
148 {
149     int i=0;
150     parse_duration(d, i, default_duration, default_dots);
151 }
152
153
154 void
155 set_default_pitch(String d)
156 {
157     int i=0;
158     default_octave=0;
159     parse_octave(d, i, default_octave);
160 }
161
162 Request*
163 get_request(char c)
164 {
165     Request* ret=0;
166     switch (c) {
167     case '[':
168     case ']':
169         ret = new Beam_req;
170         break;
171
172     case ')':
173     case '(':
174         ret = new Slur_req;
175         break;
176     default:
177         assert(false);
178         break;
179     }
180     
181     switch (c) {
182     case '(':
183     case '[':
184         ret->span()->spantype = Span_req::START;
185         break;
186     case ')':
187     case ']':
188         ret->span()->spantype = Span_req::STOP;
189         break;
190     default:
191         assert(false);
192         break;
193     }
194
195     return ret;
196 }
197
198 void
199 add_requests(Voice_element *v, svec<Request*> &req)
200 {
201     for (int i = 0; i < req.sz(); i++) {
202         v->add(req[i]);
203     }
204     req.set_size(0);
205 }