var invertObject = function (o) {
if (o.length) {
var ret = {};
for (var key = 0; key < o.length; key ++) {
ret[o[key]] = key;
}
} else {
var ret = {};
for (var key in o) {
ret[o[key]] = key;
}
}
return ret;
};
if (typeof(MusicTheory) === "undefined") MusicTheory = {};
(function() {
var root = MusicTheory;
// KEY SIGNATURES
root.key2number = {
'A': 0,
'A#': 1,
'Bb': 1,
'B': 2,
'C': 3,
'C#': 4,
'Db': 4,
'D': 5,
'D#': 6,
'Eb': 6,
'E': 7,
'F': 8,
'F#': 9,
'Gb': 9,
'G': 10,
'G#': 11,
'Ab': 11
};
root.number2float = {
0: 0,
1: 0.5,
2: 1,
3: 2,
4: 2.5,
5: 3,
6: 3.5,
7: 4,
8: 5,
9: 5.5,
10: 6,
11: 6.5,
12: 7
};
root.number2key = invertObject(root.key2number);
root.float2number = invertObject(root.number2float);
root.getKeySignature = function (key) {
var keys = [ 'A', 'AB', 'B', 'C', 'CD', 'D', 'DE', 'E', 'F', 'FG', 'G', 'GA' ];
var accidental = [ 'F', 'C', 'G', 'D', 'A', 'E', 'B' ];
var signature = { // key signatures
'Fb': -8,
'Cb': -7,
'Gb': -6,
'Db': -5,
'Ab': -4,
'Eb': -3,
'Bb': -2,
'F': -1,
'C': 0,
'G': 1,
'D': 2,
'A': 3,
'E': 4,
'B': 5,
'F#': 6,
'C#': 7,
'G#': 8,
'D#': 9,
'A#': 10,
'E#': 11,
'B#': 12
}[key];
if(signature < 0) { // flat
accidental = accidental.splice(7 + signature, -signature).reverse().join('');
} else { // sharp
accidental = accidental.splice(0, signature).join('');
}
for(var i = 0; i < keys.length; i ++) {
if (keys[i].length > 1) {
if (accidental.indexOf(keys[i][0]) != -1 || accidental.indexOf(keys[i][1]) != -1) {
if (signature > 0) {
keys[i] = keys[i][0] + '#';
} else {
keys[i] = keys[i][1] + 'b';
}
} else {
keys[i] = keys[i][0] + '#';
}
}
};
Piano.keySignature = keys;
};
//// TEMPO
root.tempoFromTap = function(that) {
function getName(v) {
var tempo = { // wikipedia
200: 'Prestissimo',
168: 'Presto',
140: 'Vivace',
120: 'Allegro',
112: 'Allegretto',
101: 'Moderato',
76: 'Andante',
66: 'Adagio',
60: 'Larghetto',
40: 'Lento',
0: 'Larghissimo'
};
for (var n = 0, name = ""; n < 250; n ++) {
if (tempo[n]) name = tempo[n];
if (v < n) return name;
}
return 'Prestissimo';
};
if (that.tap) {
var diff = (new Date()).getTime() - that.tap;
var c = 1 / (diff / 1000) * 60;
Piano.tempo = c;
console.log(getName(c), c, diff)
document.getElementById("taptap").value = (c>>0) +"bmp " + getName(c);
}
that.tap = (new Date()).getTime();
};
//// CHORD FINDER
root.findChord = function(r) {
function rewrite(o) {
var z = {};
for (var i in o) {
var r = {};
for (var ii in o[i]) {
r[o[i][ii]] = 1;
}
z[i] = r;
}
return z;
};
var test = {};
var values = "0 3".split(' ');
var chords = rewrite(Piano.chords);
for (var key in chords) {
for (var n = 0, length = values.length; n < length; n ++) {
if (isNaN(chords[key][values[n]])) {
test[key] = 1;
break;
}
}
}
var results = [];
for (var key in chords) {
if (!test[key]) results.push(key);
}
document.getElementById("find").value = results;
return results;
};
///// CHORD INFORMATION
root.scaleInfo = function(o) {
var intervalNames = [ 'r', 'b2', '2', 'b3', '3', '4', 'b5', '5', '♯5', '6', 'b7', '7', '8', 'b9', '9', '♯9', '10', '11', 'b12', '12', '♯12', '13' ]; // Interval numbers
var notes = '',
intervals = '',
gaps = '',
solfege = '',
// colors = '',
keys = '';
for (var i in o) {
if (o[i] > 0) {
gaps += '-' + (o[i] - key);
}
var key = o[i];
var note = Piano.calculateNote(key) % 12;
var noteName = Piano.keySignature[note];
var color = Piano.Color[Piano.HSL].english[note];
solfege += ', ' + MusicTheory.Solfege[noteName].syllable;
// colors += ', ' + (color[0] ? color[0].toUpperCase() + color.substr(1) : 'Undefined');
keys += ', ' + key;
notes += ', ' + noteName;
intervals += ', ' + intervalNames[key];
}
console.log(
'notes: ' + notes.substr(2) + '
' +
'solfege: ' + solfege.substr(2) + '
' +
'intervals: ' + intervals.substr(2) + '
' +
'keys: ' + keys.substr(2) + '
' +
'gaps: ' + gaps.substr(1)
);
};
})();