Beispiel #1
0
        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)));
        }
Beispiel #2
0
        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
            });
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 internal FretManager(SIString str) : base(str.Layout)
 {
     String = str;
     _Frets = new FretPositionCollection(this);
 }
Beispiel #6
0
 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)));
 }