]> git.donarmstrong.com Git - lilypond.git/blob - src/note.cc
30ded730d47f4910e89594854d9483d3b1ab5ae3
[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 "vray.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     case ']':
154     {
155         Beam_req*b = new Beam_req;
156         if (default_plet_type != 1)
157             b->nplet = default_plet_type;
158         ret = b;
159     }
160         break;
161
162     case ')':
163     case '(':
164         ret = new Slur_req;
165         break;
166     default:
167         assert(false);
168         break;
169     }
170     
171     switch (c) {
172     case '(':
173     case '[':
174         ret->span()->spantype = Span_req::START;
175         break;
176     case ')':
177     case ']':
178         ret->span()->spantype = Span_req::STOP;
179         break;
180     default:
181         assert(false);
182         break;
183     }
184
185     return ret;
186 }
187
188 void
189 add_requests(Voice_element *v, svec<Request*> &req)
190 {
191     for (int i = 0; i < req.sz(); i++) {
192         v->add(req[i]);
193     }
194     req.set_size(0);
195 }
196
197 Script_def*
198 get_scriptdef(char c)
199 {
200     String s;
201     switch (c) {
202     case '^' : s = "marcato";
203         break;
204     case  '+' : s = "stopped";
205         break;
206     case '-' : s = "portato";
207         break;
208     case  '|':  s = "staccatissimo";
209         break;
210     case  'o' : s = "";
211         break;
212     case '>' : s = "accent";
213         break;
214     case  'v' : s = ""; 
215         break;
216     case  '.' : s = "staccato";
217         break;
218     }
219     return lexer->lookup_identifier(s)->script(1);
220 }
221
222 Request*
223 get_script_req(int d , Script_def*def)
224 {
225     return new Script_req(d, def);
226 }
227
228
229 Request*
230 get_text_req(int d , Text_def*def)
231 {
232     return new Text_req(d, def);
233 }
234