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); }