コード例 #1
0
        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);
        }
コード例 #2
0
        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;
                    }
                }
            }
        }
コード例 #3
0
        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;
        }
コード例 #4
0
        public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element)
        {
            var encoding = new ScoreEncoding();

            encoding.Software.AddRange(element.ParseChildElements("software"));
            staff.Score.Encoding = encoding;
        }
コード例 #5
0
 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]);
 }
コード例 #6
0
        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);
        }
コード例 #9
0
        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");
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        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
        }
コード例 #12
0
        public override void ParseElement(MusicXmlParserState state, Staff staff, XElement element)
        {
            var score = staff.Score;

            score.DefaultPageSettings.DefaultSystemDistance = element.ParseChildElement <double>("system-distance");
        }
コード例 #13
0
 protected abstract void ParseElementInner(TSymbol symbol, MusicXmlParserState state, Staff staff, XElement element);
コード例 #14
0
        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);
        }
コード例 #15
0
 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))));
 }