return 0;
}
-static ssize_t ptb_data_constant(struct ptbf *f, unsigned char expected)
+#define ptb_data_constant(f,e) ptb_data_constant_helper(f,e,__LINE__)
+static ssize_t ptb_data_constant_helper(struct ptbf *f, unsigned char expected, int line)
{
unsigned char real;
ssize_t ret;
ret = ptb_data(f, &real, 1);
if(real != expected) {
- ptb_error("%04lx: Expected %02x, got %02x", f->curpos-1, expected, real);
+ ptb_error("%04lx: Expected %02x, got %02x at line "__FILE__":%d", f->curpos-1, expected, real, line);
ptb_assert(f, 0);
}
}
& ~LINEDATA_PROPERTY_DEST_NOWHERE
& ~LINEDATA_PROPERTY_TIE
& ~LINEDATA_PROPERTY_NATURAL_HARMONIC
+ & ~LINEDATA_PROPERTY_CONTINUES
& ~LINEDATA_PROPERTY_MUTED);
ptb_data(bf, &linedata->transcribe, 1);
ptb_assert(bf, linedata->transcribe == LINEDATA_TRANSCRIBE_8VA
& ~0xC0 /*FIXME*/);
ptb_data(bf, &chordtext->additions, 1);
ptb_assert_0(bf, chordtext->additions
+ & ~CHORDTEXT_EXT_7_9
+ & ~CHORDTEXT_EXT_7_13
+ & ~CHORDTEXT_ADD_2
& ~CHORDTEXT_ADD_9
+ & ~CHORDTEXT_ADD_11
& ~CHORDTEXT_PLUS_5);
ptb_data(bf, &chordtext->alterations, 1);
ptb_data(bf, &chordtext->VII, 1);
ptb_assert_0(bf, chordtext->VII
& ~CHORDTEXT_VII
+ & ~CHORDTEXT_VII_VI
& ~CHORDTEXT_VII_OPEN
+ & ~CHORDTEXT_VII_TYPE_2
+ & ~CHORDTEXT_VII_TYPE_3
);
*dest = (struct ptb_list *)chordtext;
ptb_data(bf, &position->offset, 1);
ptb_data(bf, &position->properties, 2);
ptb_assert_0(bf, position->properties
+ & ~POSITION_PROPERTY_IRREGULAR_GROUPING
& ~POSITION_PROPERTY_IN_SINGLE_BEAM
& ~POSITION_PROPERTY_IN_DOUBLE_BEAM
& ~POSITION_PROPERTY_IN_TRIPLE_BEAM
& ~POSITION_PROPERTY_FIRST_IN_BEAM
+ & ~POSITION_PROPERTY_PARTIAL_BEAM
& ~POSITION_PROPERTY_MIDDLE_IN_BEAM
& ~POSITION_PROPERTY_LAST_IN_BEAM);
ptb_data(bf, &position->dots, 1);
& ~POSITION_DOTS_REST
& ~POSITION_DOTS_ARPEGGIO_UP
& ~POSITION_DOTS_ARPEGGIO_DOWN
+ & ~POSITION_DOTS_WIDE_VIBRATO
& ~POSITION_DOTS_VIBRATO);
ptb_data(bf, &position->palm_mute, 1);
- ptb_assert_0(bf, position->palm_mute & ~POSITION_PALM_MUTE & ~POSITION_STACCATO & ~POSITION_ACCENT);
+ ptb_assert_0(bf, position->palm_mute
+ & ~POSITION_PALM_MUTE
+ & ~POSITION_STACCATO
+ & ~POSITION_ACCENT
+ & ~POSITION_HEAVY_ACCENT
+ & ~POSITION_PICKSTROKE_DOWN
+ & ~POSITION_TREMOLO_PICKING
+ );
ptb_data(bf, &position->fermenta, 1);
ptb_assert_0(bf, position->fermenta
& ~POSITION_FERMENTA_ACCIACCATURA
& ~POSITION_FERMENTA_LET_RING
+ & ~POSITION_FERMENTA_TRIPLET_FEEL_FIRST
+ & ~POSITION_FERMENTA_TRIPLET_FEEL_SECOND
& ~POSITION_FERMENTA_TRIPLET_1
& ~POSITION_FERMENTA_TRIPLET_2
& ~POSITION_FERMENTA_TRIPLET_3
ptb_data(bf, &rhythmslash->offset, 1);
ptb_data(bf, &rhythmslash->properties, 1);
- ptb_assert_0(bf, rhythmslash->properties & ~RHYTHMSLASH_PROPERTY_FIRST_IN_BEAM);
+ ptb_assert_0(bf, rhythmslash->properties
+ & ~RHYTHMSLASH_PROPERTY_FIRST_IN_BEAM
+ & ~RHYTHMSLASH_PROPERTY_IN_SINGLE_BEAM
+ & ~RHYTHMSLASH_PROPERTY_IN_DOUBLE_BEAM
+ & ~RHYTHMSLASH_PROPERTY_LAST_IN_BEAM
+ & ~RHYTHMSLASH_PROPERTY_PARTIAL_BEAM
+ & ~RHYTHMSLASH_PROPERTY_TRIPLET_FIRST
+ & ~RHYTHMSLASH_PROPERTY_TRIPLET_SECOND
+ & ~RHYTHMSLASH_PROPERTY_TRIPLET_THIRD
+ );
ptb_data(bf, &rhythmslash->dotted, 1);
- ptb_data_constant(bf, 0);
+ ptb_data(bf, &rhythmslash->extra, 1);
+ ptb_assert_0(bf, rhythmslash->extra
+ & ~RHYTHMSLASH_EXTRA_ARPEGGIO_UP
+ & ~RHYTHMSLASH_EXTRA_ACCENT
+ & ~RHYTHMSLASH_EXTRA_HEAVY_ACCENT
+ & ~0x18 /* FIXME */);
ptb_data(bf, &rhythmslash->length, 1);
- ptb_data_constant(bf, 0);
+ ptb_data(bf, &rhythmslash->singlenote, 1);
*dest = (struct ptb_list *)rhythmslash;
return 1;
#define CHORDTEXT_PROPERTY_FORMULA_M7B5 0x0D
uint8_t properties;
uint8_t offset;
+#define CHORDTEXT_EXT_7_9 0x01
#define CHORDTEXT_PLUS_5 0x02
+#define CHORDTEXT_EXT_7_13 0x04
+#define CHORDTEXT_ADD_2 0x08
#define CHORDTEXT_ADD_9 0x40
+#define CHORDTEXT_ADD_11 0x80
uint8_t additions;
uint8_t alterations;
#define CHORDTEXT_VII_OPEN 0x01
+#define CHORDTEXT_VII_VI 0x06
#define CHORDTEXT_VII 0x08
+#define CHORDTEXT_VII_TYPE_2 0x20
+#define CHORDTEXT_VII_TYPE_3 0x40
uint8_t VII;
};
struct ptb_position *prev, *next;
uint8_t offset;
-#define POSITION_PALM_MUTE 0x20
+#define POSITION_PICKSTROKE_DOWN 0x01
#define POSITION_STACCATO 0x02
#define POSITION_ACCENT 0x04
+#define POSITION_HEAVY_ACCENT 0x08
+#define POSITION_TREMOLO_PICKING 0x10
+#define POSITION_PALM_MUTE 0x20
uint8_t palm_mute;
uint8_t length;
#define POSITION_DOTS_1 0x01
#define POSITION_DOTS_2 0x02
#define POSITION_DOTS_REST 0x04
#define POSITION_DOTS_VIBRATO 0x08
+#define POSITION_DOTS_WIDE_VIBRATO 0x10
#define POSITION_DOTS_ARPEGGIO_UP 0x20
#define POSITION_DOTS_ARPEGGIO_DOWN 0x40
uint8_t dots;
+
+ /* Irregular grouping:
+ Play x notes in the time of y
+ Stored as (x - 1) * 8 + (y - 1)
+ */
+#define POSITION_PROPERTY_IRREGULAR_GROUPING 0x007F
#define POSITION_PROPERTY_IN_SINGLE_BEAM 0x0080
#define POSITION_PROPERTY_IN_DOUBLE_BEAM 0x0100
#define POSITION_PROPERTY_IN_TRIPLE_BEAM 0x0200
#define POSITION_PROPERTY_FIRST_IN_BEAM 0x0400
+#define POSITION_PROPERTY_PARTIAL_BEAM 0x0800
#define POSITION_PROPERTY_LAST_IN_BEAM 0x1000
#define POSITION_PROPERTY_MIDDLE_IN_BEAM 0x2000
uint16_t properties;
uint8_t let_ring;
uint8_t fermenta;
#define POSITION_FERMENTA_ACCIACCATURA 0x01
+#define POSITION_FERMENTA_TRIPLET_FEEL_FIRST 0x02
+#define POSITION_FERMENTA_TRIPLET_FEEL_SECOND 0x04
#define POSITION_FERMENTA_LET_RING 0x08
#define POSITION_FERMENTA_FERMENTA 0x10
#define POSITION_FERMENTA_TRIPLET_1 0x20
};
#define LINEDATA_PROPERTY_TIE 0x01
#define LINEDATA_PROPERTY_MUTED 0x02
+#define LINEDATA_PROPERTY_CONTINUES 0x04
#define LINEDATA_PROPERTY_HAMMERON_FROM 0x08
#define LINEDATA_PROPERTY_PULLOFF_FROM 0x10
#define LINEDATA_PROPERTY_DEST_NOWHERE 0x20
struct ptb_rhythmslash {
struct ptb_rhythmslash *prev, *next;
+#define RHYTHMSLASH_PROPERTY_IN_SINGLE_BEAM 0x01
+#define RHYTHMSLASH_PROPERTY_IN_DOUBLE_BEAM 0x02
#define RHYTHMSLASH_PROPERTY_FIRST_IN_BEAM 0x04
+#define RHYTHMSLASH_PROPERTY_PARTIAL_BEAM 0x08
+#define RHYTHMSLASH_PROPERTY_LAST_IN_BEAM 0x10
+#define RHYTHMSLASH_PROPERTY_TRIPLET_FIRST 0x20
+#define RHYTHMSLASH_PROPERTY_TRIPLET_SECOND 0x40
+#define RHYTHMSLASH_PROPERTY_TRIPLET_THIRD 0x80
uint8_t properties;
uint8_t offset;
uint8_t dotted;
uint8_t length;
+ uint8_t extra;
+#define RHYTHMSLASH_EXTRA_ARPEGGIO_UP 0x02
+#define RHYTHMSLASH_EXTRA_ACCENT 0x20
+#define RHYTHMSLASH_EXTRA_HEAVY_ACCENT 0x40
+ uint8_t singlenote; /*
+ 5 MSB contains fret
+ 3 LSB contains string
+ */
};
struct ptb_direction {