Skip to content

Instantly share code, notes, and snippets.

@bartwttewaall
Created November 25, 2019 09:31
Show Gist options
  • Save bartwttewaall/eedff795b010057ae6edd350646124ae to your computer and use it in GitHub Desktop.
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
// 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