2 Functions for writing and reading PowerTab (.ptb) files
3 (c) 2004-2005 Jelmer Vernooij <jelmer@samba.org>
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.
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.
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.
26 #if defined(_MSC_VER) && !defined(PTB_CORE)
27 #pragma comment(lib,"ptb.lib")
31 typedef unsigned char uint8_t;
32 typedef unsigned short uint16_t;
33 typedef unsigned long uint32_t;
42 typedef uint8_t ptb_chord;
43 typedef uint8_t ptb_tone;
44 typedef uint8_t ptb_note;
47 enum { CLASSIFICATION_SONG = 0, CLASSIFICATION_LESSON} classification;
51 enum { RELEASE_TYPE_PR_AUDIO = 0, RELEASE_TYPE_PR_VIDEO, RELEASE_TYPE_BOOTLEG, RELEASE_TYPE_UNRELEASED } release_type;
55 enum { AUDIO_TYPE_SINGLE = 0, AUDIO_TYPE_EP, AUDIO_TYPE_ALBUM, AUDIO_TYPE_DOUBLE_ALBUM, AUDIO_TYPE_TRIPLE_ALBUM, AUDIO_TYPE_BOXSET } type;
58 uint8_t is_live_recording;
63 uint8_t is_live_recording;
75 uint8_t is_original_author_unknown;
81 char *guitar_transcribed_by;
82 char *bass_transcribed_by;
91 enum { LEVEL_BEGINNER = 0, LEVEL_INTERMEDIATE, LEVEL_ADVANCED} level;
104 struct ptb_guitar *prev, *next;
116 uint8_t initial_volume;
117 uint8_t midi_instrument;
123 struct ptb_dynamic *prev, *next;
130 struct ptb_guitarin {
131 struct ptb_guitarin *prev, *next;
137 /* OR'd numbers of guitars
138 * (0x01 = guitar1, 0x02 = guitar2, 0x04 = guitar3, etc) */
139 uint8_t rhythm_slash;
151 struct ptb_floatingtext {
152 struct ptb_floatingtext *prev, *next;
157 #define ALIGN_CENTER 2
158 #define ALIGN_RIGHT 3
159 #define ALIGN_TIMESTAMP 8
161 struct ptb_font font;
164 struct ptb_tempomarker {
165 struct ptb_tempomarker *prev, *next;
174 struct ptb_chorddiagram {
175 struct ptb_chorddiagram *prev, *next;
184 struct ptb_chordtext {
185 struct ptb_chordtext *prev, *next;
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
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
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
221 struct ptb_position {
222 struct ptb_position *prev, *next;
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
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
242 /* Irregular grouping:
243 Play x notes in the time of y
244 Stored as (x - 1) * 8 + (y - 1)
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
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
266 uint8_t nr_additional_data;
267 struct ptb_position_additional
269 uint8_t start_volume;
271 uint8_t duration; /* Number of following positions */
273 #define POSITION_ADDITIONAL_VOLUMESWELL 0x61
274 #define POSITION_ADDITIONAL_TREMOLOBAR 0x63
277 struct ptb_linedata *linedatas;
282 #define STAFF_TYPE_BASS_KEY 0x10
285 struct ptb_staff *prev, *next;
287 /* Number of strings OR-ed with some settings */
289 uint8_t highest_note;
291 struct ptb_position *positions[2];
296 uint8_t bend_pitch:4;
297 uint8_t release_pitch:4;
303 struct ptb_linedata {
304 struct ptb_linedata *prev, *next;
309 unsigned int string:3;
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
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;
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
340 #define END_MARK_TYPE_NORMAL 0x00
341 #define END_MARK_TYPE_DOUBLELINE 0x20
342 #define END_MARK_TYPE_REPEAT 0x80
345 struct ptb_section *prev, *next;
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;
354 /* Number of times to repeat OR-ed with end mark type */
361 unsigned int beat_value:5;
364 uint8_t metronome_pulses_per_measure;
367 uint8_t position_width;
371 struct ptb_sectionsymbol {
372 struct ptb_sectionsymbol *prev, *next;
374 uint16_t repeat_ending;
377 struct ptb_musicbar {
378 struct ptb_musicbar *prev, *next;
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 */
394 struct ptb_rhythmslash {
395 struct ptb_rhythmslash *prev, *next;
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
410 #define RHYTHMSLASH_EXTRA_ARPEGGIO_UP 0x02
411 #define RHYTHMSLASH_EXTRA_ACCENT 0x20
412 #define RHYTHMSLASH_EXTRA_HEAVY_ACCENT 0x40
413 uint8_t singlenote; /*
415 3 LSB contains string
419 struct ptb_direction {
420 struct ptb_direction *prev, *next;
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;
441 struct ptb_font default_font;
442 struct ptb_font chord_name_font;
443 struct ptb_font tablature_font;
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 *);
450 extern void ptb_set_debug(int level);
451 extern void ptb_set_asserts_fatal(int yes);
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);
457 extern void ptb_get_position_difference(struct ptb_section *, int start, int end, int *bars, int *length);
459 /* Reading tuning data files (tunings.dat) */
461 struct ptb_tuning_dict {
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);
481 #endif /* __PTB_H__ */