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()); } } } } }
public DiagramMark NewMark(MarkPosition position, string text = "") { DiagramMark mark = new DiagramMark(this, position, text); _marks.Add(mark); return(mark); }
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); }
public bool IsRoot(MarkPosition mark) { if (null == mark) { throw new ArgumentOutOfRangeException(nameof(mark)); } return(NoteAt(mark) == NoteUtils.ToInternalNote(Parent.ScaleFinderOptions.RootNote)); }
public bool CanRemoveMarkAt(MarkPosition position) { if (null == position) { throw new ArgumentNullException(nameof(position)); } return(HasElementAt(position)); }
public bool CanAddNewMarkAt(MarkPosition position) { if (null == position) { throw new ArgumentNullException(nameof(position)); } if (ValidPosition(position) && !HasElementAt(position)) { return(true); } return(false); }
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); }
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); }
public Diagram ToDiagram(ScaleFinderStyle scaleFinderStyle) { int numStrings = Parent.ScaleFinderOptions.Instrument.NumStrings; int numFrets = Parent.ScaleFinderOptions.NumFrets; IEnumerable <MarkPosition> marks = MarkUtils.AbsoluteToRelativeMarks(Marks, out int 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(scaleFinderStyle.FretLabelSide, 1); d.NewFretLabel(flp, baseLine.ToString()); } return(d); }
public InternalNote NoteAt(MarkPosition position) { return(NoteUtils.Shift(Parent.ScaleFinderOptions.Tuning.RootNotes[position.String - 1].InternalNote, position.Fret)); }
public override bool Equals(ElementPosition obj) { MarkPosition mp = (obj as MarkPosition); return(null != mp && mp.String == String && mp.Fret == Fret); }
public DiagramMark(Diagram parent, MarkPosition position, string text = "") : base(parent, position, text) { MarkStyle = new DiagramMarkStyleWrapper(Style, position.Fret > parent.NumFrets ? DiagramMarkType.Bottom : DiagramMarkType.Normal); }
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); }
public void RemoveMark(MarkPosition position) { _marks.Remove((DiagramMark)ElementAt(position)); }