Created
November 25, 2019 09:31
-
-
Save bartwttewaall/eedff795b010057ae6edd350646124ae to your computer and use it in GitHub Desktop.
Conversion of midi note numbers to a linear scale so they can be drawn more easily. The testFrequency method show how to use it
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// get frequency from piano key number t | |
export function keyToFrequency(n, base = 440, keys = 12) { | |
return base * Math.pow(2, n / keys); | |
} | |
// get inverse frequency from piano key number t | |
export function keyToInverseFrequency(n, base = 440, keys = 12) { | |
return base * -Math.pow(2, -n / keys); | |
} | |
export function toBinaryString(dec) { | |
return (dec >>> 0).toString(2); | |
} | |
export function padLeft(input, amount) { | |
return amount - input.length > 0 ? Array(amount + 1 - input.length).join("0") + input : input; | |
} | |
export function testFrequency() { | |
// freq = 440 * Math.pow(2, n/12) | |
// get frequency from piano key number t | |
keyToFrequency = function(t, c = 440, d = 12) { | |
return c * Math.pow(2, t / d); | |
}; | |
// get inverse frequency from piano key number t | |
keyToInverseFrequency = function(t, c = 440, d = 12) { | |
return c * -Math.pow(2, -t / d); | |
}; | |
// add both together to get a linear curve | |
console.log(440 + keyToInverseFrequency(0)); // = 0 | |
const freq = { | |
49: 440, | |
50: 466.164, | |
51: 493.883, | |
52: 523.251, | |
53: 554.365, | |
54: 587.33, | |
55: 622.254, | |
56: 659.255, | |
57: 698.456, | |
58: 739.989, | |
59: 783.991, | |
60: 830.609, | |
61: 880 | |
}; | |
// console.log(440 * Math.pow(2, 0 / 12)); // = 440 | |
const A4noteNumber = 49; | |
console.log(keyToFrequency(0), freq[A4noteNumber + 0]); | |
console.log(keyToFrequency(1), freq[A4noteNumber + 1]); | |
console.log(keyToFrequency(2), freq[A4noteNumber + 2]); | |
console.log(keyToFrequency(3), freq[A4noteNumber + 3]); | |
console.log(keyToFrequency(4), freq[A4noteNumber + 4]); | |
console.log(keyToFrequency(5), freq[A4noteNumber + 5]); | |
console.log(keyToFrequency(6), freq[A4noteNumber + 6]); | |
console.log(keyToFrequency(7), freq[A4noteNumber + 7]); | |
console.log(keyToFrequency(8), freq[A4noteNumber + 8]); | |
console.log(keyToFrequency(9), freq[A4noteNumber + 9]); | |
console.log(keyToFrequency(10), freq[A4noteNumber + 10]); | |
console.log(keyToFrequency(11), freq[A4noteNumber + 11]); | |
console.log(keyToFrequency(12), freq[A4noteNumber + 12]); | |
// to linear | |
console.log(keyToInverseFrequency(0) + freq[A4noteNumber + 0]); | |
console.log(keyToInverseFrequency(1) + freq[A4noteNumber + 1]); | |
console.log(keyToInverseFrequency(2) + freq[A4noteNumber + 2]); | |
console.log(keyToInverseFrequency(3) + freq[A4noteNumber + 3]); | |
console.log(keyToInverseFrequency(4) + freq[A4noteNumber + 4]); | |
console.log(keyToInverseFrequency(5) + freq[A4noteNumber + 5]); | |
console.log(keyToInverseFrequency(6) + freq[A4noteNumber + 6]); | |
console.log(keyToInverseFrequency(7) + freq[A4noteNumber + 7]); | |
console.log(keyToInverseFrequency(8) + freq[A4noteNumber + 8]); | |
console.log(keyToInverseFrequency(9) + freq[A4noteNumber + 9]); | |
console.log(keyToInverseFrequency(10) + freq[A4noteNumber + 10]); | |
console.log(keyToInverseFrequency(11) + freq[A4noteNumber + 11]); | |
console.log(keyToInverseFrequency(12) + freq[A4noteNumber + 12]); | |
const note = { frequency: 880, noteNumber: 61 }; | |
const value = note.frequency + keyToInverseFrequency(note.noteNumber - A4noteNumber); | |
console.log(">>", value); // 660! | |
console.log(padLeft("", 3)); | |
console.log(padLeft("1", 3)); | |
console.log(padLeft("11", 3)); | |
console.log(padLeft("111", 3)); | |
console.log(padLeft("1111", 3)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment