Esempio n. 1
0
        public DiagramMark NewMark(MarkPosition position, string text = "")
        {
            DiagramMark mark = new DiagramMark(this, position, text);

            _marks.Add(mark);
            return(mark);
        }
Esempio n. 2
0
        public override sealed void Read(XmlReader xmlReader)
        {
            if (null == xmlReader)
            {
                throw new ArgumentNullException(nameof(xmlReader));
            }

            using (xmlReader)
            {
                if (xmlReader.IsStartElement() && xmlReader.Name == "mark")
                {
                    Text = xmlReader.GetAttribute("text");
                    Type = (DiagramMarkType)Enum.Parse(typeof(DiagramMarkType), xmlReader.GetAttribute("type"));

                    int @string = int.Parse(xmlReader.GetAttribute("string"));
                    int fret    = int.Parse(xmlReader.GetAttribute("fret"));

                    Position = new MarkPosition(@string, fret);

                    while (xmlReader.Read())
                    {
                        if (xmlReader.IsStartElement() && xmlReader.Name == "style")
                        {
                            Style.Read(xmlReader.ReadSubtree());
                        }
                    }
                }
            }
        }
Esempio n. 3
0
        public static IEnumerable <MarkPosition> AbsoluteToRelativeMarks(IEnumerable <MarkPosition> absoluteMarks, out int baseLine, int numFrets, int numStrings)
        {
            if (null == absoluteMarks)
            {
                throw new ArgumentNullException("absoluteMarks");
            }

            MarkAnalysis ma = ScaleAnalysis(absoluteMarks, numStrings);

            if (ma.Reach > numFrets)
            {
                throw new ArgumentOutOfRangeException("numFrets");
            }

            List <MarkPosition> relativeMarks = new List <MarkPosition>();

            baseLine = ma.MaxFret > numFrets ? ma.MinFret : 0;

            foreach (MarkPosition absoluteMark in absoluteMarks)
            {
                MarkPosition relativeMark = (MarkPosition)absoluteMark.Clone();

                if (relativeMark.Fret > 0 && baseLine > 0)
                {
                    relativeMark = new MarkPosition(relativeMark.String, relativeMark.Fret - (baseLine - 1));
                }

                relativeMarks.Add(relativeMark);
            }

            return(relativeMarks);
        }
Esempio n. 4
0
        public bool ValidPosition(ElementPosition position)
        {
            if (null == position)
            {
                throw new ArgumentNullException(nameof(position));
            }

            if (position.GetType() == typeof(MarkPosition))
            {
                MarkPosition mp = (MarkPosition)position;
                return((mp.Fret <= NumFrets + 1) && (mp.String <= NumStrings));
            }
            else if (position.GetType() == typeof(FretLabelPosition))
            {
                FretLabelPosition flp = (FretLabelPosition)position;
                return(flp.Fret <= NumFrets);
            }
            else if (position.GetType() == typeof(BarrePosition))
            {
                BarrePosition bp = (BarrePosition)position;
                return(bp.Fret <= NumFrets && bp.StartString <= NumStrings && bp.EndString <= NumStrings);
            }

            return(false);
        }
Esempio n. 5
0
        public bool CanRemoveMarkAt(MarkPosition position)
        {
            if (null == position)
            {
                throw new ArgumentNullException(nameof(position));
            }

            return(HasElementAt(position));
        }
Esempio n. 6
0
        public bool IsRoot(MarkPosition mark)
        {
            if (null == mark)
            {
                throw new ArgumentOutOfRangeException("mark");
            }

            return(NoteAt(mark) == NoteUtils.ToInternalNote(Parent.ScaleFinderOptions.RootNote));
        }
Esempio n. 7
0
        public bool CanAddNewMarkAt(MarkPosition position)
        {
            if (null == position)
            {
                throw new ArgumentNullException(nameof(position));
            }

            if (ValidPosition(position) && !HasElementAt(position))
            {
                return(true);
            }

            return(false);
        }
Esempio n. 8
0
        public string GetText(MarkPosition mark, MarkTextOption markTextOption)
        {
            string text = "";

            switch (markTextOption)
            {
            case MarkTextOption.ShowNote_PreferFlats:
                text = NoteUtils.ToString(NoteAt(mark), InternalNoteStringStyle.PreferFlat);
                break;

            case MarkTextOption.ShowNote_PreferSharps:
                text = NoteUtils.ToString(NoteAt(mark), InternalNoteStringStyle.PreferSharp);
                break;

            case MarkTextOption.ShowNote_ShowBoth:
                text = NoteUtils.ToString(NoteAt(mark), InternalNoteStringStyle.ShowBoth);
                break;
            }
            return(text);
        }
Esempio n. 9
0
        public override bool Equals(ElementPosition obj)
        {
            MarkPosition mp = (obj as MarkPosition);

            return(null != mp && mp.String == String && mp.Fret == Fret);
        }
Esempio n. 10
0
 public DiagramMark(Diagram parent, MarkPosition position, string text = "") : base(parent, position, text)
 {
     MarkStyle = new DiagramMarkStyleWrapper(Style, position.Fret > parent.NumFrets ? DiagramMarkType.Bottom : DiagramMarkType.Normal);
 }
Esempio n. 11
0
        public Diagram ToDiagram(ChordFinderStyle chordFinderStyle)
        {
            int[] marks = MarkUtils.AbsoluteToRelativeMarks(Marks, out int baseLine, Parent.ChordFinderOptions.NumFrets);

            InternalNote?[] notes    = MarkUtils.GetInternalNotes(Marks, Parent.ChordFinderOptions.Tuning);
            InternalNote    rootNote = NoteUtils.ToInternalNote(Parent.ChordFinderOptions.RootNote);

            if (chordFinderStyle.MirrorResults)
            {
                Array.Reverse(marks);
                Array.Reverse(notes);
            }

            int numStrings = marks.Length;

            int numFrets = Parent.ChordFinderOptions.NumFrets;

            Diagram d = new Diagram(chordFinderStyle.Style, numStrings, numFrets);

            if (chordFinderStyle.AddTitle)
            {
                d.Title = NoteUtils.ToString(Parent.ChordFinderOptions.RootNote) + Parent.ChordFinderOptions.ChordQuality.Abbreviation;
                d.Style.TitleLabelStyle = DiagramLabelStyle.ChordName;
            }

            // Add marks
            for (int i = 0; i < marks.Length; i++)
            {
                int @string = i + 1;

                int          fret = Math.Max(marks[i], 0);
                MarkPosition mp   = new MarkPosition(@string, fret);

                DiagramMark dm = d.NewMark(mp);

                // Set mark type
                if (marks[i] == -1) // Muted string
                {
                    dm.Type = DiagramMarkType.Muted;
                }
                else if (marks[i] == 0) // Open string
                {
                    dm.Type = DiagramMarkType.Open;
                }

                // Change to root if necessary
                if (chordFinderStyle.AddRootNotes && notes[i].HasValue && notes[i].Value == rootNote)
                {
                    dm.Type = (dm.Type == DiagramMarkType.Open) ? DiagramMarkType.OpenRoot : DiagramMarkType.Root;
                }

                // Add text
                if (chordFinderStyle.MarkTextOption != MarkTextOption.None)
                {
                    dm.Text = GetText(notes, i, chordFinderStyle.MarkTextOption);
                }

                // Add bottom marks
                if (chordFinderStyle.AddBottomMarks)
                {
                    MarkPosition bottomPosition = new MarkPosition(@string, numFrets + 1);
                    DiagramMark  bottomMark     = d.NewMark(bottomPosition);
                    bottomMark.Type = DiagramMarkType.Bottom;
                    bottomMark.Text = GetText(notes, i, chordFinderStyle.BottomMarkTextOption);
                }
            }

            // Add nut or fret label
            if (baseLine == 0)
            {
                d.Style.GridNutVisible = true;
            }
            else
            {
                d.Style.GridNutVisible = false;
                FretLabelPosition flp = new FretLabelPosition(chordFinderStyle.FretLabelSide, 1);
                d.NewFretLabel(flp, baseLine.ToString());
            }

            // Add barre
            BarrePosition bp = MarkUtils.AutoBarrePosition(marks, chordFinderStyle.BarreTypeOption, chordFinderStyle.MirrorResults);

            if (null != bp)
            {
                d.NewBarre(bp);
            }

            return(d);
        }
Esempio n. 12
0
        public ElementPosition GetPosition <T>(double x, double y) where T : ElementPosition
        {
            GetPositionInternal(x, y, out int @string, out int fret);

            try
            {
                if (typeof(T) == typeof(MarkPosition))
                {
                    MarkPosition mp = new MarkPosition(@string, fret);
                    if (ValidPosition(mp))
                    {
                        return(mp);
                    }
                }
                else if (typeof(T) == typeof(FretLabelPosition))
                {
                    FretLabelSide?fls = null;

                    if (@string == 0)
                    {
                        fls = FretLabelSide.Left;
                    }
                    else if (@string == NumStrings + 1)
                    {
                        fls = FretLabelSide.Right;
                    }

                    if (fls.HasValue)
                    {
                        FretLabelPosition flp = new FretLabelPosition(fls.Value, fret);
                        if (ValidPosition(flp))
                        {
                            return(flp);
                        }
                    }
                }
                else if (typeof(T) == typeof(BarrePosition))
                {
                    // Try to find existing barre covering @string
                    foreach (DiagramBarre barre in Barres)
                    {
                        if (barre.Position.Contains(fret, @string))
                        {
                            return(barre.Position.Clone());
                        }
                    }

                    // Find the largest clear range
                    int startString = @string;
                    for (int endString = NumStrings; endString > startString; endString--)
                    {
                        BarrePosition bp = new BarrePosition(fret, startString, endString);
                        if (CanAddNewBarreAt(bp))
                        {
                            return(bp);
                        }
                    }
                }
            }
            catch (Exception) { }

            return(null);
        }
Esempio n. 13
0
 public void RemoveMark(MarkPosition position)
 {
     _marks.Remove((DiagramMark)ElementAt(position));
 }
Esempio n. 14
0
 public DiagramMark(Diagram parent, MarkPosition position, string text = "") : base(parent, position, text)
 {
     MarkStyle = new DiagramMarkStyleWrapper(Style);
 }
Esempio n. 15
0
        public Diagram ToDiagram(ScaleFinderStyle scaleFinderStyle)
        {
            int numStrings = Parent.ScaleFinderOptions.Instrument.NumStrings;
            int numFrets   = Parent.ScaleFinderOptions.NumFrets;

            int baseLine;
            IEnumerable <MarkPosition> marks = MarkUtils.AbsoluteToRelativeMarks(Marks, out baseLine, numFrets, numStrings);

            Diagram d = new Diagram(scaleFinderStyle.Style, numStrings, numFrets);

            if (scaleFinderStyle.AddTitle)
            {
                d.Title = NoteUtils.ToString(Parent.ScaleFinderOptions.RootNote) + " " + Parent.ScaleFinderOptions.Scale.Name;
                d.Style.TitleLabelStyle = DiagramLabelStyle.Regular;
            }

            int markPositionIndex = 0;

            // Add existing marks
            foreach (MarkPosition mark in marks)
            {
                int @string = mark.String;

                if (scaleFinderStyle.MirrorResults)
                {
                    @string = numStrings - (@string - 1);
                }

                int          fret = mark.Fret;
                MarkPosition mp   = new MarkPosition(@string, fret);

                DiagramMark dm = d.NewMark(mp);

                // Set mark type
                if (scaleFinderStyle.AddRootNotes && IsRoot(markPositionIndex))  // Use markPositionIndex, to get the correct roots in mirror mode
                {
                    dm.Type = DiagramMarkType.Root;
                }

                if (fret == 0) // Open string
                {
                    dm.Type = (dm.Type == DiagramMarkType.Root) ? DiagramMarkType.OpenRoot : DiagramMarkType.Open;
                }

                // Add text
                dm.Text = GetText(markPositionIndex, scaleFinderStyle.MarkTextOption);  // Use markPositionIndex, not mp, to get the correct text in mirror mode

                markPositionIndex++;
            }

            // Add nut or fret label
            if (baseLine == 0)
            {
                d.Style.GridNutVisible = true;
            }
            else
            {
                d.Style.GridNutVisible = false;
                FretLabelPosition flp = new FretLabelPosition(FretLabelSide.Right, 1);
                d.NewFretLabel(flp, baseLine.ToString());
            }

            return(d);
        }
Esempio n. 16
0
 public InternalNote NoteAt(MarkPosition position)
 {
     return(NoteUtils.Shift(Parent.ScaleFinderOptions.Tuning.RootNotes[position.String - 1].InternalNote, position.Fret));
 }