]> git.donarmstrong.com Git - lilypond.git/blob - src/note.cc
release: 0.0.17
[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_octave (const char *a, int &j, int &oct)
15 {    
16     while (1) 
17     {   
18         if (a[j] == '\'')
19             oct ++;
20         else if (a[j] == '`')
21             oct --;
22         else
23             break;
24         j++;
25     }
26 }
27
28 void 
29 parse_pitchmod( const char *a, int &j, int &oct, bool & overide_acc)
30 {
31     // octave
32     oct =default_octave;
33     parse_octave(a,j,oct);
34         
35     // accidental
36     overide_acc = false;
37     
38     if (a[j] == '!')
39         {       
40         overide_acc = true;
41         j++;
42         }
43
44     mtor << "oct " << oct;
45     mtor << "override: " << overide_acc<<'\n';
46 }
47
48
49 Voice_element *
50 get_note_element(String pitch, int * notename, int * duration )
51 {
52     Voice_element*v = new Voice_element;
53     int i=0;
54     
55     int dur = duration[0];
56     int dots=duration[1];
57     
58     Note_req * rq = new Note_req;
59
60     if (dur >= 2) {
61         Stem_req * st = new Stem_req(dur);
62         v->add(st);
63     }
64     
65     int oct;
66     bool forceacc;
67     parse_pitchmod(pitch, i, oct, forceacc);
68     rq->name =notename[0];
69     rq->accidental = notename[1];
70     rq->octave = oct;
71     rq->forceacc = forceacc;
72     rq->balltype = dur;
73     rq->dots = dots;
74     
75     rq->print();
76
77     v->add(rq);
78
79     return v;
80 }
81
82 Voice_element *
83 get_rest_element(String,  int * duration )
84 {    
85     Voice_element*v = new Voice_element;
86
87     Rest_req * rq = new Rest_req;
88   
89     rq->balltype = duration[0];
90     rq->dots = duration[1];    
91     rq->print();
92     v->add(rq);
93
94     return v;
95 }
96
97 void
98 get_default_duration(int *p)
99 {
100    *p++ = default_duration;
101     *p = default_dots;
102 }
103
104 void
105 set_default_duration(int *p)
106 {
107      default_duration = *p++;
108      default_dots = *p++;
109 }
110
111
112 void
113 set_default_octave(String d)
114 {
115     int i=0;
116     default_octave=0;
117     parse_octave(d, i, default_octave);
118 }
119
120 Request*
121 get_request(char c)
122 {
123     Request* ret=0;
124     switch (c) {
125     case '[':
126     case ']':
127         ret = new Beam_req;
128         break;
129
130     case ')':
131     case '(':
132         ret = new Slur_req;
133         break;
134     default:
135         assert(false);
136         break;
137     }
138     
139     switch (c) {
140     case '(':
141     case '[':
142         ret->span()->spantype = Span_req::START;
143         break;
144     case ')':
145     case ']':
146         ret->span()->spantype = Span_req::STOP;
147         break;
148     default:
149         assert(false);
150         break;
151     }
152
153     return ret;
154 }
155
156 void
157 add_requests(Voice_element *v, svec<Request*> &req)
158 {
159     for (int i = 0; i < req.sz(); i++) {
160         v->add(req[i]);
161     }
162     req.set_size(0);
163 }