frequency conversion
javascript
a month ago
3.7 kB
2
Indexable
Never
var convert = function () { document.getElementById("result").innerHTML = "<font face=\"Geneva, Arial, Helvetica, sans-serif\">" + frequencyToNote() + "</font>"; } var frequencyToNote = function () { var input = Number(document.getElementById("frequency").value); if(isNaN(input) || (input == 0)) return "<font color=\"red\">Enter a numerical value for frequency</font>"; if((input < 27.5) || (input > 14080)) return "<font color=\"red\">Enter a frequency in the range 27.5Hz (A0) and 14080Hz (A9)</font>"; var A4 = 440.0; var A4_INDEX = 57; var notes = [ "C0","C#0","D0","D#0","E0","F0","F#0","G0","G#0","A0","A#0","B0", "C1","C#1","D1","D#1","E1","F1","F#1","G1","G#1","A1","A#1","B1", "C2","C#2","D2","D#2","E2","F2","F#2","G2","G#2","A2","A#2","B2", "C3","C#3","D3","D#3","E3","F3","F#3","G3","G#3","A3","A#3","B3", "C4","C#4","D4","D#4","E4","F4","F#4","G4","G#4","A4","A#4","B4", "C5","C#5","D5","D#5","E5","F5","F#5","G5","G#5","A5","A#5","B5", "C6","C#6","D6","D#6","E6","F6","F#6","G6","G#6","A6","A#6","B6", "C7","C#7","D7","D#7","E7","F7","F#7","G7","G#7","A7","A#7","B7", "C8","C#8","D8","D#8","E8","F8","F#8","G8","G#8","A8","A#8","B8", "C9","C#9","D9","D#9","E9","F9","F#9","G9","G#9","A9","A#9","B9" ]; var MINUS = 0; var PLUS = 1; var frequency; var r = Math.pow(2.0, 1.0/12.0); var cent = Math.pow(2.0, 1.0/1200.0); var r_index = 0; var cent_index = 0; var side; frequency = A4; if(input >= frequency) { while(input >= r*frequency) { frequency = r*frequency; r_index++; } while(input > cent*frequency) { frequency = cent*frequency; cent_index++; } if((cent*frequency - input) < (input - frequency)) cent_index++; if(cent_index > 50) { r_index++; cent_index = 100 - cent_index; if(cent_index != 0) side = MINUS; else side = PLUS; } else side = PLUS; } else { while(input <= frequency/r) { frequency = frequency/r; r_index--; } while(input < frequency/cent) { frequency = frequency/cent; cent_index++; } if((input - frequency/cent) < (frequency - input)) cent_index++; if(cent_index >= 50) { r_index--; cent_index = 100 - cent_index; side = PLUS; } else { if(cent_index != 0) side = MINUS; else side = PLUS; } } var result = notes[A4_INDEX + r_index]; if(side == PLUS) result = result + " plus "; else result = result + " minus "; result = result + cent_index + " cents"; return result; }