private PrintSuggestion CreateSuggestion(XElement element, MusicXmlParserState state, Staff staff) { PrintSuggestion suggestion = new PrintSuggestion(); element.IfAttribute("new-system").HasValue("yes").Then(() => suggestion.IsSystemBreak = true); element.IfAttribute("new-page").HasValue("yes").Then(() => suggestion.IsPageBreak = true); if (suggestion.IsPageBreak) { suggestion.IsSystemBreak = true; //Page breaks are treated also as system breaks. } element.IfDescendant("system-distance").Exists().Then(n => { suggestion.SystemDistance = UsefulMath.TryParse(n.Value); }); //Issue #45: Kopiujemy ustawienia z pierwszego staffa do wszystkich pozostałych staffów (bo są zdefiniowane tylko w pierwszym), innaczej się układ rozjedzie: if (!suggestion.SystemDistance.HasValue && staff != staff.Score.Staves.First()) { var thisStaffPrintSuggestions = staff.Elements.OfType <PrintSuggestion>().ToList(); var firstStaffPrintSuggestions = staff.Score.Staves.First().Elements.OfType <PrintSuggestion>().ToList(); var indexOfThisBreak = (thisStaffPrintSuggestions.Any() ? thisStaffPrintSuggestions.IndexOf(thisStaffPrintSuggestions.Last()) : -1) + 1; if (firstStaffPrintSuggestions.Count > indexOfThisBreak) { suggestion.SystemDistance = firstStaffPrintSuggestions[indexOfThisBreak].SystemDistance; } } element.IfDescendant("staff-distance").Exists().Then(n => { staff.Score.Pages.Last().DefaultStaffDistance = UsefulMath.TryParse(n.Value); }); return(suggestion); }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { PrintSuggestion suggestion = CreateSuggestion(element, state, staff); staff.Elements.Add(suggestion); if (staff.Part?.Staves.Any() ?? false) //If part contains many staves, add to all staves { foreach (var s in staff.Part.Staves.Skip(1)) { s.Elements.Add(suggestion.Clone()); } } if (suggestion.IsPageBreak) { var page = new ScorePage(staff.Score); staff.Score.Pages.Add(page); } if (suggestion.IsSystemBreak) { state.CurrentSystemNo++; var system = NewSystem(state, staff); staff.Measures.Last().System = system; if (staff.Part != null && staff.Part.Staves.Any()) //If part contains many staves, add to all staves { foreach (var s in staff.Part.Staves) { s.Measures.Last().System = system; } } } }
public NoteOrRestBuilder(MusicXmlParserState state) { State = state; Octave = 0; Alter = 0; Step = "C"; IsRest = false; NumberOfDots = 0; BaseDuration = RhythmicDuration.Whole; StemDirection = VerticalDirection.Up; TieType = NoteTieType.None; Tuplet = TupletType.None; TupletPlacement = null; BeamList = new List <NoteBeamType>(); Lyrics = new List <Lyrics>(); ArticulationPlacement = VerticalPlacement.Below; Articulation = ArticulationType.None; HasNatural = false; IsGraceNote = false; IsCueNote = false; IsChordElement = false; HasFermataSign = false; StemDefaultY = 28; CustomStemEndPosition = false; TremoloLevel = 0; Slur = null; TrillMark = NoteTrillMark.None; Mordent = null; Voice = 1; IsVisible = true; }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { var encoding = new ScoreEncoding(); encoding.Software.AddRange(element.ParseChildElements("software")); staff.Score.Encoding = encoding; }
private static StaffSystem NewSystem(MusicXmlParserState state, Staff staff) { if (staff == staff.Score.Staves.First()) { var system = new StaffSystem(staff.Score); staff.Score.Pages.Last().Systems.Add(system); return(system); } return(staff.Score.Systems[state.CurrentSystemNo - 1]); }
public override sealed void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { var symbol = new TSymbol(); element.IfElement("staff").HasValue <int>() .Then(v => symbol.Staff = staff.Score.Staves.ElementAt(v - 1)) //TODO: Sprawdzić czy staff to numer liczony od góry strony czy numer w obrębie parta .Otherwise(() => symbol.Staff = staff.Score.Staves.First()); ParseElementInner(symbol, state, staff, element); }
public override sealed void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { var symbol = new TSymbol(); element.IfElement("staff").HasValue <int>() .Then(v => symbol.Staff = staff.Part.Staves.ElementAt(v - 1)) .Otherwise(r => symbol.Staff = staff.Score.Staves.First()); ParseElementInner(symbol, state, staff, element); }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { var suggestion = new PlaybackSuggestion { IsBackward = IsBackward }; element.IfElement("duration").HasValue <int>().Then(d => suggestion.MusicXmlDuration = d); element.IfElement("voice").HasValue <int>().Then(v => suggestion.Voice = v); staff.Elements.Add(suggestion); }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { var score = staff.Score; score.DefaultPageSettings.Width = element.ParseChildElement <double>("page-width"); score.DefaultPageSettings.Height = element.ParseChildElement <double>("page-height"); score.DefaultPageSettings.MarginLeft = element.ParseChildElement <double>("left-margin"); score.DefaultPageSettings.MarginRight = element.ParseChildElement <double>("right-margin"); score.DefaultPageSettings.MarginTop = element.ParseChildElement <double>("top-margin"); score.DefaultPageSettings.MarginBottom = element.ParseChildElement <double>("bottom-margin"); }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { var part = staff.Score.Parts.Last(); staff.Part = part; var stavesCount = Convert.ToInt32(element.Value); for (var i = 1; i < stavesCount; i++) { var newStaff = new Staff() { MeasureAddingRule = Staff.MeasureAddingRuleEnum.AddMeasuresManually }; newStaff.Part = part; part.Staves.Add(newStaff); staff.Score.Staves.Add(newStaff); } }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { #if CSHTML5 throw new NotImplementedException("This method is not yet implemented for CSHTML5."); #else var part = staff.Part; if (!staff.Score.Systems.Any()) { staff.Score.Pages.Last().Systems.Add(new StaffSystem(staff.Score)); } var system = staff.Score.Systems[state.CurrentSystemNo - 1]; var measure = new Measure(staff, system); measure.Number = element.ParseAttribute <int>("number"); staff.Measures.Add(measure); state.BarlineAlreadyAdded = false; if (element.Parent.Name == "part") //Don't take the other voices than the upper into account / Nie uwzględniaj innych głosów niż górny { if (!state.FirstLoop) { if (element.Parent.Attribute(XName.Get("id")).Value != state.PartID) { return; } } else { state.PartID = element.Parent.Attribute(XName.Get("id")).Value; } } //Skip measure if needed: if (state.SkipMeasures > 0) { state.SkipMeasures--; return; } //Read width measure: measure.Width = element.ParseAttribute <double>("width"); //Skip if measure node is empty: if (!element.HasElements) { return; } //Parse measure nodes: foreach (XElement elementNode in element.Elements().Where(e => e.Name == "attributes")) { MusicXmlParsingStrategy parsingStrategy = MusicXmlParsingStrategy.GetProperStrategy(elementNode); if (parsingStrategy != null) { parsingStrategy.ParseElement(state, staff, elementNode); } } foreach (var partStaff in part.Staves.Skip(1)) { partStaff.Measures.Add(new Measure(partStaff, measure.System)); } //Parse measure nodes: foreach (XElement elementNode in element.Elements().Where(e => e.Name != "attributes")) { MusicXmlParsingStrategy parsingStrategy = MusicXmlParsingStrategy.GetProperStrategy(elementNode); if (parsingStrategy != null) { parsingStrategy.ParseElement(state, staff, elementNode); } } if (!state.BarlineAlreadyAdded) { if (staff.Part != null && staff.Part.Staves.Any()) //If part contains many staves, add to all staves { foreach (var s in staff.Part.Staves) { s.Elements.Add(new Barline()); } } else { staff.Elements.Add(new Barline()); } } state.FirstLoop = false; #endif }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { var score = staff.Score; score.DefaultPageSettings.DefaultSystemDistance = element.ParseChildElement <double>("system-distance"); }
protected abstract void ParseElementInner(TSymbol symbol, MusicXmlParserState state, Staff staff, XElement element);
public override Score Parse(XDocument xmlDocument) //TODO: Exception handling! { Score score = new Score(); var firstSystem = new StaffSystem(score); score.Pages.Last().Systems.Add(firstSystem); MusicXmlParserState state = new MusicXmlParserState(); foreach (XElement defaultSettingsNode in xmlDocument.Descendants().Where(d => d.Name == "defaults" || d.Name == "identification")) { foreach (XElement settingNode in defaultSettingsNode.Elements()) { var dummyStaff = new Staff { Score = score }; //Nasty workaround MusicXmlParsingStrategy parsingStrategy = MusicXmlParsingStrategy.GetProperStrategy(settingNode); if (parsingStrategy != null) { parsingStrategy.ParseElement(state, dummyStaff, settingNode); } } } foreach (XElement partNode in xmlDocument.Descendants(XName.Get("part"))) { state.CurrentSystemNo = 1; var partId = partNode.ParseAttribute("id"); state.FirstLoop = true; Staff staff = new Staff() { MeasureAddingRule = Staff.MeasureAddingRuleEnum.AddMeasuresManually }; score.Staves.Add(staff); var part = score.Parts.FirstOrDefault(p => p.PartId == partId) ?? new Part(staff) { PartId = partId }; staff.Part = part; score.Parts.Add(part); foreach (XElement node in partNode.Elements()) { MusicXmlParsingStrategy parsingStrategy = MusicXmlParsingStrategy.GetProperStrategy(node); if (parsingStrategy != null) { parsingStrategy.ParseElement(state, staff, node); } } } var partListNode = xmlDocument.Descendants(XName.Get("part-list")); PartGroup currentPartGroup = null; foreach (var partListElementNode in partListNode.Elements()) { if (partListElementNode.Name == "part-group") { partListElementNode.IfAttribute("type").HasValue("start").Then(() => { currentPartGroup = new PartGroup() { Number = score.PartGroups.Count + 1 }; score.PartGroups.Add(currentPartGroup); }); partListElementNode.IfAttribute("type").HasValue("stop").Then(() => currentPartGroup = null); if (currentPartGroup != null) { partListElementNode.IfElement("group-barline").HasValue <GroupBarlineType>(d => { d.Add("Yes", GroupBarlineType.Enabled); d.Add("No", GroupBarlineType.Disabled); d.Add("Mensurstrich", GroupBarlineType.Mensurstrich); return(d); }).Then(r => currentPartGroup.GroupBarline = r); } } if (partListElementNode.Name == "score-part" && currentPartGroup != null) { var scorePartId = partListElementNode.IfAttribute("id").HasAnyValue().ThenReturnResult(); var matchingScorePart = score.Parts.FirstOrDefault(p => p.PartId == scorePartId); if (matchingScorePart != null) { matchingScorePart.Group = currentPartGroup; } } } //Sibelius hack: if (score.Encoding?.Software?.Any(s => s.Contains("Sibelius")) ?? false) { new DefaultScoreFormatter().Format(score); } foreach (var staff in score.Staves) { staff.MeasureAddingRule = Staff.MeasureAddingRuleEnum.AddMeasureOnInsertingBarline; } return(score); }
public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element) { element.IfElement("root-step").HasAnyValue().Then(s => staff.Elements.Add(new ChordSign(new TertianHarmony().CreateChord(new Pitch(s, 0, 4), 0, 2, MajorScale.C)))); }