Skip to content

Instantly share code, notes, and snippets.

@zz85
Created November 29, 2011 20:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zz85/1406293 to your computer and use it in GitHub Desktop.
Save zz85/1406293 to your computer and use it in GitHub Desktop.
midi number to frequency using Werckmeister I (III) temperament
// by https://github.com/zz85
// http://en.wikipedia.org/wiki/Werckmeister_temperament
// Werckmeister I (III): "correct temperament" based on 1/4 comma divisions
var werckmeister = [
1, // c
256/243, // c#
64 / 81 * Math.pow(2, 1/2), // d
32/27, // d#
256 / 243 * Math.pow(2, 1/4), // e
4/3, //f
1024 / 729, // f#
8/9 * Math.pow(8, 1/4), // g
128/81, // g#
1024 / 729 * Math.pow(2, 1/4), // a
16/9, // a#
128/ 81 * Math.pow(2, 1/4) // b
];
var baseCFrequency = 415 / werckmeister[9];
// midi number to frequency using werckmeister's tuning
function werckmeisterFrequency(midi) {
var middle_c_midi = 60;
var semitones, noteIndex, ocatve;
if (midi < middle_c_midi) {
semitones = middle_c_midi - midi;
noteIndex = semitones % 12;
if (noteIndex>0) noteIndex = 12 - noteIndex;
octave = -Math.ceil( semitones/12 );
} else {
semitones = midi - middle_c_midi;
noteIndex = semitones % 12;
octave = Math.floor( semitones/12 );
}
var freq = werckmeister [ noteIndex ] * Math.pow( 2, octave ) * baseCFrequency;
return freq;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment