2 Parser library for the Guitar Pro 3 file format
3 (c) 2004: Jelmer Vernooij <jelmer@samba.org>
5 Based on gp3_loader.py from songwrite
6 Copyright (C) 2003 Bertrand LAMY
7 Copyright (C) 2003 Jean-Baptiste LAMY
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
42 #ifdef HAVE_UNISTD_H
\r
43 # include <unistd.h>
\r
53 #define malloc_p(t, n) (t *) calloc(sizeof(t), n)
55 static void gp_read(struct gpf *gpf, void *data, size_t len)
57 int ret = read(gpf->fd, data, len);
61 static void gp_read_unknown(struct gpf *gpf, size_t num)
63 char *tmp = malloc_p(char, num);
64 gp_read(gpf, tmp, num);
68 static void gp_read_string(struct gpf *gpf, const char **dest)
70 unsigned char len = 0;
72 gp_read(gpf, &len, 1);
73 ret = malloc_p(char, len+1);
74 gp_read(gpf, ret, len);
78 static void gp_read_uint8(struct gpf *gpf, uint8_t *n)
80 gp_read(gpf, n, sizeof(uint8_t));
83 static void gp_read_uint32(struct gpf *gpf, uint32_t *n)
85 gp_read(gpf, n, sizeof(uint32_t));
88 static void gp_read_long_string(struct gpf *gpf, const char **dest)
92 gp_read_uint32(gpf, &l);
93 ret = malloc_p(char, l + 1);
98 static void gp_read_color(struct gpf *gpf, struct gp_color *color)
100 gp_read_uint8(gpf, &color->unknown);
101 gp_read_uint8(gpf, &color->red);
102 gp_read_uint8(gpf, &color->green);
103 gp_read_uint8(gpf, &color->blue);
106 static void gp_read_nstring(struct gpf *gpf, const char **dest, size_t len)
109 char *ret = malloc_p(char, len + 1);
110 gp_read_uint8(gpf, &_len);
112 gp_read(gpf, ret, len);
117 static void gp_read_header(struct gpf *gpf)
119 if (gpf->version >= 3.0) {
121 gp_read_long_string(gpf, &gpf->title);
122 gp_read_long_string(gpf, &gpf->subtitle);
123 gp_read_long_string(gpf, &gpf->artist);
124 gp_read_long_string(gpf, &gpf->album);
125 gp_read_long_string(gpf, &gpf->author);
126 gp_read_long_string(gpf, &gpf->copyright);
127 gp_read_long_string(gpf, &gpf->tab_by);
128 gp_read_long_string(gpf, &gpf->instruction);
130 gp_read_uint32(gpf, &gpf->notice_num_lines);
131 gpf->notice = malloc_p(const char *, gpf->notice_num_lines);
132 for (i = 0; i < gpf->notice_num_lines; i++)
134 gp_read_long_string(gpf, &gpf->notice[i]);
136 gp_read_uint8(gpf, &gpf->shuffle);
138 if (gpf->version >= 2.0) {
139 gp_read_unknown(gpf, 1);
141 gp_read_nstring(gpf, &gpf->title, 100);
142 gp_read_unknown(gpf, 1);
143 gp_read_nstring(gpf, &gpf->author, 50);
144 gp_read_unknown(gpf, 1);
145 gp_read_nstring(gpf, &gpf->instruction, 100);
149 static void gp_read_lyrics(struct gpf *gpf)
151 if (gpf->version >= 4.0)
154 gp_read_uint32(gpf, &gpf->lyrics_track);
158 gpf->lyrics = malloc_p(struct gp_lyric, gpf->num_lyrics);
160 for (i = 0; i < gpf->num_lyrics; i++) {
161 gp_read_uint32(gpf, &gpf->lyrics[i].bar);
162 gp_read_long_string(gpf, &gpf->lyrics[i].data);
167 static void gp_read_instruments(struct gpf *gpf)
169 if (gpf->version >= 3.0) {
171 gpf->num_instruments = 64;
172 gpf->instrument = malloc_p(struct gp_instrument, gpf->num_instruments);
173 for (i = 0; i < gpf->num_instruments; i++)
175 gp_read_unknown(gpf, 12);
179 for (i = 0; i < 8; i++)
182 gp_read_uint32(gpf, &x);
183 gp_read_unknown(gpf, x * 4);
188 static void gp_read_bars(struct gpf *gpf)
191 gpf->bars = malloc_p(struct gp_bar, gpf->num_bars);
193 for (i = 0; i < gpf->num_bars; i++)
195 gp_read_uint8(gpf, &gpf->bars[i].properties);
197 assert(( gpf->bars[i].properties
198 &~ GP_BAR_PROPERTY_CUSTOM_RHYTHM_1
199 &~ GP_BAR_PROPERTY_CUSTOM_RHYTHM_2
200 &~ GP_BAR_PROPERTY_REPEAT_OPEN
201 &~ GP_BAR_PROPERTY_REPEAT_CLOSE
202 &~ GP_BAR_PROPERTY_ALT_ENDING
203 &~ GP_BAR_PROPERTY_MARKER
204 &~ GP_BAR_PROPERTY_CHANGE_ARMOR
205 &~ GP_BAR_PROPERTY_DOUBLE_ENDING) == 0);
207 if (gpf->bars[i].properties & GP_BAR_PROPERTY_CUSTOM_RHYTHM_1) {
208 gp_read_uint8(gpf, &gpf->bars[i].rhythm_1);
210 gpf->bars[i].rhythm_1 = 4;
213 if (gpf->bars[i].properties & GP_BAR_PROPERTY_CUSTOM_RHYTHM_2) {
214 gp_read_uint8(gpf, &gpf->bars[i].rhythm_2);
216 gpf->bars[i].rhythm_2 = 4;
219 if (gpf->bars[i].properties & GP_BAR_PROPERTY_REPEAT_CLOSE) {
220 gp_read_uint8(gpf, &gpf->bars[i].repeat_close.volta);
223 if (gpf->bars[i].properties & GP_BAR_PROPERTY_ALT_ENDING) {
224 gp_read_uint8(gpf, &gpf->bars[i].alternate_ending.type);
227 if (gpf->bars[i].properties & GP_BAR_PROPERTY_MARKER) {
228 gp_read_long_string(gpf, &gpf->bars[i].marker.name);
229 gp_read_color(gpf, &gpf->bars[i].marker.color);
232 if (gpf->bars[i].properties & GP_BAR_PROPERTY_CHANGE_ARMOR) {
233 gp_read_uint8(gpf, &gpf->bars[i].change_armor.armor_jumps);
234 gp_read_uint8(gpf, &gpf->bars[i].change_armor.minor);
239 static void gp_read_tracks(struct gpf *gpf)
243 gpf->tracks = malloc_p(struct gp_track, gpf->num_tracks);
245 if (gpf->version >= 3.0)
247 for (i = 0; i < gpf->num_tracks; i++)
250 gp_read_uint8(gpf, &gpf->tracks[i].spc);
251 gp_read_nstring(gpf, &gpf->tracks[i].name, 40);
252 gp_read_uint32(gpf, &gpf->tracks[i].num_strings);
253 gpf->tracks[i].strings = malloc_p(struct gp_track_string, gpf->tracks[i].num_strings);
254 for (j = 0; j < 7; j++) {
255 uint32_t string_pitch;
256 gp_read_uint32(gpf, &string_pitch);
257 if (j < gpf->tracks[i].num_strings) {
258 gpf->tracks[i].strings[j].pitch = string_pitch;
261 gp_read_uint32(gpf, &gpf->tracks[i].midi_port);
262 gp_read_uint32(gpf, &gpf->tracks[i].channel1);
263 gp_read_uint32(gpf, &gpf->tracks[i].channel2);
264 gp_read_uint32(gpf, &gpf->tracks[i].num_frets);
265 gp_read_uint32(gpf, &gpf->tracks[i].capo);
266 gp_read_color(gpf, &gpf->tracks[i].color);
270 for (i = 0; i < 8; i++)
272 gp_read_unknown(gpf, 4);
273 gp_read_uint32(gpf, &gpf->tracks[i].num_frets);
274 gp_read_unknown(gpf, 1);
275 gp_read_nstring(gpf, &gpf->tracks[i].name, 40);
276 gp_read_unknown(gpf, 1 + 5 * 4);
282 static void gp_read_beat(struct gpf *gpf, struct gp_beat *beat)
285 gp_read_uint8(gpf, &beat->properties);
286 assert((beat->properties
287 &~ GP_BEAT_PROPERTY_DOTTED
288 &~ GP_BEAT_PROPERTY_CHORD
289 &~ GP_BEAT_PROPERTY_TEXT
290 &~ GP_BEAT_PROPERTY_EFFECT
291 &~ GP_BEAT_PROPERTY_CHANGE
292 &~ GP_BEAT_PROPERTY_TUPLET
293 &~ GP_BEAT_PROPERTY_REST) == 0);
295 if (beat->properties & GP_BEAT_PROPERTY_REST) {
296 gp_read_unknown(gpf, 1);
299 gp_read_uint8(gpf, &beat->duration);
301 if (beat->properties & GP_BEAT_PROPERTY_TUPLET) {
302 gp_read_uint32(gpf, &beat->tuplet.n_tuplet);
305 if (beat->properties & GP_BEAT_PROPERTY_CHORD) {
306 gp_read_uint8(gpf, &beat->chord.complete);
307 if (!beat->chord.complete) {
308 gp_read_long_string(gpf, &beat->chord.name);
310 if (gpf->version >= 4.0) {
311 gp_read_unknown(gpf, 16);
312 gp_read_string(gpf, &beat->chord.name);
313 gp_read_unknown(gpf, 25);
315 gp_read_unknown(gpf, 25);
316 gp_read_string(gpf, &beat->chord.name);
317 gp_read_unknown(gpf, 34);
320 gp_read_uint32(gpf, &beat->chord.top_fret);
321 if (beat->chord.top_fret == 0)
323 if (beat->chord.complete) {
324 gp_read_unknown(gpf, 6 * 4);
326 gp_read_unknown(gpf, 7 * 4);
329 if (beat->chord.complete)
331 if (gpf->version >= 4.0) {
332 gp_read_unknown(gpf, 24 + 7 + 1);
334 gp_read_unknown(gpf, 32);
339 if (beat->properties & GP_BEAT_PROPERTY_EFFECT)
341 gp_read_uint8(gpf, &beat->effect.properties1);
344 if (gpf->version >= 4.0) {
345 gp_read_uint8(gpf, &beat->effect.properties2);
347 beat->effect.properties2 = 0;
350 if (beat->effect.properties1 & GP_BEAT_EFFECT1_STROCKE) {
351 gp_read_unknown(gpf, 2);
354 if (beat->effect.properties2 & GP_BEAT_EFFECT2_PICK_STROCKE) {
355 gp_read_unknown(gpf, 1);
358 if (beat->effect.properties2 & GP_BEAT_EFFECT2_TREMOLO_BAR) {
359 gp_read_unknown(gpf, 5);
360 gp_read_uint32(gpf, &beat->effect.tremolo_bar.num_points);
361 gp_read_unknown(gpf, beat->effect.tremolo_bar.num_points * 9);
364 if (gpf->version >= 4.0) {
365 if (beat->effect.properties1 & GP_BEAT_EFFECT1_4_STROCKE_EFFECT) {
366 gp_read_unknown(gpf, 1);
369 if (beat->effect.properties1 & GP_BEAT_EFFECT1_TREMOLO_BAR) {
370 gp_read_unknown(gpf, 5);
375 if (beat->properties & GP_BEAT_PROPERTY_CHANGE)
377 gp_read_uint8(gpf, &beat->change.new_instrument);
378 gp_read_uint8(gpf, &beat->change.new_volume);
379 gp_read_uint8(gpf, &beat->change.new_pan);
380 gp_read_uint8(gpf, &beat->change.new_chorus);
381 gp_read_uint8(gpf, &beat->change.new_reverb);
382 gp_read_uint8(gpf, &beat->change.new_phaser);
383 gp_read_uint8(gpf, &beat->change.new_tremolo);
384 gp_read_uint32(gpf, &beat->change.new_tempo);
385 if (beat->change.new_volume != 0xFF) gp_read_unknown(gpf, 1);
386 if (beat->change.new_pan != 0xFF) gp_read_unknown(gpf, 1);
387 if (beat->change.new_chorus != 0xFF) gp_read_unknown(gpf, 1);
388 if (beat->change.new_reverb != 0xFF) gp_read_unknown(gpf, 1);
389 if (beat->change.new_phaser != 0xFF) gp_read_unknown(gpf, 1);
390 if (beat->change.new_tremolo != 0xFF) gp_read_unknown(gpf, 1);
391 if (beat->change.new_tempo != -1) gp_read_unknown(gpf, 1);
393 if (gpf->version >= 4.0) {
394 gp_read_unknown(gpf, 1);
398 gp_read_uint8(gpf, &beat->strings_present);
400 for (i = 0; i < 7; i++)
402 struct gp_note *n = &beat->notes[i];
404 if (!(beat->strings_present & (1 << i))) continue;
406 gp_read_uint8(gpf, &n->properties);
408 if (n->properties & GP_NOTE_PROPERTY_ALTERATION) {
409 gp_read_uint8(gpf, &n->alteration);
414 if (n->properties & GP_NOTE_PROPERTY_DURATION_SPECIAL) {
415 gp_read_uint8(gpf, &n->duration);
416 gp_read_unknown(gpf, 1);
418 n->duration = beat->duration;
421 if (n->properties & GP_NOTE_PROPERTY_NUANCE_CHANGE) {
422 gp_read_uint8(gpf, &n->new_nuance);
425 if (n->properties & GP_NOTE_PROPERTY_ALTERATION) {
426 gp_read_uint8(gpf, &n->value);
429 if (n->properties & GP_NOTE_PROPERTY_FINGERING) {
430 gp_read_uint8(gpf, &n->fingering.left_hand);
431 gp_read_uint8(gpf, &n->fingering.right_hand);
434 if (n->properties & GP_NOTE_PROPERTY_EFFECT) {
435 gp_read_uint8(gpf, &n->effect.properties1);
437 if (gpf->version >= 4.0) {
438 gp_read_uint8(gpf, &n->effect.properties2);
440 n->effect.properties2 = 0;
443 if (n->effect.properties1 & GP_NOTE_EFFECT1_BEND) {
445 gp_read_unknown(gpf, 5);
446 gp_read_uint32(gpf, &n->effect.bend.num_points);
447 n->effect.bend.points = malloc_p(struct gp_note_effect_bend_point, n->effect.bend.num_points);
448 for (k = 0; k < n->effect.bend.num_points; k++)
450 gp_read_unknown(gpf, 4);
451 gp_read_uint32(gpf, &n->effect.bend.points[k].pitch);
452 gp_read_unknown(gpf, 1);
456 if (n->effect.properties1 & GP_NOTE_EFFECT1_APPOGIATURE)
458 gp_read_uint8(gpf, &n->effect.appogiature.previous_note);
459 gp_read_unknown(gpf, 1);
460 gp_read_uint8(gpf, &n->effect.appogiature.transition);
461 gp_read_uint8(gpf, &n->effect.appogiature.duration);
464 if (n->effect.properties2 & GP_NOTE_EFFECT2_TREMOLO_PICKING)
466 gp_read_uint8(gpf, &n->effect.tremolo_picking.duration);
469 if (n->effect.properties2 & GP_NOTE_EFFECT2_SLIDE)
471 gp_read_uint8(gpf, &n->effect.slide.type);
474 if (n->effect.properties2 & GP_NOTE_EFFECT2_HARMONIC)
476 gp_read_uint8(gpf, &n->effect.harmonic.type);
479 if (n->effect.properties2 & GP_NOTE_EFFECT2_TRILL)
481 gp_read_uint8(gpf, &n->effect.trill.note_value);
482 gp_read_uint8(gpf, &n->effect.trill.frequency);
488 static void gp_read_data(struct gpf *gpf)
491 for (i = 0; i < gpf->num_bars; i++)
493 gpf->bars[i].tracks = malloc_p(struct gp_bar_track, gpf->num_tracks);
494 for (j = 0; j < gpf->num_tracks; j++)
496 gp_read_uint32(gpf, &gpf->bars[i].tracks[j].num_beats);
497 gpf->bars[i].tracks[j].beats = malloc_p(struct gp_beat, gpf->bars[i].tracks[j].num_beats);
498 for (k = 0; k < gpf->bars[i].tracks[j].num_beats; k++)
500 gp_read_beat(gpf, &gpf->bars[i].tracks[j].beats[k]);
506 static double find_version(const char *name)
509 for(i = strlen(name)-1; isdigit(name[i]) || name[i] == '.'; i--);
511 return atof(name+i+1);
514 struct gpf *gp_read_file(const char *filename)
517 struct gpf *gpf = malloc_p(struct gpf, 1);
518 gpf->fd = open(filename, O_RDONLY);
524 gp_read_string(gpf, &gpf->version_string);
525 gpf->version = find_version(gpf->version_string);
527 gp_read_unknown(gpf, 6);
533 gp_read_uint32(gpf, &gpf->bpm);
535 if (gpf->version >= 4.0) {
536 gp_read_unknown(gpf, 5);
537 } else if(gpf->version >= 3.0) {
538 gp_read_unknown(gpf, 4);
540 gp_read_unknown(gpf, 8);
543 gp_read_instruments(gpf);
545 gp_read_uint32(gpf, &gpf->num_bars);
547 if (gpf->version >= 3.0)
549 gp_read_uint32(gpf, &gpf->num_tracks);
560 gp_read_unknown(gpf, 2);
565 void gp_free(struct gpf *ret)