summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.c435
1 files changed, 219 insertions, 216 deletions
diff --git a/config.c b/config.c
index e8014c5..e29900f 100644
--- a/config.c
+++ b/config.c
@@ -137,292 +137,290 @@ static keyword keywords[] = {
137static int 137static int
138config_findkeyword(char **line) 138config_findkeyword(char **line)
139{ 139{
140 char *_l = *line; 140 char *_l = *line;
141 int i; 141 int i;
142 142
143 while (isspace(*_l)) 143 while (isspace(*_l))
144 ++_l; 144 ++_l;
145 145
146 for (i = 0; keywords[i].name; ++i) { 146 for (i = 0; keywords[i].name; ++i) {
147 size_t kl = strlen(keywords[i].name); 147 size_t kl = strlen(keywords[i].name);
148 148
149 if (!strncasecmp(_l, keywords[i].name, kl)) { 149 if (!strncasecmp(_l, keywords[i].name, kl)) {
150 if (!isspace(_l[kl]) && _l[kl]) 150 if (!isspace(_l[kl]) && _l[kl])
151 continue; 151 continue;
152 _l += strlen(keywords[i].name); 152 _l += strlen(keywords[i].name);
153 153
154 /* Skip rest of white spaces */ 154 /* Skip rest of white spaces */
155 while (isspace(*_l)) 155 while (isspace(*_l))
156 ++_l; 156 ++_l;
157 *line = _l; 157 *line = _l;
158 return keywords[i].id; 158 return keywords[i].id;
159 }
160 } 159 }
161 return -1; 160 }
161 return -1;
162} 162}
163 163
164static uint8_t 164static uint8_t
165config_midi_note_from_string(char *string) 165config_midi_note_from_string(char *string)
166{ 166{
167 int i; 167 int i;
168 168
169 for (i = 0; i < sizeof(midi_note) / sizeof(*midi_note); ++i) 169 for (i = 0; i < sizeof(midi_note) / sizeof(*midi_note); ++i)
170 if (!strncasecmp(string, midi_note[i], strlen(midi_note[i]))) 170 if (!strncasecmp(string, midi_note[i], strlen(midi_note[i])))
171 return i; 171 return i;
172 return 0xff; 172 return 0xff;
173} 173}
174 174
175char * 175char *
176config_midi_note_to_string(int string) 176config_midi_note_to_string(int string)
177{ 177{
178 return midi_note[string]; 178 return midi_note[string];
179} 179}
180 180
181int 181int
182config_handle_line(char *line) 182config_handle_line(char *line)
183{ 183{
184 StringConfig *sc = g_string_conf + g_current_string; 184 StringConfig *sc = g_string_conf + g_current_string;
185 int split_done = 0; 185 int split_done = 0;
186 char *_line = line; 186 char *_line = line;
187 187
188 /* Skip leading spaces */ 188 /* Skip leading spaces */
189 while (isspace(*line)) 189 while (isspace(*line))
190 ++line; 190 ++line;
191 if (*line == 0 || *line == '#' || *line == '\n') 191 if (*line == 0 || *line == '#' || *line == '\n')
192 return 0; 192 return 0;
193 193
194 switch (config_findkeyword(&line)) { 194 switch (config_findkeyword(&line)) {
195 case KEYWORD_STRINGS: 195 case KEYWORD_STRINGS:
196 g_string_count = atol(line); 196 g_string_count = atol(line);
197 if (!g_string_count || g_string_count > MAX_LINECOUNT) { 197 if (!g_string_count || g_string_count > MAX_LINECOUNT) {
198 harfe_error(stderr, "Incorrect number of strings: %s\n", _line); 198 harfe_error(stderr, "Incorrect number of strings: %s\n", _line);
199 return -1; 199 return -1;
200 } 200 }
201 harfe_debug("GLOBAL: Configuring expected lines %d\n", g_string_count); 201 harfe_debug("GLOBAL: Configuring expected lines %d\n", g_string_count);
202 break; 202 break;
203 case KEYWORD_STRING: 203 case KEYWORD_STRING:
204 g_current_string = atol(line) - 1; 204 g_current_string = atol(line) - 1;
205 harfe_debug("Switching to string: %d\n", g_current_string + 1); 205 harfe_debug("Switching to string: %d\n", g_current_string + 1);
206 if (g_current_string < 0 || g_current_string > g_string_count) { 206 if (g_current_string < 0 || g_current_string > g_string_count) {
207 harfe_error(stderr, "Incorrect string selected: %s\n", _line); 207 harfe_error(stderr, "Incorrect string selected: %s\n", _line);
208 return -1; 208 return -1;
209 } 209 }
210 break; 210 break;
211 case KEYWORD_LINE: 211 case KEYWORD_LINE:
212 { 212 {
213 LLine *l = &sc->line; 213 LLine *l = &sc->line;
214 214
215 if (sscanf(line, "%d %d %d %d", &l->p0.x, &l->p0.y, &l->p1.x, &l->p1.y) != 4) { 215 if (sscanf(line, "%d %d %d %d", &l->p0.x, &l->p0.y, &l->p1.x, &l->p1.y) != 4) {
216 harfe_error(stderr, "Incorrect Line statement for string\n"); 216 harfe_error(stderr, "Incorrect Line statement for string\n");
217 return -1; 217 return -1;
218 } 218 }
219 if (l->p0.y > l->p1.y) { 219 if (l->p0.y > l->p1.y) {
220 LPoint tmp = l->p0; 220 LPoint tmp = l->p0;
221 l->p0 = l->p1; 221 l->p0 = l->p1;
222 l->p1 = tmp; 222 l->p1 = tmp;
223 }
224 if (l->p0.y > g_min_y)
225 g_min_y = l->p0.y;
226 if (l->p0.y < g_max_y)
227 g_max_y = l->p1.y;
228 break;
229 } 223 }
224 if (l->p0.y > g_min_y)
225 g_min_y = l->p0.y;
226 if (l->p0.y < g_max_y)
227 g_max_y = l->p1.y;
228 break;
229 }
230 case KEYWORD_MODE: 230 case KEYWORD_MODE:
231 switch (config_findkeyword(&line)) { 231 switch (config_findkeyword(&line)) {
232 case KEYWORD_MODE_ONE_OCTAVE: 232 case KEYWORD_MODE_ONE_OCTAVE:
233 sc->mode = midi_one_octave; 233 sc->mode = midi_one_octave;
234 harfe_debug("String %d is midi_one_octave\n", 1 + g_current_string); 234 harfe_debug("String %d is midi_one_octave\n", 1 + g_current_string);
235 break; 235 break;
236 case KEYWORD_MODE_TWO_OCTAVES: 236 case KEYWORD_MODE_TWO_OCTAVES:
237 sc->mode = midi_two_octaves; 237 sc->mode = midi_two_octaves;
238 harfe_debug("String %d is midi_two_octaves\n", 1 + g_current_string); 238 harfe_debug("String %d is midi_two_octaves\n", 1 + g_current_string);
239 break; 239 break;
240 case KEYWORD_MODE_THREE_OCTAVES: 240 case KEYWORD_MODE_THREE_OCTAVES:
241 sc->mode = midi_three_octaves; 241 sc->mode = midi_three_octaves;
242 harfe_debug("String %d is midi_three_octaves\n", 1 + g_current_string); 242 harfe_debug("String %d is midi_three_octaves\n", 1 + g_current_string);
243 break; 243 break;
244 case KEYWORD_MODE_CONTROL: 244 case KEYWORD_MODE_CONTROL:
245 sc->mode = midi_control; 245 sc->mode = midi_control;
246 harfe_debug("String %d is midi_control\n", 1 + g_current_string); 246 harfe_debug("String %d is midi_control\n", 1 + g_current_string);
247 break; 247 break;
248 case KEYWORD_MODE_CONTROL_INVERSE: 248 case KEYWORD_MODE_CONTROL_INVERSE:
249 sc->mode = midi_control_inv; 249 sc->mode = midi_control_inv;
250 harfe_debug("String %d is midi_control_inverse\n", 1 + g_current_string); 250 harfe_debug("String %d is midi_control_inverse\n", 1 + g_current_string);
251 break; 251 break;
252 default: 252 default:
253 harfe_error(stderr, "Illegal Mode for string: %s\n", _line); 253 harfe_error(stderr, "Illegal Mode for string: %s\n", _line);
254 return -1; 254 return -1;
255 255
256 } 256 }
257 break; 257 break;
258 case KEYWORD_CHANNEL: 258 case KEYWORD_CHANNEL:
259 sc->channel = atol(line); 259 sc->channel = atol(line);
260 if (sc->channel > 16) { 260 if (sc->channel > 16) {
261 harfe_error(stderr, "Incorrect channel specified: %s.\n", _line); 261 harfe_error(stderr, "Incorrect channel specified: %s.\n", _line);
262 return -1; 262 return -1;
263 } 263 }
264 harfe_debug("String %d is on channel %d\n", 1 + g_current_string, sc->channel); 264 harfe_debug("String %d is on channel %d\n", 1 + g_current_string, sc->channel);
265 break; 265 break;
266 case KEYWORD_NOTE: 266 case KEYWORD_NOTE:
267 sc->note = config_midi_note_from_string(line); 267 sc->note = config_midi_note_from_string(line);
268 if (sc->note == 0xff) { 268 if (sc->note == 0xff) {
269 harfe_error(stderr, "Unknown midi note specified: %s.\n", _line); 269 harfe_error(stderr, "Unknown midi note specified: %s.\n", _line);
270 return -1; 270 return -1;
271 } 271 }
272 harfe_debug("String %d is midi note %d\n", 1 + g_current_string, sc->note); 272 harfe_debug("String %d is midi note %d\n", 1 + g_current_string, sc->note);
273 break; 273 break;
274 case KEYWORD_AFTERTOUCH: 274 case KEYWORD_AFTERTOUCH:
275 switch (config_findkeyword(&line)) { 275 switch (config_findkeyword(&line)) {
276 case KEYWORD_NONE: 276 case KEYWORD_NONE:
277 sc->modifier = none; 277 sc->modifier = none;
278 harfe_debug("String %d does not act aftertouch\n", 1 + g_current_string); 278 harfe_debug("String %d does not act aftertouch\n", 1 + g_current_string);
279 break; 279 break;
280 case KEYWORD_PITCH_BEND_UP: 280 case KEYWORD_PITCH_BEND_UP:
281 sc->modifier = pitch_bend_up; 281 sc->modifier = pitch_bend_up;
282 harfe_debug("String %d acts aftertouch as pitch_bend_up\n", 1 + g_current_string); 282 harfe_debug("String %d acts aftertouch as pitch_bend_up\n", 1 + g_current_string);
283 break; 283 break;
284 case KEYWORD_PITCH_BEND_DOWN: 284 case KEYWORD_PITCH_BEND_DOWN:
285 sc->modifier = pitch_bend_down; 285 sc->modifier = pitch_bend_down;
286 harfe_debug("String %d acts aftertouch as pitch_bend_down\n", 1 + g_current_string); 286 harfe_debug("String %d acts aftertouch as pitch_bend_down\n", 1 + g_current_string);
287 break; 287 break;
288 case KEYWORD_MIDI_CONTROL: 288 case KEYWORD_MIDI_CONTROL:
289 sc->modifier = midi_controller; 289 sc->modifier = midi_controller;
290 harfe_debug("String %d acts aftertouch as midi_controller\n", 1 + g_current_string); 290 harfe_debug("String %d acts aftertouch as midi_controller\n", 1 + g_current_string);
291 break; 291 break;
292 case KEYWORD_MIDI_CONTROL_INVERSE: 292 case KEYWORD_MIDI_CONTROL_INVERSE:
293 sc->modifier = midi_controller_inv; 293 sc->modifier = midi_controller_inv;
294 harfe_debug("String %d acts aftertouch as midi_controller_inverse\n", 1 + g_current_string); 294 harfe_debug("String %d acts aftertouch as midi_controller_inverse\n", 1 + g_current_string);
295 break; 295 break;
296 default: 296 default:
297 harfe_error(stderr, "Illegal Modifier for string: %s\n", _line); 297 harfe_error(stderr, "Illegal Modifier for string: %s\n", _line);
298 return -1; 298 return -1;
299 } 299 }
300 break; 300 break;
301 case KEYWORD_PITCHFACTOR: 301 case KEYWORD_PITCHFACTOR:
302 sc->pitch_factor = atol(line); 302 sc->pitch_factor = atol(line);
303 harfe_debug("String %d is given a custom pitch factor of %d\n", 1 + g_current_string, sc->pitch_factor); 303 harfe_debug("String %d is given a custom pitch factor of %d\n", 1 + g_current_string, sc->pitch_factor);
304 break; 304 break;
305 case KEYWORD_CONTROLLER: 305 case KEYWORD_CONTROLLER:
306 sc->controller = atol(line); 306 sc->controller = atol(line);
307 harfe_debug("String %d is on midi_controller line %d\n", 1 + g_current_string, sc->controller); 307 harfe_debug("String %d is on midi_controller line %d\n", 1 + g_current_string, sc->controller);
308 break; 308 break;
309 case KEYWORD_TIMETOSILENCE: 309 case KEYWORD_TIMETOSILENCE:
310 sc->timetosilence = atol(line); 310 sc->timetosilence = atol(line);
311 harfe_debug("String %d has a timetosilence of %d\n", 1 + g_current_string, sc->timetosilence); 311 harfe_debug("String %d has a timetosilence of %d\n", 1 + g_current_string, sc->timetosilence);
312 break; 312 break;
313 case KEYWORD_TWOOCTAVESPLIT: 313 case KEYWORD_TWOOCTAVESPLIT:
314 g_midi_two_octave_split = atol(line); 314 g_midi_two_octave_split = atol(line);
315 harfe_debug("Splitting TWO octaves at %d%%\n", g_midi_two_octave_split); 315 harfe_debug("Splitting TWO octaves at %d%%\n", g_midi_two_octave_split);
316 if (g_midi_two_octave_split < 0 || g_midi_two_octave_split > 100) { 316 if (g_midi_two_octave_split < 0 || g_midi_two_octave_split > 100) {
317 harfe_error(stderr, "Invalid percentage in line: %s\n", _line); 317 harfe_error(stderr, "Invalid percentage in line: %s\n", _line);
318 exit(1); 318 exit(1);
319 } 319 }
320 break; 320 break;
321 case KEYWORD_THREEOCTAVESPLIT_1: 321 case KEYWORD_THREEOCTAVESPLIT_1:
322 g_midi_three_octave_split_1 = atol(line); 322 g_midi_three_octave_split_1 = atol(line);
323 harfe_debug("Splitting THREE octaves top above %d%%\n", g_midi_three_octave_split_1); 323 harfe_debug("Splitting THREE octaves top above %d%%\n", g_midi_three_octave_split_1);
324 if (g_midi_three_octave_split_1 < 0 || g_midi_three_octave_split_1 > 100) { 324 if (g_midi_three_octave_split_1 < 0 || g_midi_three_octave_split_1 > 100) {
325 harfe_error(stderr, "Invalid percentage in line: %s\n", _line); 325 harfe_error(stderr, "Invalid percentage in line: %s\n", _line);
326 exit(1); 326 exit(1);
327 } 327 }
328 split_done = 1; 328 split_done = 1;
329 break; 329 break;
330 case KEYWORD_THREEOCTAVESPLIT_2: 330 case KEYWORD_THREEOCTAVESPLIT_2:
331 g_midi_three_octave_split_2 = atol(line); 331 g_midi_three_octave_split_2 = atol(line);
332 harfe_debug("Splitting THREE octaves bottom below %d%%\n", g_midi_three_octave_split_2); 332 harfe_debug("Splitting THREE octaves bottom below %d%%\n", g_midi_three_octave_split_2);
333 if (g_midi_three_octave_split_2 < 0 || g_midi_three_octave_split_2 > 100) { 333 if (g_midi_three_octave_split_2 < 0 || g_midi_three_octave_split_2 > 100) {
334 harfe_error(stderr, "Invalid percentage in line: %s\n", _line); 334 harfe_error(stderr, "Invalid percentage in line: %s\n", _line);
335 return -1; 335 return -1;
336 } 336 }
337 split_done = 1; 337 split_done = 1;
338 break; 338 break;
339 case KEYWORD_MIDI_MAIN_CONTROL: 339 case KEYWORD_MIDI_MAIN_CONTROL:
340 g_midi_main_control = atol(line); 340 g_midi_main_control = atol(line);
341 harfe_debug("All Strings modify controller %d\n", g_midi_main_control); 341 harfe_debug("All Strings modify controller %d\n", g_midi_main_control);
342 if (g_midi_main_control > 127) { 342 if (g_midi_main_control > 127) {
343 harfe_error(stderr, "Invalid controller number %d in line: %s\n", g_midi_main_control, _line); 343 harfe_error(stderr, "Invalid controller number %d in line: %s\n", g_midi_main_control, _line);
344 return -1; 344 return -1;
345 } 345 }
346 break; 346 break;
347 case KEYWORD_MIDI_MAIN_CHANNEL: 347 case KEYWORD_MIDI_MAIN_CHANNEL:
348 g_midi_main_channel = atol(line); 348 g_midi_main_channel = atol(line);
349 harfe_debug("All Strings modify controller %d on channel %d\n", g_midi_main_control, g_midi_main_channel); 349 harfe_debug("All Strings modify controller %d on channel %d\n", g_midi_main_control, g_midi_main_channel);
350 if (g_midi_main_channel < 1 || g_midi_main_channel > 16) { 350 if (g_midi_main_channel < 1 || g_midi_main_channel > 16) {
351 harfe_error(stderr, "Invalid channel number %d in line: %s\n", g_midi_main_channel, _line); 351 harfe_error(stderr, "Invalid channel number %d in line: %s\n", g_midi_main_channel, _line);
352 return -1; 352 return -1;
353 } 353 }
354 break; 354 break;
355 case KEYWORD_SETTLED_DIST: 355 case KEYWORD_SETTLED_DIST:
356 g_settled_dist = atol(line); 356 g_settled_dist = atol(line);
357 harfe_debug("All AfterTouch events take place only after movement has slown down to %d points\n", g_settled_dist); 357 harfe_debug("All AfterTouch events take place only after movement has slown down to %d points\n", g_settled_dist);
358 break; 358 break;
359 default: 359 default:
360 harfe_error(stderr, "Unhandled config line: %s\n", _line); 360 harfe_error(stderr, "Unhandled config line: %s\n", _line);
361 return -1; 361 return -1;
362
363 }
364 if (!split_done)
365 return 0;
366
367 /* split also true for two octaves */
368 if (g_midi_three_octave_split_2 < g_midi_three_octave_split_1) {
369 g_midi_three_octave_split_inverse = g_midi_three_octave_split_1;
370 g_midi_three_octave_split_1 = g_midi_three_octave_split_2;
371 g_midi_three_octave_split_2 = g_midi_three_octave_split_inverse;
372 g_midi_three_octave_split_inverse = 1;
373 } else
374 g_midi_three_octave_split_inverse = 0;
375 362
363 }
364 if (!split_done)
376 return 0; 365 return 0;
366
367 /* split also true for two octaves */
368 if (g_midi_three_octave_split_2 < g_midi_three_octave_split_1) {
369 g_midi_three_octave_split_inverse = g_midi_three_octave_split_1;
370 g_midi_three_octave_split_1 = g_midi_three_octave_split_2;
371 g_midi_three_octave_split_2 = g_midi_three_octave_split_inverse;
372 g_midi_three_octave_split_inverse = 1;
373 } else
374 g_midi_three_octave_split_inverse = 0;
375
376 return 0;
377} 377}
378 378
379size_t 379size_t
380config_dumpglobals(char *out, size_t outsize) 380config_dumpglobals(char *out, size_t outsize)
381{ 381{
382 int tos1 = g_midi_three_octave_split_inverse ? g_midi_three_octave_split_2 : g_midi_three_octave_split_1; 382 int tos1 = g_midi_three_octave_split_inverse ? g_midi_three_octave_split_2 : g_midi_three_octave_split_1;
383 int tos2 = g_midi_three_octave_split_inverse ? g_midi_three_octave_split_1 : g_midi_three_octave_split_2; 383 int tos2 = g_midi_three_octave_split_inverse ? g_midi_three_octave_split_1 : g_midi_three_octave_split_2;
384 384
385 size_t off = snprintf(out, outsize, 385 size_t off = snprintf(out, outsize,
386 "Strings %d\n\nmidi_two_octave_split %d\nmidi_three_octave_split_1 %d\nmidi_three_octave_split_2 %d\n", 386 "Strings %d\n\nmidi_two_octave_split %d\nmidi_three_octave_split_1 %d\nmidi_three_octave_split_2 %d\n",
387 g_string_count, g_midi_two_octave_split, tos1, tos2 ); 387 g_string_count, g_midi_two_octave_split, tos1, tos2 );
388 388
389 if (g_midi_main_control >= 0) 389 if (g_midi_main_control >= 0)
390 off += snprintf(out + off, outsize - off, 390 off += snprintf(out + off, outsize - off,
391 "midi_main_control %d\n\n", g_midi_main_control); 391 "midi_main_control %d\n\n", g_midi_main_control);
392 392
393 if (g_midi_main_channel > 0) 393 if (g_midi_main_channel > 0)
394 off += snprintf(out + off, outsize - off, 394 off += snprintf(out + off, outsize - off,
395 "midi_main_channel %d\n\n", g_midi_main_channel); 395 "midi_main_channel %d\n\n", g_midi_main_channel);
396 396
397 if (g_settled_dist != 5) 397 if (g_settled_dist != 5)
398 off += snprintf(out + off, outsize - off, 398 off += snprintf(out + off, outsize - off,
399 "SettledDist %d\n\n", g_settled_dist); 399 "SettledDist %d\n\n", g_settled_dist);
400 off += snprintf(out + off, outsize - off, "\n" ); 400 off += snprintf(out + off, outsize - off, "\n" );
401 return off; 401 return off;
402} 402}
403 403
404size_t 404size_t
405config_dumpstring(int string, char *out, size_t outsize) 405config_dumpstring(int string, char *out, size_t outsize)
406{ 406{
407 StringConfig *s = g_string_conf + string; 407 StringConfig *s = g_string_conf + string;
408 408
409 if (string < 0 || string > g_string_count || !out) { 409 if (string < 0 || string > g_string_count || !out) {
410 if (out && outsize) *out = 0; 410 if (out && outsize) *out = 0;
411 return 0; 411 return 0;
412 } 412 }
413 size_t off = snprintf(out, outsize, 413 size_t off = snprintf(out, outsize,
414 "String %d\n Line %d %d %d %d\n Mode %s\n Channel %d\n Note %s\n AfterTouch %s\n Controller %d\n", 414 "String %d\n Line %d %d %d %d\n Mode %s\n Channel %d\n Note %s\n AfterTouch %s\n Controller %d\n",
415 string + 1, s->line.p0.x, s->line.p0.y, s->line.p1.x, s->line.p1.y, 415 string + 1, s->line.p0.x, s->line.p0.y, s->line.p1.x, s->line.p1.y,
416 mode_names[s->mode], s->channel, midi_note[s->note], modifier_names[s->modifier], s->controller ); 416 mode_names[s->mode], s->channel, midi_note[s->note], modifier_names[s->modifier], s->controller );
417 417
418 if (s->timetosilence) 418 if (s->timetosilence)
419 off += snprintf(out + off, outsize - off, 419 off += snprintf(out + off, outsize - off, " TimeToSilence %d\n", s->timetosilence);
420 " TimeToSilence %d\n", s->timetosilence); 420 if (s->pitch_factor)
421 if (s->pitch_factor) 421 off += snprintf(out + off, outsize - off, " PitchFactor %d\n", s->pitch_factor);
422 off += snprintf(out + off, outsize - off, 422 off += snprintf(out + off, outsize - off, "\n" );
423 " PitchFactor %d\n", s->pitch_factor); 423 return off;
424 off += snprintf(out + off, outsize - off, "\n" );
425 return off;
426} 424}
427 425
428void 426void
@@ -440,7 +438,12 @@ config_reverse_strings()
440void 438void
441config_flip_y() 439config_flip_y()
442{ 440{
441 int i;
443 g_midi_three_octave_split_inverse ^= 1; 442 g_midi_three_octave_split_inverse ^= 1;
444 g_config_source = source_edit; 443 g_config_source = source_edit;
445 /* TODO: flip pit bend */ 444 for (i=0; i<g_string_count; ++i)
445 if (g_string_conf[i].modifier == pitch_bend_up)
446 g_string_conf[i].modifier = pitch_bend_down;
447 else if (g_string_conf[i].modifier == pitch_bend_down)
448 g_string_conf[i].modifier = pitch_bend_up;
446} 449}