summaryrefslogtreecommitdiff
path: root/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'config.c')
-rw-r--r--config.c178
1 files changed, 90 insertions, 88 deletions
diff --git a/config.c b/config.c
index 663f038..3aeee4f 100644
--- a/config.c
+++ b/config.c
@@ -59,36 +59,36 @@ enum {
59}; 59};
60 60
61typedef struct { 61typedef struct {
62 int id; 62 int id;
63 char *name; 63 char *name;
64} keyword; 64} keyword;
65 65
66static keyword keywords[] = { 66static keyword keywords[] = {
67 { KEYWORD_STRINGS, "Strings" }, 67 {KEYWORD_STRINGS, "Strings"},
68 { KEYWORD_STRING, "String" }, 68 {KEYWORD_STRING, "String"},
69 { KEYWORD_LINE, "Line" }, 69 {KEYWORD_LINE, "Line"},
70 { KEYWORD_MODE, "Mode" }, 70 {KEYWORD_MODE, "Mode"},
71 { KEYWORD_MODE_ONE_OCTAVE, "midi_one_octave" }, 71 {KEYWORD_MODE_ONE_OCTAVE, "midi_one_octave"},
72 { KEYWORD_MODE_TWO_OCTAVES, "midi_two_octaves" }, 72 {KEYWORD_MODE_TWO_OCTAVES, "midi_two_octaves"},
73 { KEYWORD_MODE_THREE_OCTAVES, "midi_three_octaves" }, 73 {KEYWORD_MODE_THREE_OCTAVES, "midi_three_octaves"},
74 { KEYWORD_MODE_CONTROL, "midi_control" }, 74 {KEYWORD_MODE_CONTROL, "midi_control"},
75 { KEYWORD_MODE_CONTROL_INVERSE, "midi_control_inverse" }, 75 {KEYWORD_MODE_CONTROL_INVERSE, "midi_control_inverse"},
76 { KEYWORD_CHANNEL, "Channel" }, 76 {KEYWORD_CHANNEL, "Channel"},
77 { KEYWORD_NOTE, "Note" }, 77 {KEYWORD_NOTE, "Note"},
78 { KEYWORD_AFTERTOUCH, "AfterTouch" }, 78 {KEYWORD_AFTERTOUCH, "AfterTouch"},
79 { KEYWORD_NONE, "none" }, 79 {KEYWORD_NONE, "none"},
80 { KEYWORD_PITCH_BEND_UP, "pitch_bend_up" }, 80 {KEYWORD_PITCH_BEND_UP, "pitch_bend_up"},
81 { KEYWORD_PITCH_BEND_DOWN, "pitch_bend_down" }, 81 {KEYWORD_PITCH_BEND_DOWN, "pitch_bend_down"},
82 { KEYWORD_MIDI_CONTROL, "midi_control" }, 82 {KEYWORD_MIDI_CONTROL, "midi_control"},
83 { KEYWORD_MIDI_CONTROL_INVERSE, "midi_control_inverse" }, 83 {KEYWORD_MIDI_CONTROL_INVERSE, "midi_control_inverse"},
84 { KEYWORD_CONTROLLER, "Controller" }, 84 {KEYWORD_CONTROLLER, "Controller"},
85 { KEYWORD_TIMETOSILENCE, "TimeToSilence" }, 85 {KEYWORD_TIMETOSILENCE, "TimeToSilence"},
86 { KEYWORD_TWOOCTAVESPLIT, "midi_two_octave_split" }, 86 {KEYWORD_TWOOCTAVESPLIT, "midi_two_octave_split"},
87 { KEYWORD_THREEOCTAVESPLIT_1, "midi_three_octave_split_1" }, 87 {KEYWORD_THREEOCTAVESPLIT_1, "midi_three_octave_split_1"},
88 { KEYWORD_THREEOCTAVESPLIT_2, "midi_three_octave_split_2" }, 88 {KEYWORD_THREEOCTAVESPLIT_2, "midi_three_octave_split_2"},
89 { KEYWORD_MIDI_MAIN_CONTROL, "midi_main_control" }, 89 {KEYWORD_MIDI_MAIN_CONTROL, "midi_main_control"},
90 { KEYWORD_MIDI_MAIN_CHANNEL, "midi_main_channel" }, 90 {KEYWORD_MIDI_MAIN_CHANNEL, "midi_main_channel"},
91 { -1, 0 } 91 {-1, 0}
92}; 92};
93 93
94static int g_current_string; 94static int g_current_string;
@@ -102,19 +102,20 @@ config_findkeyword(char **line)
102 while (isspace(*_l)) 102 while (isspace(*_l))
103 ++_l; 103 ++_l;
104 104
105 for (i=0; keywords[i].name; ++i) { 105 for (i = 0; keywords[i].name; ++i) {
106 size_t kl = strlen(keywords[i].name); 106 size_t kl = strlen(keywords[i].name);
107 if (!strncasecmp(_l, keywords[i].name, kl)) {
108 if (!isspace(_l[kl]) && _l[kl])
109 continue;
110 _l += strlen(keywords[i].name);
111 107
112 /* Skip rest of white spaces */ 108 if (!strncasecmp(_l, keywords[i].name, kl)) {
113 while (isspace(*_l)) 109 if (!isspace(_l[kl]) && _l[kl])
114 ++_l; 110 continue;
115 *line = _l; 111 _l += strlen(keywords[i].name);
116 return keywords[i].id; 112
117 } 113 /* Skip rest of white spaces */
114 while (isspace(*_l))
115 ++_l;
116 *line = _l;
117 return keywords[i].id;
118 }
118 } 119 }
119 return -1; 120 return -1;
120} 121}
@@ -143,14 +144,14 @@ config_handle_line(char *line)
143 int split_done = 0; 144 int split_done = 0;
144 char *_line = line; 145 char *_line = line;
145 146
146 //Skip leading spaces 147 /* Skip leading spaces */
147 while (isspace(*line)) 148 while (isspace(*line))
148 ++line; 149 ++line;
149 if (*line == 0 || *line == '#' || *line == '\n') 150 if (*line == 0 || *line == '#' || *line == '\n')
150 return 0; 151 return 0;
151 152
152 switch (config_findkeyword(&line)) { 153 switch (config_findkeyword(&line)) {
153 case KEYWORD_STRINGS: 154 case KEYWORD_STRINGS:
154 g_string_count = atol(line); 155 g_string_count = atol(line);
155 if (!g_string_count || g_string_count > MAX_LINECOUNT) { 156 if (!g_string_count || g_string_count > MAX_LINECOUNT) {
156 fprintf(stderr, "Incorrect number of strings: %s\n", _line); 157 fprintf(stderr, "Incorrect number of strings: %s\n", _line);
@@ -158,7 +159,7 @@ config_handle_line(char *line)
158 } 159 }
159 printf("GLOBAL: Configuring expected lines %d\n", g_string_count); 160 printf("GLOBAL: Configuring expected lines %d\n", g_string_count);
160 break; 161 break;
161 case KEYWORD_STRING: 162 case KEYWORD_STRING:
162 g_current_string = atol(line) - 1; 163 g_current_string = atol(line) - 1;
163 printf("Switching to string: %d\n", g_current_string + 1); 164 printf("Switching to string: %d\n", g_current_string + 1);
164 if (g_current_string < 0 || g_current_string > g_string_count) { 165 if (g_current_string < 0 || g_current_string > g_string_count) {
@@ -166,57 +167,58 @@ config_handle_line(char *line)
166 return -1; 167 return -1;
167 } 168 }
168 break; 169 break;
169 case KEYWORD_LINE: 170 case KEYWORD_LINE:
170 { 171 {
171 LLine *l = &sc->line; 172 LLine *l = &sc->line;
172 if (sscanf(line, "%d %d %d %d", &l->x0, &l->y0, &l->x1, &l->y1) != 4) {
173 fprintf(stderr, "Incorrect Line statement for string\n");
174 return -1;
175 }
176 if (l->y0 > l->y1) {
177 l->y0 ^= l->y1;
178 l->y1 ^= l->y0;
179 l->y0 ^= l->y1;
180 l->x0 ^= l->x1;
181 l->x1 ^= l->x0;
182 l->x0 ^= l->x1;
183 173
174 if (sscanf(line, "%d %d %d %d", &l->x0, &l->y0, &l->x1, &l->y1) != 4) {
175 fprintf(stderr, "Incorrect Line statement for string\n");
176 return -1;
177 }
178 if (l->y0 > l->y1) {
179 l->y0 ^= l->y1;
180 l->y1 ^= l->y0;
181 l->y0 ^= l->y1;
182 l->x0 ^= l->x1;
183 l->x1 ^= l->x0;
184 l->x0 ^= l->x1;
185
186 }
187 if (l->y0 > g_min_y)
188 g_min_y = l->y0;
189 if (l->y1 < g_max_y)
190 g_max_y = l->y1;
191 break;
184 } 192 }
185 if (l->y0 > g_min_y) 193 case KEYWORD_MODE:
186 g_min_y = l->y0;
187 if (l->y1 < g_max_y)
188 g_max_y = l->y1;
189 break;
190 }
191 case KEYWORD_MODE:
192 switch (config_findkeyword(&line)) { 194 switch (config_findkeyword(&line)) {
193 case KEYWORD_MODE_ONE_OCTAVE: 195 case KEYWORD_MODE_ONE_OCTAVE:
194 sc->mode = midi_one_octave; 196 sc->mode = midi_one_octave;
195 printf("String %d is midi_one_octave\n", 1 + g_current_string); 197 printf("String %d is midi_one_octave\n", 1 + g_current_string);
196 break; 198 break;
197 case KEYWORD_MODE_TWO_OCTAVES: 199 case KEYWORD_MODE_TWO_OCTAVES:
198 sc->mode = midi_two_octaves; 200 sc->mode = midi_two_octaves;
199 printf("String %d is midi_two_octaves\n", 1 + g_current_string); 201 printf("String %d is midi_two_octaves\n", 1 + g_current_string);
200 break; 202 break;
201 case KEYWORD_MODE_THREE_OCTAVES: 203 case KEYWORD_MODE_THREE_OCTAVES:
202 sc->mode = midi_three_octaves; 204 sc->mode = midi_three_octaves;
203 printf("String %d is midi_three_octaves\n", 1 + g_current_string); 205 printf("String %d is midi_three_octaves\n", 1 + g_current_string);
204 break; 206 break;
205 case KEYWORD_MODE_CONTROL: 207 case KEYWORD_MODE_CONTROL:
206 sc->mode = midi_control; 208 sc->mode = midi_control;
207 printf("String %d is midi_control\n", 1 + g_current_string); 209 printf("String %d is midi_control\n", 1 + g_current_string);
208 break; 210 break;
209 case KEYWORD_MODE_CONTROL_INVERSE: 211 case KEYWORD_MODE_CONTROL_INVERSE:
210 sc->mode = midi_control_inv; 212 sc->mode = midi_control_inv;
211 printf("String %d is midi_control_inverse\n", 1 + g_current_string); 213 printf("String %d is midi_control_inverse\n", 1 + g_current_string);
212 break; 214 break;
213 default: 215 default:
214 fprintf(stderr, "Illegal Mode for string: %s\n", _line); 216 fprintf(stderr, "Illegal Mode for string: %s\n", _line);
215 return -1; 217 return -1;
216 218
217 } 219 }
218 break; 220 break;
219 case KEYWORD_CHANNEL: 221 case KEYWORD_CHANNEL:
220 sc->channel = atol(line); 222 sc->channel = atol(line);
221 if (sc->channel > 16) { 223 if (sc->channel > 16) {
222 fprintf(stderr, "Incorrect channel specified: %s.\n", _line); 224 fprintf(stderr, "Incorrect channel specified: %s.\n", _line);
@@ -224,7 +226,7 @@ config_handle_line(char *line)
224 } 226 }
225 printf("String %d is on channel %d\n", g_current_string, sc->channel); 227 printf("String %d is on channel %d\n", g_current_string, sc->channel);
226 break; 228 break;
227 case KEYWORD_NOTE: 229 case KEYWORD_NOTE:
228 sc->note = config_midi_note_from_string(line); 230 sc->note = config_midi_note_from_string(line);
229 if (sc->note == 0xff) { 231 if (sc->note == 0xff) {
230 fprintf(stderr, "Unknown midi note specified: %s.\n", _line); 232 fprintf(stderr, "Unknown midi note specified: %s.\n", _line);
@@ -232,42 +234,42 @@ config_handle_line(char *line)
232 } 234 }
233 printf("String %d is midi note %d\n", g_current_string, sc->note); 235 printf("String %d is midi note %d\n", g_current_string, sc->note);
234 break; 236 break;
235 case KEYWORD_AFTERTOUCH: 237 case KEYWORD_AFTERTOUCH:
236 switch (config_findkeyword(&line)) { 238 switch (config_findkeyword(&line)) {
237 case KEYWORD_NONE: 239 case KEYWORD_NONE:
238 sc->modifier = none; 240 sc->modifier = none;
239 printf("String %d does not act aftertouch\n", 1 + g_current_string); 241 printf("String %d does not act aftertouch\n", 1 + g_current_string);
240 break; 242 break;
241 case KEYWORD_PITCH_BEND_UP: 243 case KEYWORD_PITCH_BEND_UP:
242 sc->modifier = pitch_bend_up; 244 sc->modifier = pitch_bend_up;
243 printf("String %d acts aftertouch as pitch_bend_up\n", 1 + g_current_string); 245 printf("String %d acts aftertouch as pitch_bend_up\n", 1 + g_current_string);
244 break; 246 break;
245 case KEYWORD_PITCH_BEND_DOWN: 247 case KEYWORD_PITCH_BEND_DOWN:
246 sc->modifier = pitch_bend_down; 248 sc->modifier = pitch_bend_down;
247 printf("String %d acts aftertouch as pitch_bend_down\n", 1 + g_current_string); 249 printf("String %d acts aftertouch as pitch_bend_down\n", 1 + g_current_string);
248 break; 250 break;
249 case KEYWORD_MIDI_CONTROL: 251 case KEYWORD_MIDI_CONTROL:
250 sc->modifier = midi_controller; 252 sc->modifier = midi_controller;
251 printf("String %d acts aftertouch as midi_controller\n", 1 + g_current_string); 253 printf("String %d acts aftertouch as midi_controller\n", 1 + g_current_string);
252 break; 254 break;
253 case KEYWORD_MIDI_CONTROL_INVERSE: 255 case KEYWORD_MIDI_CONTROL_INVERSE:
254 sc->modifier = midi_controller_inv; 256 sc->modifier = midi_controller_inv;
255 printf("String %d acts aftertouch as midi_controller_inverse\n", 1 + g_current_string); 257 printf("String %d acts aftertouch as midi_controller_inverse\n", 1 + g_current_string);
256 break; 258 break;
257 default: 259 default:
258 fprintf(stderr, "Illegal Modifier for string: %s\n", _line); 260 fprintf(stderr, "Illegal Modifier for string: %s\n", _line);
259 return -1; 261 return -1;
260 } 262 }
261 break; 263 break;
262 case KEYWORD_CONTROLLER: 264 case KEYWORD_CONTROLLER:
263 sc->controller = atol(line); 265 sc->controller = atol(line);
264 printf("String %d is on midi_controller line %d\n", 1 + g_current_string, sc->controller); 266 printf("String %d is on midi_controller line %d\n", 1 + g_current_string, sc->controller);
265 break; 267 break;
266 case KEYWORD_TIMETOSILENCE: 268 case KEYWORD_TIMETOSILENCE:
267 sc->timetosilence = atol(line); 269 sc->timetosilence = atol(line);
268 printf("String %d has a timetosilence of %d\n", 1 + g_current_string, sc->timetosilence); 270 printf("String %d has a timetosilence of %d\n", 1 + g_current_string, sc->timetosilence);
269 break; 271 break;
270 case KEYWORD_TWOOCTAVESPLIT: 272 case KEYWORD_TWOOCTAVESPLIT:
271 g_midi_two_octave_split = atol(line); 273 g_midi_two_octave_split = atol(line);
272 printf("Splitting TWO octaves at %d%%\n", g_midi_two_octave_split); 274 printf("Splitting TWO octaves at %d%%\n", g_midi_two_octave_split);
273 if (g_midi_two_octave_split < 0 || g_midi_two_octave_split > 100) { 275 if (g_midi_two_octave_split < 0 || g_midi_two_octave_split > 100) {
@@ -276,7 +278,7 @@ config_handle_line(char *line)
276 } 278 }
277 g_midi_two_octave_split = (256 * g_midi_two_octave_split) / 100; 279 g_midi_two_octave_split = (256 * g_midi_two_octave_split) / 100;
278 break; 280 break;
279 case KEYWORD_THREEOCTAVESPLIT_1: 281 case KEYWORD_THREEOCTAVESPLIT_1:
280 g_midi_three_octave_split_1 = atol(line); 282 g_midi_three_octave_split_1 = atol(line);
281 printf("Splitting THREE octaves top above %d%%\n", g_midi_three_octave_split_1); 283 printf("Splitting THREE octaves top above %d%%\n", g_midi_three_octave_split_1);
282 if (g_midi_three_octave_split_1 < 0 || g_midi_three_octave_split_1 > 100) { 284 if (g_midi_three_octave_split_1 < 0 || g_midi_three_octave_split_1 > 100) {
@@ -286,7 +288,7 @@ config_handle_line(char *line)
286 g_midi_three_octave_split_1 = (256 * g_midi_three_octave_split_1) / 100; 288 g_midi_three_octave_split_1 = (256 * g_midi_three_octave_split_1) / 100;
287 split_done = 1; 289 split_done = 1;
288 break; 290 break;
289 case KEYWORD_THREEOCTAVESPLIT_2: 291 case KEYWORD_THREEOCTAVESPLIT_2:
290 g_midi_three_octave_split_2 = atol(line); 292 g_midi_three_octave_split_2 = atol(line);
291 printf("Splitting THREE octaves bottom below %d%%\n", g_midi_three_octave_split_2); 293 printf("Splitting THREE octaves bottom below %d%%\n", g_midi_three_octave_split_2);
292 if (g_midi_three_octave_split_2 < 0 || g_midi_three_octave_split_2 > 100) { 294 if (g_midi_three_octave_split_2 < 0 || g_midi_three_octave_split_2 > 100) {
@@ -296,7 +298,7 @@ config_handle_line(char *line)
296 g_midi_three_octave_split_2 = (256 * g_midi_three_octave_split_2) / 100; 298 g_midi_three_octave_split_2 = (256 * g_midi_three_octave_split_2) / 100;
297 split_done = 1; 299 split_done = 1;
298 break; 300 break;
299 case KEYWORD_MIDI_MAIN_CONTROL: 301 case KEYWORD_MIDI_MAIN_CONTROL:
300 g_midi_main_control = atol(line); 302 g_midi_main_control = atol(line);
301 printf("All Strings modify controller %d\n", g_midi_main_control); 303 printf("All Strings modify controller %d\n", g_midi_main_control);
302 if (g_midi_main_control > 127) { 304 if (g_midi_main_control > 127) {
@@ -304,7 +306,7 @@ config_handle_line(char *line)
304 return -1; 306 return -1;
305 } 307 }
306 break; 308 break;
307 case KEYWORD_MIDI_MAIN_CHANNEL: 309 case KEYWORD_MIDI_MAIN_CHANNEL:
308 g_midi_main_channel = atol(line); 310 g_midi_main_channel = atol(line);
309 printf("All Strings modify controller %d on channel %d\n", g_midi_main_control, g_midi_main_channel); 311 printf("All Strings modify controller %d on channel %d\n", g_midi_main_control, g_midi_main_channel);
310 if (g_midi_main_channel < 1 || g_midi_main_channel > 16) { 312 if (g_midi_main_channel < 1 || g_midi_main_channel > 16) {
@@ -312,13 +314,13 @@ config_handle_line(char *line)
312 return -1; 314 return -1;
313 } 315 }
314 break; 316 break;
315 default: 317 default:
316 fprintf(stderr, "Unhandled config line: %s\n", _line); 318 fprintf(stderr, "Unhandled config line: %s\n", _line);
317 return -1; 319 return -1;
318 320
319 } 321 }
320 if (!split_done) 322 if (!split_done)
321 return 0; 323 return 0;
322 324
323 /* split also true for two octaves */ 325 /* split also true for two octaves */
324 if (g_midi_three_octave_split_2 < g_midi_three_octave_split_1) { 326 if (g_midi_three_octave_split_2 < g_midi_three_octave_split_1) {