diff options
author | erdgeist <erdgeist@bauklotz.fritz.box> | 2016-08-12 14:46:51 +0200 |
---|---|---|
committer | erdgeist <erdgeist@bauklotz.fritz.box> | 2016-08-12 14:46:51 +0200 |
commit | a8be0d3d20f07d4561826b01f566ca307eb23526 (patch) | |
tree | b2c5c6d513ae3a84aba8e4eea94ec32e46d352fa /config.c |
commit as a backup
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/config.c b/config.c new file mode 100644 index 0000000..8465dc7 --- /dev/null +++ b/config.c | |||
@@ -0,0 +1,309 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include <fcntl.h> | ||
3 | #include <stdio.h> | ||
4 | #include <string.h> | ||
5 | #include <ctype.h> | ||
6 | |||
7 | #include "main.h" | ||
8 | #include "config.h" | ||
9 | |||
10 | int g_midi_main_control = -1; | ||
11 | int g_midi_main_channel = 0; | ||
12 | int g_midi_two_octave_split = 256 / 2; | ||
13 | int g_midi_three_octave_split_1 = 256 / 3; | ||
14 | int g_midi_three_octave_split_2 = 512 / 3; | ||
15 | int g_midi_three_octave_split_inverse = 0; | ||
16 | int g_settled_dist = 5; | ||
17 | int g_timetosilence = 30; | ||
18 | |||
19 | int g_min_y = 0, g_max_y; | ||
20 | |||
21 | static char *midi_note[] = { | ||
22 | "C-1", "C#-1", "D-1", "D#-1", "E-1", "F-1", "F#-1", "G-1", "G#-1", "A-1", "A#-1", "B-1", | ||
23 | "C0", "C#0", "D0", "D#0", "E0", "F0", "F#0", "G0", "G#0", "A0", "A#0", "B0", | ||
24 | "C1", "C#1", "D1", "D#1", "E1", "F1", "F#1", "G1", "G#1", "A1", "A#1", "B1", | ||
25 | "C2", "C#2", "D2", "D#2", "E2", "F2", "F#2", "G2", "G#2", "A2", "A#2", "B2", | ||
26 | "C3", "C#3", "D3", "D#3", "E3", "F3", "F#3", "G3", "G#3", "A3", "A#3", "B3", | ||
27 | "C4", "C#4", "D4", "D#4", "E4", "F4", "F#4", "G4", "G#4", "A4", "A#4", "B4", | ||
28 | "C5", "C#5", "D5", "D#5", "E5", "F5", "F#5", "G5", "G#5", "A5", "A#5", "B5", | ||
29 | "C6", "C#6", "D6", "D#6", "E6", "F6", "F#6", "G6", "G#6", "A6", "A#6", "B6", | ||
30 | "C7", "C#7", "D7", "D#7", "E7", "F7", "F#7", "G7", "G#7", "A7", "A#7", "B7", | ||
31 | "C8", "C#8", "D8", "D#8", "E8", "F8", "F#8", "G8", "G#8", "A8", "A#8", "B8", | ||
32 | "C9", "C#9", "D9", "D#9", "E9", "F9", "F#9", "G9", "G#9", "A9", "A#9", "B9" | ||
33 | }; | ||
34 | |||
35 | static uint8_t | ||
36 | config_midi_note_from_string(char *string) | ||
37 | { | ||
38 | int i; | ||
39 | |||
40 | for (i = 0; i < sizeof(midi_note) / sizeof(*midi_note); ++i) | ||
41 | if (!strncasecmp(string, midi_note[i], strlen(midi_note[i]))) | ||
42 | return i; | ||
43 | return 0xff; | ||
44 | } | ||
45 | |||
46 | char *config_midi_note_to_string(int string) { | ||
47 | return midi_note[string]; | ||
48 | } | ||
49 | |||
50 | #define LINEBUFFER 512 | ||
51 | static char *config_file; | ||
52 | void | ||
53 | config_parse(char *config_file_in) | ||
54 | { | ||
55 | FILE *fh; | ||
56 | char line_in[LINEBUFFER]; | ||
57 | int current_string = -1; | ||
58 | |||
59 | if (!config_file_in && !config_file) | ||
60 | return; | ||
61 | if (config_file_in) | ||
62 | config_file = config_file_in; | ||
63 | fh = fopen(config_file, "r"); | ||
64 | |||
65 | if (!fh) { | ||
66 | fprintf(stderr, "Couldn't open config file %s, exiting.\n", config_file); | ||
67 | exit(1); | ||
68 | } | ||
69 | |||
70 | //Reinitialise string config array | ||
71 | memset(g_string_conf, 0, sizeof(g_string_conf)); | ||
72 | g_max_y = 1024; | ||
73 | |||
74 | while (!feof(fh)) { | ||
75 | char *line = fgets(line_in, LINEBUFFER, fh); | ||
76 | |||
77 | if (!line) | ||
78 | break; | ||
79 | |||
80 | //Skip leading spaces | ||
81 | while (isspace(*line)) | ||
82 | ++line; | ||
83 | if (*line == 0 || *line == '#' || *line == '\n') | ||
84 | continue; | ||
85 | |||
86 | if (!strncasecmp(line, "Strings", 7) && isspace(line[7])) { | ||
87 | line += 7; | ||
88 | while (isspace(*line)) | ||
89 | ++line; | ||
90 | g_string_count = atol(line); | ||
91 | if (!g_string_count || g_string_count > MAX_LINECOUNT) { | ||
92 | fprintf(stderr, "Incorrect number of strings: %s\n", line); | ||
93 | exit(1); | ||
94 | } | ||
95 | printf("GLOBAL: Configuring expected lines %d\n", g_string_count); | ||
96 | } else if (!strncasecmp(line, "String", 6) && isspace(line[6])) { | ||
97 | line += 6; | ||
98 | while (isspace(*line)) | ||
99 | ++line; | ||
100 | current_string = atol(line); | ||
101 | printf("Switching to string: %d\n", current_string); | ||
102 | if (current_string < 0 || current_string > g_string_count) { | ||
103 | fprintf(stderr, "Incorrect string selected: %s\n", line); | ||
104 | exit(1); | ||
105 | } | ||
106 | } else if (!strncasecmp(line, "Line", 4) && isspace(line[4])) { | ||
107 | LLine *l = &g_string_conf[current_string - 1].line; | ||
108 | |||
109 | if (current_string == -1) { | ||
110 | fprintf(stderr, "No string selected yet.\n"); | ||
111 | exit(1); | ||
112 | } | ||
113 | line += 4; | ||
114 | while (isspace(*line)) | ||
115 | ++line; | ||
116 | if (sscanf(line, "%d %d %d %d", &l->x0, &l->y0, &l->x1, &l->y1) != 4) { | ||
117 | fprintf(stderr, "Incorrect Line statement for string\n"); | ||
118 | exit(1); | ||
119 | } | ||
120 | if (l->y0 > l->y1) { | ||
121 | l->y0 ^= l->y1; | ||
122 | l->y1 ^= l->y0; | ||
123 | l->y0 ^= l->y1; | ||
124 | l->x0 ^= l->x1; | ||
125 | l->x1 ^= l->x0; | ||
126 | l->x0 ^= l->x1; | ||
127 | |||
128 | } | ||
129 | if (l->y0 > g_min_y) | ||
130 | g_min_y = l->y0; | ||
131 | if (l->y1 < g_max_y) | ||
132 | g_max_y = l->y1; | ||
133 | } else if (!strncasecmp(line, "Mode", 4) && isspace(line[4])) { | ||
134 | if (current_string == -1) { | ||
135 | fprintf(stderr, "No string selected yet.\n"); | ||
136 | exit(1); | ||
137 | } | ||
138 | line += 4; | ||
139 | while (isspace(*line)) | ||
140 | ++line; | ||
141 | if (!strncasecmp(line, "midi_one_octave", 15) && (!line[15] || isspace(line[15]))) { | ||
142 | g_string_conf[current_string - 1].mode = midi_one_octave; | ||
143 | printf("String %d is midi_one_octave\n", current_string); | ||
144 | } else if (!strncasecmp(line, "midi_two_octaves", 16) && (!line[16] || isspace(line[16]))) { | ||
145 | g_string_conf[current_string - 1].mode = midi_two_octaves; | ||
146 | printf("String %d is midi_two_octaves\n", current_string); | ||
147 | } else if (!strncasecmp(line, "midi_three_octaves", 18) && (!line[18] || isspace(line[18]))) { | ||
148 | g_string_conf[current_string - 1].mode = midi_three_octaves; | ||
149 | printf("String %d is midi_three_octaves\n", current_string); | ||
150 | } else if (!strncasecmp(line, "midi_control", 12) && (!line[12] || isspace(line[12]))) { | ||
151 | g_string_conf[current_string - 1].mode = midi_control; | ||
152 | printf("String %d is midi_control\n", current_string); | ||
153 | } else if (!strncasecmp(line, "midi_control_inverse", 20) && (!line[20] || isspace(line[20]))) { | ||
154 | g_string_conf[current_string - 1].mode = midi_control_inv; | ||
155 | printf("String %d is midi_control_inverse\n", current_string); | ||
156 | } else { | ||
157 | fprintf(stderr, "Illegal Mode for string: %s\n", line); | ||
158 | exit(1); | ||
159 | } | ||
160 | } else if (!strncasecmp(line, "Channel", 7) && isspace(line[7])) { | ||
161 | if (current_string == -1) { | ||
162 | fprintf(stderr, "No string selected yet.\n"); | ||
163 | exit(1); | ||
164 | } | ||
165 | line += 7; | ||
166 | while (isspace(*line)) | ||
167 | ++line; | ||
168 | g_string_conf[current_string - 1].channel = atol(line); | ||
169 | if (g_string_conf[current_string - 1].channel > 16) { | ||
170 | fprintf(stderr, "Incorrect channel specified: %s.\n", line); | ||
171 | exit(1); | ||
172 | } | ||
173 | printf("String %d is on channel %d\n", current_string, g_string_conf[current_string - 1].channel); | ||
174 | } else if (!strncasecmp(line, "Note", 4) && isspace(line[4])) { | ||
175 | if (current_string == -1) { | ||
176 | fprintf(stderr, "No string selected yet.\n"); | ||
177 | exit(1); | ||
178 | } | ||
179 | line += 4; | ||
180 | while (isspace(*line)) | ||
181 | ++line; | ||
182 | g_string_conf[current_string - 1].note = config_midi_note_from_string(line); | ||
183 | if (g_string_conf[current_string - 1].note == 0xff) { | ||
184 | fprintf(stderr, "Unknown midi note specified: %s.\n", line); | ||
185 | exit(1); | ||
186 | } | ||
187 | printf("String %d is midi note %d\n", current_string, g_string_conf[current_string - 1].note); | ||
188 | } else if (!strncasecmp(line, "AfterTouch", 10) && isspace(line[10])) { | ||
189 | if (current_string == -1) { | ||
190 | fprintf(stderr, "No string selected yet.\n"); | ||
191 | exit(1); | ||
192 | } | ||
193 | line += 10; | ||
194 | while (isspace(*line)) | ||
195 | ++line; | ||
196 | if (!strncasecmp(line, "none", 4) && (!line[4] || isspace(line[4]))) { | ||
197 | g_string_conf[current_string - 1].modifier = none; | ||
198 | printf("String %d does not act aftertouch\n", current_string); | ||
199 | } else if (!strncasecmp(line, "pitch_bend_up", 13) && (!line[13] || isspace(line[13]))) { | ||
200 | g_string_conf[current_string - 1].modifier = pitch_bend_up; | ||
201 | printf("String %d acts aftertouch as pitch_bend_up\n", current_string); | ||
202 | } else if (!strncasecmp(line, "pitch_bend_down", 15) && (!line[15] || isspace(line[15]))) { | ||
203 | g_string_conf[current_string - 1].modifier = pitch_bend_down; | ||
204 | printf("String %d acts aftertouch as pitch_bend_down\n", current_string); | ||
205 | } else if (!strncasecmp(line, "midi_control", 12) && (!line[12] || isspace(line[12]))) { | ||
206 | g_string_conf[current_string - 1].modifier = midi_controller; | ||
207 | printf("String %d acts aftertouch as midi_controller\n", current_string); | ||
208 | } else if (!strncasecmp(line, "midi_control_inverse", 20) && (!line[20] || isspace(line[20]))) { | ||
209 | g_string_conf[current_string - 1].modifier = midi_controller_inv; | ||
210 | printf("String %d acts aftertouch as midi_controller_inverse\n", current_string); | ||
211 | } else { | ||
212 | fprintf(stderr, "Illegal Modifier for string: %s\n", line); | ||
213 | exit(1); | ||
214 | } | ||
215 | } else if (!strncasecmp(line, "Controller", 10) && isspace(line[10])) { | ||
216 | if (current_string == -1) { | ||
217 | fprintf(stderr, "No string selected yet.\n"); | ||
218 | exit(1); | ||
219 | } | ||
220 | line += 10; | ||
221 | while (isspace(*line)) | ||
222 | ++line; | ||
223 | g_string_conf[current_string - 1].controller = atol(line); | ||
224 | printf("String %d is on midi_controller line %d\n", current_string, g_string_conf[current_string - 1].controller); | ||
225 | } else if (!strncasecmp(line, "TimeToSilence", 13) && isspace(line[13])) { | ||
226 | if (current_string == -1) { | ||
227 | fprintf(stderr, "No string selected yet.\n"); | ||
228 | exit(1); | ||
229 | } | ||
230 | line += 13; | ||
231 | while (isspace(*line)) | ||
232 | ++line; | ||
233 | g_string_conf[current_string - 1].timetosilence = atol(line); | ||
234 | printf("String %d has a timetosilence of %d\n", current_string, g_string_conf[current_string - 1].timetosilence); | ||
235 | } else if (!strncasecmp(line, "midi_two_octave_split", 21) && isspace(line[21])) { | ||
236 | line += 21; | ||
237 | while (isspace(*line)) | ||
238 | ++line; | ||
239 | g_midi_two_octave_split = atol(line); | ||
240 | printf("Splitting TWO octaves at %d%%\n", g_midi_two_octave_split); | ||
241 | if (g_midi_two_octave_split < 0 || g_midi_two_octave_split > 100) { | ||
242 | fprintf(stderr, "Invalid percentage in line: %s\n", line); | ||
243 | exit(1); | ||
244 | } | ||
245 | g_midi_two_octave_split = (256 * g_midi_two_octave_split) / 100; | ||
246 | } else if (!strncasecmp(line, "midi_three_octave_split_1", 25) && isspace(line[25])) { | ||
247 | line += 25; | ||
248 | while (isspace(*line)) | ||
249 | ++line; | ||
250 | g_midi_three_octave_split_1 = atol(line); | ||
251 | printf("Splitting THREE octaves top above %d%%\n", g_midi_three_octave_split_1); | ||
252 | if (g_midi_three_octave_split_1 < 0 || g_midi_three_octave_split_1 > 100) { | ||
253 | fprintf(stderr, "Invalid percentage in line: %s\n", line); | ||
254 | exit(1); | ||
255 | } | ||
256 | g_midi_three_octave_split_1 = (256 * g_midi_three_octave_split_1) / 100; | ||
257 | } else if (!strncasecmp(line, "midi_three_octave_split_2", 25) && isspace(line[25])) { | ||
258 | line += 25; | ||
259 | while (isspace(*line)) | ||
260 | ++line; | ||
261 | g_midi_three_octave_split_2 = atol(line); | ||
262 | printf("Splitting THREE octaves bottom below %d%%\n", g_midi_three_octave_split_2); | ||
263 | if (g_midi_three_octave_split_2 < 0 || g_midi_three_octave_split_2 > 100) { | ||
264 | fprintf(stderr, "Invalid percentage in line: %s\n", line); | ||
265 | exit(1); | ||
266 | } | ||
267 | g_midi_three_octave_split_2 = (256 * g_midi_three_octave_split_2) / 100; | ||
268 | } else if (!strncasecmp(line, "midi_main_control", 17) && isspace(line[17])) { | ||
269 | line += 17; | ||
270 | while (isspace(*line)) | ||
271 | ++line; | ||
272 | g_midi_main_control = atol(line); | ||
273 | printf("All Strings modify controller %d\n", g_midi_main_control); | ||
274 | if (g_midi_main_control > 127) { | ||
275 | fprintf(stderr, "Invalid controller number %d in line: %s\n", g_midi_main_control, line); | ||
276 | exit(1); | ||
277 | } | ||
278 | } else if (!strncasecmp(line, "midi_main_channel", 17) && isspace(line[17])) { | ||
279 | line += 17; | ||
280 | while (isspace(*line)) | ||
281 | ++line; | ||
282 | g_midi_main_channel = atol(line); | ||
283 | printf("All Strings modify controller %d on channel %d\n", g_midi_main_control, g_midi_main_channel); | ||
284 | if (g_midi_main_channel < 1 || g_midi_main_channel > 16) { | ||
285 | fprintf(stderr, "Invalid channel number %d in line: %s\n", g_midi_main_channel, line); | ||
286 | exit(1); | ||
287 | } | ||
288 | } else { | ||
289 | fprintf(stderr, "Unhandled config line: %s\n", line); | ||
290 | exit(1); | ||
291 | } | ||
292 | |||
293 | // split also true for two octaves | ||
294 | if (g_midi_three_octave_split_2 < g_midi_three_octave_split_1) { | ||
295 | g_midi_three_octave_split_inverse = g_midi_three_octave_split_1; | ||
296 | g_midi_three_octave_split_1 = g_midi_three_octave_split_2; | ||
297 | g_midi_three_octave_split_2 = g_midi_three_octave_split_inverse; | ||
298 | g_midi_three_octave_split_inverse = 1; | ||
299 | } else | ||
300 | g_midi_three_octave_split_inverse = 0; | ||
301 | } | ||
302 | fclose(fh); | ||
303 | } | ||
304 | |||
305 | void | ||
306 | config_write() | ||
307 | { | ||
308 | |||
309 | } | ||