private List <FretPosition> CalculateFretsForString(SIString str) { var frets = new List <FretPosition>(); if (!CompensateFretPositions) { for (int i = MinimumFret; i <= MaximumFret; i++) { frets.Add(CalculateFretPosition(str, i)); } } else { var positions = FretCompensationCalculator.CalculateFretsCompensatedPositions( str.PhysicalProperties, str.StringLength, str.Tuning.FinalPitch, FretsTemperament, str.ActionAtFirstFret, str.ActionAtTwelfthFret, Measure.Mm(1.1938), str.TotalNumberOfFrets); for (int i = 0; i < positions.Length; i++) { PreciseDouble fretPosRatio = (str.StringLength - positions[i]).NormalizedValue / str.StringLength.NormalizedValue; var fretPos = str.LayoutLine.P2 + (str.LayoutLine.Direction * -1) * (str.StringLength * fretPosRatio); frets.Add(new FretPosition() { FretIndex = i - str.StartingFret, Position = fretPos, StringIndex = str.Index, PositionRatio = fretPosRatio }); } } return(frets); }
public static PreciseDouble GetRelativeFretPosition(StringTuning tuning, int fret, Temperament temperament) { if (fret == 0) { return(1d); } var pitchAtFret = FretCompensationCalculator.GetPitchAtFret(tuning.FinalPitch, fret, temperament); PreciseDouble fretRatio = NoteConverter.CentsToIntonationRatio(pitchAtFret.Cents - tuning.FinalPitch.Cents); return((PreciseDouble)1d / fretRatio); }