public void SetFricationTaps(IntonationModel model) { double fricationAmplitude = WaveHelper.CalculateAmplitude(model.FricationVolume); /* CALCULATE POSITION REMAINDER AND COMPLEMENT */ var integerPart = (int)model.FricationPosition; var complement = model.FricationPosition - (double)integerPart; var remainder = 1.0 - complement; /* SET THE FRICATION TAPS */ for (int i = 0; i < 8; i++) { if (i == integerPart) { FricationTap[i] = remainder * fricationAmplitude; if ((i + 1) < 8) { FricationTap[++i] = complement * fricationAmplitude; } } else { FricationTap[i] = 0.0; } } }
public void CalculateTubeCoefficients(IntonationModel model, ThroatModelParameters parameters) { /* CALCULATE COEFFICIENTS FOR THE Oropharynx */ for (int i = 0; i < OropharynxCoefficients.Count(); i++) { var lastSegment = i + 1 == OropharynxCoefficients.Count(); var radA2 = Square(model.RadiusSegments.ElementAt(i)); var radB2 = lastSegment ? Square(parameters.AperatureScalingRadius) : Square(model.RadiusSegments.ElementAt(i + 1)); OropharynxCoefficients[i] = (radA2 - radB2) / (radA2 + radB2); } /* CALCULATE ALPHA COEFFICIENTS FOR 3-WAY JUNCTION */ var sides = Square(model.RadiusSegments.ElementAt(3)); var velum = Square(model.Velum); var sum = 2.0 / (sides + sides + velum); Alpha.Left = sum * sides; Alpha.Right = sum * sides; Alpha.Upper = sum * velum; /* AND 1ST NASAL PASSAGE COEFFICIENT */ var nose = Square(parameters.NoseRadius.ElementAt(1)); NasalCoefficients[0] = (velum - nose) / (velum + nose); }