/// <summary> /// Gets the distance between the played frequency to the open note by percentage. /// </summary> /// <param name="twoClosestOpenNotes">The two closest open notes to the frequency.</param> /// <param name="closestNote">The most closest note, out of the two closest notes, /// which will be used as a reference to calculate the difference between this and the playedFrequency.</param> /// <param name="playedFrequency">The note that the user hits translated to frequency [Hz].</param> /// <returns>How close the users' frequency is from the desired note.</returns> private NoteDifference CalculateRatioOfCloseness(UpperAndLowerNotes twoClosestOpenNotes, Note closestNote, Hz playedFrequency) { float closenessToMark; //Closeness to the exact note mark. Number between 0 and 1. NoteDifference noteDiff = new NoteDifference(); //Represents how close the frequency is from the closestNote. float difference = Math.Abs(playedFrequency - closestNote.Hertz); float middleOfTwoOpenNotes = Math.Abs(twoClosestOpenNotes.Upper.Hertz - twoClosestOpenNotes.Lower.Hertz) / 2; if (middleOfTwoOpenNotes != 0) //Calculate the closness to the closestNote. closenessToMark = difference / middleOfTwoOpenNotes; //FIX: Why is that? else closenessToMark = difference; //Calculate the alpha (opacity) of the note indicator. //noteDiff.ClosnessAlpha = NoteDifference.FULL_ALPHA - closenessToMark; //Calculate the closness by a precentage of base 90. noteDiff.ClosnessByPercentage_Base90 = closenessToMark * 90; //FIX: This is not a precentage! noteDiff.ClosestNote = closestNote.Name; if (playedFrequency < closestNote.Hertz) { //from -90 to 0 degrees. noteDiff.ClosnessByPercentage_Base90 *= (-1); //if (closestNote.Alias != null) // noteDiff.ClosestNote = closestNote.Alias; } return noteDiff; }
/// <summary> /// Finds the two closest open chord notes (as shown at NoteFrequencyFilter description) /// of the played frequency. /// </summary> /// <param name="playedFrequency">The frequency the user played.</param> /// <returns>Returns the two closest open chord notes, /// unless the playedFrequency is above the highest open string frequency, /// or below the lowest open string frequency, /// in that case it will return the same value for both.</returns> private UpperAndLowerNotes GetTwoClosestOpenNotes(Hz playedFrequency) { UpperAndLowerNotes twoClosestOpenNotes = new UpperAndLowerNotes(Notes.LowerLimit, Notes.UpperLimit); if (playedFrequency <= OpenStringNotes.E2.Hertz) { twoClosestOpenNotes.Lower = Notes.LowerLimit; twoClosestOpenNotes.Upper = OpenStringNotes.E2; } else if (playedFrequency > OpenStringNotes.E2.Hertz && playedFrequency <= OpenStringNotes.A2.Hertz) { twoClosestOpenNotes.Lower = OpenStringNotes.E2; twoClosestOpenNotes.Upper = OpenStringNotes.A2; } else if (playedFrequency > OpenStringNotes.A2.Hertz && playedFrequency <= OpenStringNotes.D3.Hertz) { twoClosestOpenNotes.Lower = OpenStringNotes.A2; twoClosestOpenNotes.Upper = OpenStringNotes.D3; } else if (playedFrequency > OpenStringNotes.D3.Hertz && playedFrequency <= OpenStringNotes.G3.Hertz) { twoClosestOpenNotes.Lower = OpenStringNotes.D3; twoClosestOpenNotes.Upper = OpenStringNotes.G3; } else if (playedFrequency > OpenStringNotes.G3.Hertz && playedFrequency <= OpenStringNotes.B3.Hertz) { twoClosestOpenNotes.Lower = OpenStringNotes.G3; twoClosestOpenNotes.Upper = OpenStringNotes.B3; } else if (playedFrequency > OpenStringNotes.B3.Hertz && playedFrequency <= OpenStringNotes.E4.Hertz) { twoClosestOpenNotes.Lower = OpenStringNotes.B3; twoClosestOpenNotes.Upper = OpenStringNotes.E4; } else if (playedFrequency > OpenStringNotes.E4.Hertz) { twoClosestOpenNotes.Lower = OpenStringNotes.E4; twoClosestOpenNotes.Upper = Notes.UpperLimit; } return twoClosestOpenNotes; }
/// <summary> /// Find the single open note which is closest to the frequency. /// </summary> /// <param name="twoClosestOpenNotes">The two open notes that the frequency is between them.</param> /// <param name="frequency">The given frequency.</param> /// <returns>Retruns the main note that is being tuned to.</returns> private Note FindClosestOpenNote(UpperAndLowerNotes twoClosestOpenNotes, Hz frequency) { if ((twoClosestOpenNotes.Upper.Hertz - frequency) < (frequency - twoClosestOpenNotes.Lower.Hertz)) return twoClosestOpenNotes.Upper; else return twoClosestOpenNotes.Lower; }