public StringLine ConstructString(SIString str, Measure nutPos, Measure bridgePos) { var opp = Measure.Abs(nutPos - bridgePos); Measure adj = str.ScaleLength; if (str.LengthCalculationMethod == LengthFunction.AlongString && opp > Measure.Zero) { var theta = MathP.Asin(opp.NormalizedValue / str.ScaleLength.NormalizedValue); adj = MathP.Cos(theta) * str.ScaleLength; } var p1 = new PointM(nutPos, (adj / 2d)); var p2 = new PointM(bridgePos, (adj / 2d) * -1d); return(AddVisualElement(new StringLine(str, p1, p2))); }
private FretPosition CalculateFretPosition(SIString str, int fret) { var stringTuning = str.Tuning ?? GetDefaultTuning(); var fretPosRatio = GetRelativeFretPosition(stringTuning, fret - str.StartingFret, FretsTemperament); var dir = str.PlaceFretsRelativeToString ? str.LayoutLine.Direction * -1 : new Vector(0, 1); var fretPos = str.LayoutLine.P2 + (dir * str.CalculatedLength * fretPosRatio); if (!str.PlaceFretsRelativeToString) { fretPos = str.LayoutLine.SnapToLine(fretPos, LineSnapDirection.Horizontal); } return(new FretPosition() { FretIndex = fret, Position = fretPos, StringIndex = str.Index, PositionRatio = fretPosRatio }); }
internal LayoutLine GetStringBoundaryLine(SIString str, FingerboardSide dir) { LayoutLine boundary = null; if (dir == FingerboardSide.Bass) { boundary = VisualElements.OfType <StringCenter>().FirstOrDefault(c => c.Right.Index == str.Index); } else { boundary = VisualElements.OfType <StringCenter>().FirstOrDefault(c => c.Left.Index == str.Index); } if (boundary == null) { return(VisualElements.OfType <FingerboardSideEdge>().First(e => e.Side == dir)); } return(boundary); }
public static void EstimateStringAction(SIString @string) { if (@string.Gauge.IsEmpty) { return; } //var fret1Pos = @string.ScaleLength - (@string.ScaleLength / Math.Pow(2, 1d / 12d)); //var fret2Pos = @string.ScaleLength - (@string.ScaleLength / Math.Pow(2, 2d / 12d)); //var dist = fret2Pos.NormalizedValue - fret1Pos.NormalizedValue; //var targetClearance = Measure.Mm(0.1) + (@string.Gauge / 2d); //var slope = targetClearance / dist; //var offset = slope * fret2Pos.NormalizedValue; //offset.Unit = UnitOfMeasure.Mm; //offset -= (@string.Gauge / 2d); //@string.ActionAtFirstFret = offset; var fretRatio = @string.Gauge[UnitOfMeasure.In].DoubleValue * 10; @string.ActionAtFirstFret = Measure.Mm(0.3 + fretRatio); @string.ActionAtTwelfthFret = Measure.Mm(2.5); }
internal FretManager(SIString str) : base(str.Layout) { String = str; _Frets = new FretPositionCollection(this); }
internal StringCenter GetStringsCenter(SIString left, SIString right) { return(VisualElements.OfType <StringCenter>().FirstOrDefault(c => (left.Index == c.Right.Index || left.Index == c.Left.Index) && (right.Index == c.Right.Index || right.Index == c.Left.Index))); }