keys-to-frequencies.js
· 1.2 KiB · JavaScript
Raw
////
/// Return a frequency based on piano key
/// @param {Number} key [49]
/// @return {Number} frequency
////
const getFrequencyFromKey = (key = 49) => {
return 2 ** ((key - 49) / 12) * 440;
};
////
/// Convert a string-based key to a number-based key
////
const convertKeyStringToNumber = (key = "C4") => {
let series = key.match(/\d/g)[0];
let notes = ["A", "A#Bb", "B", "C", "C#Db", "D", "D#Eb", "E", "F", "F#Gb", "G", "G#Ab"];
let note = key.replace(/\d/g, '');
return (note.match(/[AB]/) ? series : series - 1) * 12 + notes.indexOf(note) + 1;
};
////
/// Return an array of frequencies from a starting key, array of semitone
/// intervals, and number of keys to convert.
/// @param {Number} keyStart [41] Middle C
/// @param {Array} keyIntervals [[0]]
/// @param {Number} keyCount [1]
/// @return {Array} frequencies
////
const getFrequenciesFromKeys = (keyStart = 41, keyIntervals = [0], keyCount = 1) => {
let frequencies = [getFrequencyFromKey(keyStart)];
let keyInterval = 0;
for (let count = 1; count < keyCount; count++) {
keyInterval += Number.parseFloat(keyIntervals[count % keyIntervals.length]);
frequencies.push(getFrequencyFromKey(keyStart + keyInterval));
}
return frequencies;
};
| 1 | //// |
| 2 | /// Return a frequency based on piano key |
| 3 | /// @param {Number} key [49] |
| 4 | /// @return {Number} frequency |
| 5 | //// |
| 6 | const getFrequencyFromKey = (key = 49) => { |
| 7 | return 2 ** ((key - 49) / 12) * 440; |
| 8 | }; |
| 9 | |
| 10 | //// |
| 11 | /// Convert a string-based key to a number-based key |
| 12 | //// |
| 13 | const convertKeyStringToNumber = (key = "C4") => { |
| 14 | let series = key.match(/\d/g)[0]; |
| 15 | let notes = ["A", "A#Bb", "B", "C", "C#Db", "D", "D#Eb", "E", "F", "F#Gb", "G", "G#Ab"]; |
| 16 | let note = key.replace(/\d/g, ''); |
| 17 | |
| 18 | return (note.match(/[AB]/) ? series : series - 1) * 12 + notes.indexOf(note) + 1; |
| 19 | }; |
| 20 | |
| 21 | //// |
| 22 | /// Return an array of frequencies from a starting key, array of semitone |
| 23 | /// intervals, and number of keys to convert. |
| 24 | /// @param {Number} keyStart [41] Middle C |
| 25 | /// @param {Array} keyIntervals [[0]] |
| 26 | /// @param {Number} keyCount [1] |
| 27 | /// @return {Array} frequencies |
| 28 | //// |
| 29 | const getFrequenciesFromKeys = (keyStart = 41, keyIntervals = [0], keyCount = 1) => { |
| 30 | let frequencies = [getFrequencyFromKey(keyStart)]; |
| 31 | let keyInterval = 0; |
| 32 | |
| 33 | for (let count = 1; count < keyCount; count++) { |
| 34 | keyInterval += Number.parseFloat(keyIntervals[count % keyIntervals.length]); |
| 35 | frequencies.push(getFrequencyFromKey(keyStart + keyInterval)); |
| 36 | } |
| 37 | |
| 38 | return frequencies; |
| 39 | }; |
| 40 |