]> git.donarmstrong.com Git - lilypond.git/blob - note.cc
release: 0.0.3
[lilypond.git] / note.cc
1 #include <ctype.h>
2 #include "string.hh"
3 #include "real.hh"
4 #include "debug.hh"
5 #include "request.hh"
6 #include "voice.hh"
7 #include "notename.hh"
8
9 int default_duration = 4;
10
11 void
12 parse_duration(const char *a, int &j, int &intdur, int &dots)
13 {    
14     String durstr;    
15     while (isdigit(a[j])) 
16         {
17         durstr += a[j++];
18         }
19
20     dots=0;
21     
22     while (a[j] == '.') 
23         {
24         j++;
25         dots++;
26         }
27     intdur = (durstr.len()) ?
28         durstr.value():default_duration;
29
30
31     mtor << "dur " << intdur << "dots " << dots<<eol;
32 }
33
34
35 void 
36 parse_pitch( const char *a, int &j, int &oct, bool & overide_acc,
37              int & large, int & small)
38 {
39     // octave
40     oct =0;
41     
42     while (1) 
43         {       
44         if (a[j] == '\'')
45             oct ++;
46         else    if (a[j] == '`')
47             oct --;
48         else
49             break;
50         j++;
51         
52         }
53
54         mtor << "oct " << oct;
55         
56     // accidental
57     overide_acc = false;
58     
59     if (a[j] == '!')
60         {       
61         overide_acc = true;
62         j++;
63         }
64
65     
66     mtor << "ov " << overide_acc;
67     
68     // notename.
69     String nm;
70     while (isalpha(a[j])) 
71         {
72         nm += a[j++];
73         }
74     if (isupper(nm[0]))
75         {
76         oct--;  
77         nm.lower();
78         }
79         
80
81     lookup_notename(large,small,nm);    
82     mtor << "int "<< large <<" "<<small<<" ";    
83 }
84
85
86 Voice_element *
87 get_note_element(String pitch, String durstr)
88 {
89     Voice_element*v = new Voice_element;
90     int i=0;
91     
92     int dur, dots;
93     parse_duration(durstr, i, dur, dots);
94     i=0;
95
96     Note_req * rq = new Note_req( v);
97
98     int oct, pit, acc;
99     bool forceacc;
100     parse_pitch(pitch, i, oct, forceacc, pit, acc);
101
102     rq->octave = oct;
103     rq->accidental = acc;
104     rq->forceacc = forceacc;
105     rq->balltype = dur;
106     rq->dots = dots;
107     
108
109     v->add(rq);
110     return v;
111 }
112
113 Voice_element *
114 get_rest_element(String type, String durstr)
115 {    
116     Voice_element*v = new Voice_element;
117     int i=0;
118     
119     int dur, dots;
120     parse_duration(durstr, i, dur, dots);
121     i=0;
122
123     Rest_req * rq = new Rest_req(v);
124   
125     rq->balltype = dur;
126     rq->dots = dots;    
127
128     v->add(rq);
129     return v;
130 }