Dissect some more things in -t mode
[jelmer/ptabtools.git] / ptb.h
1 /*
2    Functions for writing and reading PowerTab (.ptb) files
3    (c) 2004-2005 Jelmer Vernooij <jelmer@samba.org>
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18    */
19
20 #ifndef __PTB_H__
21 #define __PTB_H__
22
23 #include <sys/stat.h>
24 #include <stdlib.h>
25
26 #if defined(_MSC_VER) && !defined(PTB_CORE)
27 #pragma comment(lib,"ptb.lib")
28 #endif
29
30 #ifdef _MSC_VER
31 typedef unsigned char uint8_t;
32 typedef unsigned short uint16_t;
33 typedef unsigned long uint32_t;
34 #else
35 #include <stdint.h>
36 #endif
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 typedef uint8_t ptb_chord;
43 typedef uint8_t ptb_tone;
44 typedef uint8_t ptb_note;
45
46 struct ptb_hdr {
47         enum { CLASSIFICATION_SONG = 0, CLASSIFICATION_LESSON} classification;
48
49         union {
50                 struct {
51                         enum { RELEASE_TYPE_PR_AUDIO = 0, RELEASE_TYPE_PR_VIDEO, RELEASE_TYPE_BOOTLEG, RELEASE_TYPE_UNRELEASED } release_type;
52
53                         union {
54                                 struct {
55                                         enum { AUDIO_TYPE_SINGLE = 0, AUDIO_TYPE_EP, AUDIO_TYPE_ALBUM, AUDIO_TYPE_DOUBLE_ALBUM, AUDIO_TYPE_TRIPLE_ALBUM, AUDIO_TYPE_BOXSET } type;
56                                         char *album_title;
57                                         uint16_t year;
58                                         uint8_t is_live_recording;
59                                 } pr_audio;
60                                 struct {
61                                         char *video_title;
62                                         uint16_t year;
63                                         uint8_t is_live_recording;
64                                 } pr_video;
65                                 struct {
66                                         char *title;
67                                         uint16_t day;
68                                         uint16_t month;
69                                         uint16_t year;
70                                 } bootleg;
71                                 struct {
72                                         char empty;
73                                 } unreleased;
74                         } release_info;
75                         uint8_t is_original_author_unknown;
76                         char *title;
77                         char *artist;
78                         char *words_by;
79                         char *music_by;
80                         char *arranged_by;
81                         char *guitar_transcribed_by;
82                         char *bass_transcribed_by;
83                         char *lyrics;
84                         char *copyright;
85                 } song;
86
87                 struct  {
88                         char *title;
89                         char *artist;
90                         uint16_t style;
91                         enum { LEVEL_BEGINNER = 0, LEVEL_INTERMEDIATE, LEVEL_ADVANCED} level;
92                         char *author;
93                         char *copyright;
94                 } lesson;
95         } class_info;
96
97         char *guitar_notes;
98         char *bass_notes;
99         char *drum_notes;
100         uint16_t version;
101 };
102
103 struct ptb_guitar {
104         struct ptb_guitar *prev, *next;
105
106         uint8_t index;
107         char *title;
108         char *type;
109         uint8_t nr_strings;
110         uint8_t *strings;
111         uint8_t reverb;
112         uint8_t chorus;
113         uint8_t tremolo;
114         uint8_t pan;
115         uint8_t capo;
116         uint8_t initial_volume;
117         uint8_t midi_instrument;
118         uint8_t half_up;
119         uint8_t simulate;
120 };
121
122 struct ptb_dynamic {
123         struct ptb_dynamic *prev, *next;
124
125         uint8_t offset;
126         uint8_t staff;
127         uint8_t volume;
128 };
129
130 struct ptb_guitarin {
131         struct ptb_guitarin *prev, *next;
132
133         uint8_t offset; 
134         uint8_t section;
135         uint8_t staff;
136
137         /* OR'd numbers of guitars 
138          * (0x01 = guitar1, 0x02 = guitar2, 0x04 = guitar3, etc) */
139         uint8_t rhythm_slash;
140         uint8_t staff_in;
141 };
142
143 struct ptb_font {
144         uint8_t size;
145         uint8_t thickness;
146         uint8_t underlined;
147         uint8_t italic;
148         char *family;
149 };
150
151 struct ptb_floatingtext {
152         struct ptb_floatingtext *prev, *next;
153
154         char *text;
155         uint8_t offset;
156 #define ALIGN_LEFT              1
157 #define ALIGN_CENTER    2
158 #define ALIGN_RIGHT             3
159 #define ALIGN_TIMESTAMP 8
160         uint8_t alignment;
161         struct ptb_font font;
162 };
163
164 struct ptb_tempomarker {
165         struct ptb_tempomarker *prev, *next;
166
167         char *description;
168         uint16_t type; 
169         uint8_t bpm;
170         uint8_t section;
171         uint8_t offset;
172 };
173
174 struct ptb_chorddiagram {
175         struct ptb_chorddiagram *prev, *next;
176
177         ptb_chord name[2];
178         uint8_t frets;
179         uint8_t nr_strings;
180         uint8_t type;
181         ptb_tone *tones;
182 };
183
184 struct ptb_chordtext {
185         struct ptb_chordtext *prev, *next;
186
187         ptb_chord name[2];
188 #define CHORDTEXT_PROPERTY_NOCHORD                      0x10
189 #define CHORDTEXT_PROPERTY_PARENTHESES          0x20
190 #define CHORDTEXT_PROPERTY_FORMULA_M            0x01
191 #define CHORDTEXT_PROPERTY_FORMULA_PLUS         0x02
192 #define CHORDTEXT_PROPERTY_FORMULA_MIN          0x02
193 #define CHORDTEXT_PROPERTY_FORMULA_5            0x04
194 #define CHORDTEXT_PROPERTY_FORMULA_6            0x05
195 #define CHORDTEXT_PROPERTY_FORMULA_M6           0x06
196 #define CHORDTEXT_PROPERTY_FORMULA_7            0x07
197 #define CHORDTEXT_PROPERTY_FORMULA_MAJ7         0x08
198 #define CHORDTEXT_PROPERTY_FORMULA_M7           0x09
199 #define CHORDTEXT_PROPERTY_FORMULA_PLUS7        0x0A
200 #define CHORDTEXT_PROPERTY_FORMULA_MIN7         0x0B
201 #define CHORDTEXT_PROPERTY_FORMULA_MMAJ7        0x0C
202 #define CHORDTEXT_PROPERTY_FORMULA_M7B5         0x0D
203         uint8_t properties;
204         uint8_t offset;
205 #define CHORDTEXT_EXT_7_9                                       0x01
206 #define CHORDTEXT_PLUS_5                                        0x02
207 #define CHORDTEXT_EXT_7_13                                      0x04
208 #define CHORDTEXT_ADD_2                                         0x08
209 #define CHORDTEXT_ADD_9                                         0x40
210 #define CHORDTEXT_ADD_11                                        0x80
211         uint8_t additions;
212         uint8_t alterations;
213 #define CHORDTEXT_VII_OPEN                                      0x01
214 #define CHORDTEXT_VII_VI                                        0x06
215 #define CHORDTEXT_VII                                           0x08
216 #define CHORDTEXT_VII_TYPE_2                            0x20
217 #define CHORDTEXT_VII_TYPE_3                            0x40
218         uint8_t VII;
219 };
220
221 struct ptb_position {
222         struct ptb_position *prev, *next;
223
224         uint8_t offset;
225 #define POSITION_PICKSTROKE_DOWN                                0x01
226 #define POSITION_STACCATO                                               0x02
227 #define POSITION_ACCENT                                                 0x04
228 #define POSITION_HEAVY_ACCENT                                   0x08
229 #define POSITION_TREMOLO_PICKING                                0x10
230 #define POSITION_PALM_MUTE                                              0x20
231         uint8_t palm_mute;
232         uint8_t length;
233 #define POSITION_DOTS_1                                                 0x01
234 #define POSITION_DOTS_2                                                 0x02
235 #define POSITION_DOTS_REST                                              0x04
236 #define POSITION_DOTS_VIBRATO                                   0x08
237 #define POSITION_DOTS_WIDE_VIBRATO                              0x10
238 #define POSITION_DOTS_ARPEGGIO_UP                               0x20
239 #define POSITION_DOTS_ARPEGGIO_DOWN                             0x40
240         uint8_t dots;
241
242         /* Irregular grouping: 
243            Play x notes in the time of y
244            Stored as (x - 1) * 8 + (y - 1)
245         */
246 #define POSITION_PROPERTY_IRREGULAR_GROUPING    0x007F
247 #define POSITION_PROPERTY_IN_SINGLE_BEAM                0x0080
248 #define POSITION_PROPERTY_IN_DOUBLE_BEAM                0x0100
249 #define POSITION_PROPERTY_IN_TRIPLE_BEAM                0x0200
250 #define POSITION_PROPERTY_FIRST_IN_BEAM                 0x0400
251 #define POSITION_PROPERTY_PARTIAL_BEAM                  0x0800
252 #define POSITION_PROPERTY_LAST_IN_BEAM                  0x1000
253 #define POSITION_PROPERTY_MIDDLE_IN_BEAM                0x2000
254         uint16_t properties;
255         uint8_t let_ring;
256         uint8_t fermenta;
257 #define POSITION_FERMENTA_ACCIACCATURA                  0x01
258 #define POSITION_FERMENTA_TRIPLET_FEEL_FIRST    0x02
259 #define POSITION_FERMENTA_TRIPLET_FEEL_SECOND   0x04
260 #define POSITION_FERMENTA_LET_RING                              0x08
261 #define POSITION_FERMENTA_FERMENTA                              0x10
262 #define POSITION_FERMENTA_TRIPLET_1                             0x20
263 #define POSITION_FERMENTA_TRIPLET_2                             0x40
264 #define POSITION_FERMENTA_TRIPLET_3                             0x80
265         
266         uint8_t nr_additional_data;
267         struct ptb_position_additional
268         {
269                 uint8_t start_volume;
270                 uint8_t end_volume;
271                 uint8_t duration; /* Number of following positions */
272                 uint8_t properties;
273 #define POSITION_ADDITIONAL_VOLUMESWELL                 0x61
274 #define POSITION_ADDITIONAL_TREMOLOBAR                  0x63
275         } *additional;
276
277         struct ptb_linedata *linedatas;
278 };
279
280
281
282 #define STAFF_TYPE_BASS_KEY     0x10
283
284 struct ptb_staff {
285         struct ptb_staff *prev, *next;
286
287         /* Number of strings OR-ed with some settings */
288         uint8_t properties;
289         uint8_t highest_note;
290         uint8_t lowest_note;
291         struct ptb_position *positions[2];
292 };
293
294 struct ptb_bend
295 {
296         uint8_t bend_pitch:4;
297         uint8_t release_pitch:4;
298         uint8_t bend1;
299         uint8_t bend2;
300         uint8_t bend3;
301 };
302
303 struct ptb_linedata {
304         struct ptb_linedata *prev, *next;
305
306         union {
307                 struct {
308                         unsigned int fret:5;
309                         unsigned int string:3;
310                 } detailed;
311                 uint8_t tone; 
312         }; 
313 #define LINEDATA_PROPERTY_TIE                                   0x01
314 #define LINEDATA_PROPERTY_MUTED                                 0x02
315 #define LINEDATA_PROPERTY_CONTINUES                             0x04
316 #define LINEDATA_PROPERTY_HAMMERON_FROM                 0x08
317 #define LINEDATA_PROPERTY_PULLOFF_FROM                  0x10
318 #define LINEDATA_PROPERTY_DEST_NOWHERE                  0x20
319 #define LINEDATA_PROPERTY_NATURAL_HARMONIC              0x40
320 #define LINEDATA_PROPERTY_GHOST_NOTE                    0x80
321         uint8_t properties;
322         uint8_t transcribe;
323 #define LINEDATA_TRANSCRIBE_8VA                                 0x01
324 #define LINEDATA_TRANSCRIBE_15MA                                0x02
325 #define LINEDATA_TRANSCRIBE_8VB                                 0x04
326 #define LINEDATA_TRANSCRIBE_15MB                                0x08
327         uint8_t conn_to_next;
328         struct ptb_bend *bends;
329 };
330
331 #define METER_TYPE_BEAM_2       0x0080  
332 #define METER_TYPE_BEAM_4       0x0100
333 #define METER_TYPE_BEAM_3       0x0180
334 #define METER_TYPE_BEAM_6       0x0200
335 #define METER_TYPE_BEAM_5       0x0280
336 #define METER_TYPE_COMMON       0x4000
337 #define METER_TYPE_CUT          0x8000
338 #define METER_TYPE_SHOW         0x1000
339
340 #define END_MARK_TYPE_NORMAL     0x00
341 #define END_MARK_TYPE_DOUBLELINE 0x20
342 #define END_MARK_TYPE_REPEAT     0x80
343
344 struct ptb_section {
345         struct ptb_section *prev, *next;
346
347         char letter;
348         struct ptb_staff *staffs;
349         struct ptb_chordtext *chordtexts;
350         struct ptb_rhythmslash *rhythmslashes;
351         struct ptb_direction *directions;
352         struct ptb_musicbar *musicbars;
353         
354         /* Number of times to repeat OR-ed with end mark type */
355         uint8_t end_mark;
356         uint16_t meter_type;
357         union {
358                 uint8_t beat_info;
359                 struct {
360                         unsigned int beat:3;
361                         unsigned int beat_value:5;
362                 } detailed;
363         };
364         uint8_t metronome_pulses_per_measure;
365         uint16_t properties;
366         uint8_t key_extra;
367         uint8_t position_width;
368         char *description;
369 };
370
371 struct ptb_sectionsymbol {
372         struct ptb_sectionsymbol *prev, *next;
373
374         uint16_t repeat_ending;
375 };
376
377 struct ptb_musicbar {
378         struct ptb_musicbar *prev, *next;
379
380         uint8_t offset;
381
382 #define MUSICBAR_PROPERTY_SINGLE_BAR    0x01
383 #define MUSICBAR_PROPERTY_DOUBLE_BAR    0x20
384 #define MUSICBAR_PROPERTY_FREE_BAR      0x40
385 #define MUSICBAR_PROPERTY_REPEAT_BEGIN  0x60
386 #define MUSICBAR_PROPERTY_REPEAT_END    0x80
387 #define MUSICBAR_PROPERTY_END_BAR       0xA0
388         /* Number of times to repeat OR-ed only with REPEAT_END property */
389         uint8_t properties;
390         char letter;
391         char *description;
392 };
393
394 struct ptb_rhythmslash {
395         struct ptb_rhythmslash *prev, *next;
396
397 #define RHYTHMSLASH_PROPERTY_IN_SINGLE_BEAM     0x01
398 #define RHYTHMSLASH_PROPERTY_IN_DOUBLE_BEAM     0x02
399 #define RHYTHMSLASH_PROPERTY_FIRST_IN_BEAM      0x04
400 #define RHYTHMSLASH_PROPERTY_PARTIAL_BEAM       0x08
401 #define RHYTHMSLASH_PROPERTY_LAST_IN_BEAM       0x10
402 #define RHYTHMSLASH_PROPERTY_TRIPLET_FIRST      0x20
403 #define RHYTHMSLASH_PROPERTY_TRIPLET_SECOND     0x40
404 #define RHYTHMSLASH_PROPERTY_TRIPLET_THIRD      0x80
405         uint8_t properties;
406         uint8_t offset;
407         uint8_t dotted;
408         uint8_t length;
409         uint8_t extra;
410 #define RHYTHMSLASH_EXTRA_ARPEGGIO_UP           0x02
411 #define RHYTHMSLASH_EXTRA_ACCENT                        0x20
412 #define RHYTHMSLASH_EXTRA_HEAVY_ACCENT          0x40
413         uint8_t singlenote; /* 
414                 5 MSB contains fret
415                 3 LSB contains string
416                 */
417 };
418
419 struct ptb_direction {
420         struct ptb_direction *prev, *next;
421         uint8_t nr_items;
422 };
423
424 struct ptbf {
425         char data[3];
426         int fd;
427         int mode;
428         char *filename;
429         struct ptb_hdr hdr;
430         struct ptb_instrument {
431                 struct ptb_guitar *guitars;
432                 struct ptb_section *sections;
433                 struct ptb_guitarin *guitarins;
434                 struct ptb_chorddiagram *chorddiagrams;
435                 struct ptb_tempomarker *tempomarkers;
436                 struct ptb_dynamic *dynamics;
437                 struct ptb_floatingtext *floatingtexts;
438                 struct ptb_sectionsymbol *sectionsymbols;
439         } instrument[2];
440         off_t curpos;
441         struct ptb_font default_font;
442         struct ptb_font chord_name_font;
443         struct ptb_font tablature_font;
444 };
445
446 extern struct ptbf *ptb_read_file(const char *ptb);
447 extern int ptb_write_file(const char *ptb, struct ptbf *);
448 extern void ptb_free(struct ptbf *);
449
450 extern void ptb_set_debug(int level);
451 extern void ptb_set_asserts_fatal(int yes);
452
453 extern const char *ptb_get_note(struct ptb_guitar *guitar, ptb_note);
454 extern const char *ptb_get_tone(ptb_tone);
455 extern const char *ptb_get_tone_full(ptb_tone);
456
457 extern void ptb_get_position_difference(struct ptb_section *, int start, int end, int *bars, int *length);
458
459 /* Reading tuning data files (tunings.dat) */
460
461 struct ptb_tuning_dict {
462         uint16_t nr_tunings;
463
464         struct ptb_tuning {
465                 char *name;
466                 uint8_t capo;
467                 uint8_t nr_strings;
468                 uint8_t *strings;
469         } *tunings;
470 };
471
472 extern struct ptb_tuning_dict *ptb_read_tuning_dict(const char *);
473 extern int ptb_write_tuning_dict(const char *, struct ptb_tuning_dict *);
474 extern void ptb_free_tuning_dict(struct ptb_tuning_dict *);
475 extern const char *ptb_tuning_get_note(char);
476
477 #ifdef __cplusplus
478 }
479 #endif
480
481 #endif /* __PTB_H__ */