public void ReadBeat(Track track, Bar bar, Voice voice)
{
var newBeat = new Beat();
var flags = Data.ReadByte();
if ((flags & 0x01) != 0)
{
newBeat.Dots = 1;
}
if ((flags & 0x40) != 0)
{
var type = Data.ReadByte();
newBeat.IsEmpty = (type & 0x02) == 0;
}
voice.AddBeat(newBeat);
var duration = Data.ReadSignedByte();
switch (duration)
{
case -2:
newBeat.Duration = Duration.Whole;
break;
case -1:
newBeat.Duration = Duration.Half;
break;
case 0:
newBeat.Duration = Duration.Quarter;
break;
case 1:
newBeat.Duration = Duration.Eighth;
break;
case 2:
newBeat.Duration = Duration.Sixteenth;
break;
case 3:
newBeat.Duration = Duration.ThirtySecond;
break;
case 4:
newBeat.Duration = Duration.SixtyFourth;
break;
default:
newBeat.Duration = Duration.Quarter;
break;
}
if ((flags & 0x20) != 0)
{
newBeat.TupletNumerator = ReadInt32();
switch (newBeat.TupletNumerator)
{
case 1:
newBeat.TupletDenominator = 1;
break;
case 3:
newBeat.TupletDenominator = 2;
break;
case 5:
case 6:
case 7:
newBeat.TupletDenominator = 4;
break;
case 9:
case 10:
case 11:
case 12:
case 13:
newBeat.TupletDenominator = 8;
break;
case 2:
case 4:
case 8:
break;
default:
newBeat.TupletNumerator = 1;
newBeat.TupletDenominator = 1;
break;
}
}
if ((flags & 0x02) != 0)
{
ReadChord(newBeat);
}
if ((flags & 0x04) != 0)
{
newBeat.Text = ReadStringIntUnused();
}
if ((flags & 0x08) != 0)
{
ReadBeatEffects(newBeat);
}
if ((flags & 0x10) != 0)
{
ReadMixTableChange(newBeat);
}
var stringFlags = Data.ReadByte();
for (int i = 6; i >= 0; i--)
{
if ((stringFlags & (1 << i)) != 0 && (6 - i) < track.Tuning.Length)
{
ReadNote(track, bar, voice, newBeat, (6 - i));
}
}
if (_versionNumber >= 500)
{
Data.ReadByte();
var flag = Data.ReadByte();
if ((flag & 0x08) != 0)
{
Data.ReadByte();
}
}
}