This commit is contained in:
Michael Deal 2013-01-25 00:12:33 -08:00
parent 80a033f09b
commit 6982683d49
2 changed files with 109 additions and 123 deletions

View file

@ -552,7 +552,9 @@ MIDI.loadPlugin = function(conf) {
} }
} }
if (type === "") { if (type === "") {
if (window.webkitAudioContext) { // Chrome if (navigator.requestMIDIAccess) {
type = "webmidi";
} else if (window.webkitAudioContext) { // Chrome
type = "webaudio"; type = "webaudio";
} else if (window.Audio) { // Firefox } else if (window.Audio) { // Firefox
type = "audiotag"; type = "audiotag";
@ -572,10 +574,9 @@ MIDI.loadPlugin = function(conf) {
var connect = {}; var connect = {};
connect.java = function(filetype, instruments, callback) { connect.webmidi = function(filetype, instruments, callback) {
// works well cross-browser, and fully featured, but has delay when Java machine starts. if (MIDI.loader) MIDI.loader.message("Web MIDI API...");
if (MIDI.loader) MIDI.loader.message("Java API..."); MIDI.WebMIDI.connect(callback);
MIDI.Java.connect(callback);
}; };
connect.flash = function(filetype, instruments, callback) { connect.flash = function(filetype, instruments, callback) {
@ -659,9 +660,9 @@ connect.webaudio = function(filetype, instruments, callback) {
/// Helpers /// Helpers
var plugins = { var plugins = {
"#webmidi": true,
"#webaudio": true, "#webaudio": true,
"#audiotag": true, "#audiotag": true,
"#java": true,
"#flash": true "#flash": true
}; };
@ -976,28 +977,106 @@ var stopAudio = function () {
})(); })();
/* /*
-------------------------------------------- --------------------------------------------
MIDI.Plugin : 0.3 : 11/20/2012 MIDI.Plugin : 0.3.2 : 2013/01/24
-------------------------------------------- --------------------------------------------
https://github.com/mudcube/MIDI.js https://github.com/mudcube/MIDI.js
-------------------------------------------- --------------------------------------------
APIs:
MIDI.WebMIDIAPI
MIDI.WebAudioAPI MIDI.WebAudioAPI
MIDI.Flash MIDI.Flash
MIDI.HTML5 MIDI.HTML5
--------------------------------------------
Helpers:
MIDI.GeneralMIDI MIDI.GeneralMIDI
MIDI.channels MIDI.channels
MIDI.keyToNote MIDI.keyToNote
MIDI.noteToKey MIDI.noteToKey
--------------------------------------------
setMute?
getInstruments?
-------------------------------------
*/ */
if (typeof (MIDI) === "undefined") var MIDI = {}; if (typeof (MIDI) === "undefined") var MIDI = {};
if (typeof (MIDI.Plugin) === "undefined") MIDI.Plugin = {};
(function() { "use strict"; (function() { "use strict";
/*
--------------------------------------------
Web MIDI API - Native Soundbank
--------------------------------------------
https://dvcs.w3.org/hg/audio/raw-file/tip/midi/specification.html
*/
(function () {
var plugin = null;
var output = null;
var channels = [];
var root = MIDI.WebMIDI = {};
root.setVolume = function (channel, volume) { // set channel volume
output.send([0xB0 + channel, 0x07, volume]);
};
root.programChange = function (channel, program) { // change channel instrument
output.send([0xC0 + channel, program]);
};
root.noteOn = function (channel, note, velocity, delay) {
output.send([0x90 + channel, note, velocity], delay * 1000);
};
root.noteOff = function (channel, note, delay) {
output.send([0x80 + channel, note], delay * 1000);
};
root.chordOn = function (channel, chord, velocity, delay) {
for (var n = 0; n < chord.length; n ++) {
var note = chord[n];
output.send([0x90 + channel, note, velocity], delay * 1000);
}
};
root.chordOff = function (channel, chord, delay) {
for (var n = 0; n < chord.length; n ++) {
var note = chord[n];
output.send([0x80, channel, note, velocity], delay * 1000);
}
};
root.stopAllNotes = function () {
for (var channel = 0; channel < 16; channel ++) {
output.send([0xB0 + channel, 0x7B, 0]);
}
};
root.getInput = function () {
return plugin.getInputs();
};
root.getOutputs = function () {
return plugin.getOutputs();
};
root.connect = function (callback) {
MIDI.technology = "Web MIDI API";
MIDI.setVolume = root.setVolume;
MIDI.programChange = root.programChange;
MIDI.noteOn = root.noteOn;
MIDI.noteOff = root.noteOff;
MIDI.chordOn = root.chordOn;
MIDI.chordOff = root.chordOff;
MIDI.stopAllNotes = root.stopAllNotes;
MIDI.getInput = root.getInput;
MIDI.getOutputs = root.getOutputs;
navigator.requestMIDIAccess(function (access) {
plugin = access;
output = plugin.getOutput(0);
if (callback) callback();
}, function (err) {
console.log("uh-oh! Something went wrong! Error code: " + err.code );
});
};
})();
/* /*
-------------------------------------------- --------------------------------------------
Web Audio API - OGG or MPEG Soundbank Web Audio API - OGG or MPEG Soundbank
@ -1073,14 +1152,6 @@ if (window.AudioContext || window.webkitAudioContext) (function () {
return source; return source;
}; };
root.chordOn = function (channel, chord, velocity, delay) {
var ret = {}, note;
for (var n = 0, length = chord.length; n < length; n++) {
ret[note = chord[n]] = root.noteOn(channel, note, velocity, delay);
}
return ret;
};
// FIX: needs some way to fade out smoothly.. // FIX: needs some way to fade out smoothly..
// POSSIBLE FIX: fade out smoothly using gain and ramping to value // POSSIBLE FIX: fade out smoothly using gain and ramping to value
root.noteOff = function (channel, note, delay) { root.noteOff = function (channel, note, delay) {
@ -1093,6 +1164,14 @@ if (window.AudioContext || window.webkitAudioContext) (function () {
return source; return source;
}; };
root.chordOn = function (channel, chord, velocity, delay) {
var ret = {}, note;
for (var n = 0, length = chord.length; n < length; n++) {
ret[note = chord[n]] = root.noteOn(channel, note, velocity, delay);
}
return ret;
};
root.chordOff = function (channel, chord, delay) { root.chordOff = function (channel, chord, delay) {
var ret = {}, note; var ret = {}, note;
for (var n = 0, length = chord.length; n < length; n++) { for (var n = 0, length = chord.length; n < length; n++) {
@ -1102,7 +1181,7 @@ if (window.AudioContext || window.webkitAudioContext) (function () {
}; };
root.connect = function (callback) { root.connect = function (callback) {
MIDI.lang = 'WebAudioAPI'; MIDI.technology = "Web Audio API";
MIDI.setVolume = root.setVolume; MIDI.setVolume = root.setVolume;
MIDI.programChange = root.programChange; MIDI.programChange = root.programChange;
MIDI.noteOn = root.noteOn; MIDI.noteOn = root.noteOn;
@ -1129,7 +1208,6 @@ if (window.AudioContext || window.webkitAudioContext) (function () {
} }
} }
}; };
})(); })();
/* /*
@ -1216,7 +1294,7 @@ if (window.Audio) (function () {
id: key id: key
}; };
} }
MIDI.lang = 'AudioTag'; MIDI.technology = "HTML Audio Tag";
MIDI.setVolume = root.setVolume; MIDI.setVolume = root.setVolume;
MIDI.programChange = root.programChange; MIDI.programChange = root.programChange;
MIDI.noteOn = root.noteOn; MIDI.noteOn = root.noteOn;
@ -1324,7 +1402,7 @@ if (window.Audio) (function () {
} }
} }
/// ///
MIDI.lang = 'Flash'; MIDI.technology = "Flash";
MIDI.setVolume = root.setVolume; MIDI.setVolume = root.setVolume;
MIDI.programChange = root.programChange; MIDI.programChange = root.programChange;
MIDI.noteOn = root.noteOn; MIDI.noteOn = root.noteOn;
@ -1347,98 +1425,6 @@ if (window.Audio) (function () {
}; };
})(); })();
/*
--------------------------------------------
Java - Native Soundbank
--------------------------------------------
https://github.com/abudaan/midibridge-js
http://java.sun.com/products/java-media/sound/soundbanks.html
--------------------------------------------
*/
(function () {
var root = MIDI.Java = {};
root.connect = function (callback) {
// deferred loading of <applet>
MIDI.Plugin = false;
if (!window.navigator.javaEnabled()) {
MIDI.Flash.connect(callback);
return;
}
MIDI.Java.callback = callback;
var iframe = document.createElement('iframe');
iframe.name = 'MIDIFrame';
iframe.src = 'inc/midibridge/index.html';
iframe.width = 1;
iframe.height = 1;
document.body.appendChild(iframe);
};
root.confirm = function (plugin) {
MIDI.programChange = function (channel, program) {
plugin.sendMidiEvent(0xC0, channel, program, 0);
};
MIDI.setVolume = function (n) {
};
MIDI.noteOn = function (channel, note, velocity, delay) {
if (delay) {
var interval = window.setTimeout(function() {
plugin.sendMidiEvent(0x90, channel, note, velocity);
}, delay * 1000);
return interval;
} else {
plugin.sendMidiEvent(0x90, channel, note, velocity);
}
};
MIDI.noteOff = function (channel, note, delay) {
if (delay) {
var interval = window.setTimeout(function() {
plugin.sendMidiEvent(0x80, channel, note, 0);
}, delay * 1000);
return interval;
} else {
plugin.sendMidiEvent(0x80, channel, note, 0);
}
};
MIDI.chordOn = function (channel, chord, velocity, delay) {
for (var key in chord) {
var n = chord[key];
plugin.sendMidiEvent(0x90, channel, n, 100);
}
};
MIDI.chordOff = function (channel, chord, delay) {
for (var key in chord) {
var n = chord[key];
plugin.sendMidiEvent(0x80, channel, n, 100);
}
};
MIDI.stopAllNotes = function () {
};
MIDI.getInstruments = function() {
return [];
};
if (plugin.ready) {
MIDI.lang = "Java";
if (MIDI.Java.callback) {
MIDI.Java.callback();
}
} else {
MIDI.Flash.connect(MIDI.Java.callback);
}
};
})();
/* /*
helper functions helper functions
*/ */

2
build/MIDI.min.js vendored

File diff suppressed because one or more lines are too long