public void ReadMasterBar()
{
MasterBar previousMasterBar = default(MasterBar);
if (_score.MasterBars.Count > 0)
{
previousMasterBar = _score.MasterBars[_score.MasterBars.Count - 1];
}
MasterBar newMasterBar = new MasterBar();
int flags = Data.ReadByte();
// time signature
if ((flags & 0x01) != 0)
{
newMasterBar.TimeSignatureNumerator = Data.ReadByte();
}
else if (previousMasterBar != null)
{
newMasterBar.TimeSignatureNumerator = previousMasterBar.TimeSignatureNumerator;
}
if ((flags & 0x02) != 0)
{
newMasterBar.TimeSignatureDenominator = Data.ReadByte();
}
else if (previousMasterBar != null)
{
newMasterBar.TimeSignatureDenominator = previousMasterBar.TimeSignatureDenominator;
}
// repeatings
newMasterBar.IsRepeatStart = (flags & 0x04) != 0;
if ((flags & 0x08) != 0)
{
newMasterBar.RepeatCount = Data.ReadByte() + (_versionNumber >= 500 ? 0 : 1);
}
// alternate endings
if ((flags & 0x10) != 0)
{
if (_versionNumber < 500)
{
MasterBar currentMasterBar = previousMasterBar;
// get the already existing alternatives to ignore them
int existentAlternatives = 0;
while (currentMasterBar != null)
{
// found another repeat ending?
if (currentMasterBar.IsRepeatEnd && currentMasterBar != previousMasterBar)
break;
// found the opening?
if (currentMasterBar.IsRepeatStart)
break;
existentAlternatives |= currentMasterBar.AlternateEndings;
currentMasterBar = currentMasterBar.PreviousMasterBar;
}
// now calculate the alternative for this bar
var repeatAlternative = 0;
var repeatMask = Data.ReadByte();
for (var i = 0; i < 8; i++)
{
// only add the repeating if it is not existing
var repeating = (1 << i);
if (repeatMask > i && (existentAlternatives & repeating) == 0)
{
repeatAlternative |= repeating;
}
}
newMasterBar.AlternateEndings = (byte)repeatAlternative;
}
else
{
newMasterBar.AlternateEndings = (byte)Data.ReadByte();
}
}
// marker
if ((flags & 0x20) != 0)
{
Section section = new Section();
section.Text = ReadStringIntByte();
section.Marker = "";
ReadColor();
newMasterBar.Section = section;
}
// keysignature
if ((flags & 0x40) != 0)
{
newMasterBar.KeySignature = Data.ReadSignedByte();
newMasterBar.KeySignatureType = (KeySignatureType)Data.ReadByte();
}
else if (previousMasterBar != null)
{
newMasterBar.KeySignature = previousMasterBar.KeySignature;
newMasterBar.KeySignatureType = previousMasterBar.KeySignatureType;
}
if ((_versionNumber >= 500) && ((flags & 0x03) != 0))
{
Data.Skip(4);
}
// better alternate ending mask in GP5
if ((_versionNumber >= 500) && ((flags & 0x10) == 0))
{
newMasterBar.AlternateEndings = (byte)Data.ReadByte();
}
// tripletfeel
if (_versionNumber >= 500)
{
var tripletFeel = Data.ReadByte();
switch (tripletFeel)
{
case 1:
newMasterBar.TripletFeel = TripletFeel.Triplet8th;
break;
case 2:
newMasterBar.TripletFeel = TripletFeel.Triplet16th;
break;
}
Data.ReadByte();
}
else
{
newMasterBar.TripletFeel = _globalTripletFeel;
}
newMasterBar.IsDoubleBar = (flags & 0x80) != 0;
_score.AddMasterBar(newMasterBar);
}