update loadPlugin to support multiple instruments in WebAudioAPI and AudioTag
This commit is contained in:
parent
d53fe90663
commit
30c224b067
1 changed files with 123 additions and 64 deletions
|
@ -1,9 +1,14 @@
|
|||
/*
|
||||
-------------------------------------
|
||||
MIDI.loadPlugin(callback, type);
|
||||
-------------------------------------
|
||||
-----------------------------------------------------------
|
||||
MIDI.loadPlugin : 0.1 : 11/20/2012
|
||||
-----------------------------------------------------------
|
||||
https://github.com/mudx/MIDI.js
|
||||
-------------------------------------
|
||||
-----------------------------------------------------------
|
||||
MIDI.loadPlugin({
|
||||
instrument: "acoustic_grand_piano", // or 1 (default)
|
||||
instruments: [ "acoustic_grand_piano", "acoustic_guitar_nylon" ], // or multiple instruments
|
||||
callback: function() { }
|
||||
});
|
||||
*/
|
||||
|
||||
if (typeof (MIDI) === "undefined") var MIDI = {};
|
||||
|
@ -11,84 +16,138 @@ if (typeof (MIDI.Soundfont) === "undefined") MIDI.Soundfont = {};
|
|||
|
||||
(function() { "use strict";
|
||||
|
||||
var plugins = { "#webaudio": true, "#html5": true, "#java": true, "#flash": true };
|
||||
|
||||
MIDI.loadPlugin = function(callback, instrument) {
|
||||
var type = "";
|
||||
var instrument = instrument || "";
|
||||
MIDI.loadPlugin = function(conf) {
|
||||
if (typeof(conf) === "function") conf = { callback: conf };
|
||||
/// Get the instrument name.
|
||||
var instruments = conf.instruments || conf.instrument || "acoustic_grand_piano";
|
||||
if (typeof(instruments) !== "object") instruments = [ instruments ];
|
||||
instruments.map(function(data) {
|
||||
if (typeof(data) === "number") data = MIDI.GeneralMIDI.byId[data];
|
||||
MIDI.Soundfont[data] = true;
|
||||
return data;
|
||||
});
|
||||
/// Detect the best type of audio to use.
|
||||
MIDI.audioDetect(function(types) {
|
||||
var type = "";
|
||||
// use the most appropriate plugin if not specified
|
||||
if (typeof(type) === 'undefined') {
|
||||
if (plugins[window.location.hash]) {
|
||||
type = window.location.hash;
|
||||
} else {
|
||||
type = window.location.hash.substr(1);
|
||||
} else { //
|
||||
type = "";
|
||||
}
|
||||
}
|
||||
if (type === "") {
|
||||
if (window.webkitAudioContext) { // Chrome
|
||||
type = "#webaudio";
|
||||
type = "webaudio";
|
||||
} else if (window.Audio) { // Firefox
|
||||
type = "#html5";
|
||||
type = "audiotag";
|
||||
} else { // Internet Explorer
|
||||
type = "#flash";
|
||||
type = "flash";
|
||||
}
|
||||
}
|
||||
if (typeof(loader) === "undefined") var loader;
|
||||
if (!connect[type]) return;
|
||||
// use audio/ogg when supported
|
||||
var filetype = types["audio/ogg"] ? "ogg" : "mp3";
|
||||
// load the specified plugin
|
||||
switch (type) {
|
||||
case "#java":
|
||||
// works well cross-browser, and highly featured, but required Java machine to startup
|
||||
if (loader) loader.message("Soundfont (500KB)<br>Java Interface...");
|
||||
MIDI.Java.connect(callback);
|
||||
break;
|
||||
case "#flash":
|
||||
// fairly quick, but requires loading of individual MP3s
|
||||
if (loader) loader.message("Soundfont (2MB)<br>Flash Interface...");
|
||||
DOMLoader.script.add({
|
||||
src: "./inc/SoundManager2/script/soundmanager2.js",
|
||||
verify: "SoundManager",
|
||||
callback: function () {
|
||||
MIDI.Flash.connect(callback);
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "#html5":
|
||||
// works well in Firefox
|
||||
DOMLoader.sendRequest({
|
||||
url: "./soundfont/soundfont-" + filetype + instrument + ".js",
|
||||
onload: function (response) {
|
||||
MIDI.Soundfont = JSON.parse(response.responseText);
|
||||
if (loader) loader.message("Downloading: 100%<br>Processing...");
|
||||
MIDI.HTML5.connect(callback);
|
||||
},
|
||||
onprogress: function (evt) {
|
||||
var percent = evt.loaded / 1719931 * 100 >> 0;
|
||||
if (loader) loader.message("Downloading: " + (percent + "%"));
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "#webaudio":
|
||||
// works well in Chrome
|
||||
DOMLoader.sendRequest({
|
||||
url: "./soundfont/soundfont-" + filetype + instrument + ".js",
|
||||
onload: function(response) {
|
||||
MIDI.Soundfont = JSON.parse(response.responseText);
|
||||
if (loader) loader.message("Downloading: 100%<br>Processing...");
|
||||
MIDI.WebAudioAPI.connect(callback);
|
||||
},
|
||||
onprogress: function (evt) {
|
||||
var percent = evt.loaded / 1719931 * 100 >> 0;
|
||||
if (loader) loader.message("Downloading: " + (percent + "%"));
|
||||
}
|
||||
});
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
connect[type](filetype, instruments, conf.callback);
|
||||
});
|
||||
};
|
||||
|
||||
///
|
||||
|
||||
var connect = {};
|
||||
|
||||
connect.java = function(filetype, instruments, callback) {
|
||||
// works well cross-browser, and fully featured, but has delay when Java machine starts.
|
||||
if (typeof(loader) === "undefined") var loader;
|
||||
if (loader) loader.message("Soundfont (500KB)<br>Java Interface...");
|
||||
MIDI.Java.connect(callback);
|
||||
};
|
||||
|
||||
connect.flash = function(filetype, instruments, callback) {
|
||||
// fairly quick, but requires loading of individual MP3s (more http requests).
|
||||
if (typeof(loader) === "undefined") var loader;
|
||||
if (loader) loader.message("Soundfont (2MB)<br>Flash Interface...");
|
||||
DOMLoader.script.add({
|
||||
src: "./inc/SoundManager2/script/soundmanager2.js",
|
||||
verify: "SoundManager",
|
||||
callback: function () {
|
||||
MIDI.Flash.connect(callback);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
connect.audiotag = function(filetype, instruments, callback) {
|
||||
// works ok, kinda like a drunken tuna fish, across the board.
|
||||
if (typeof(loader) === "undefined") var loader;
|
||||
var queue = createQueue({
|
||||
items: instruments,
|
||||
getNext: function(instrumentId) {
|
||||
DOMLoader.sendRequest({
|
||||
url: "./soundfont/" + instrumentId + "-" + filetype + ".js",
|
||||
onload: function (response) {
|
||||
MIDI.Soundfont[instrumentId] = JSON.parse(response.responseText);
|
||||
if (loader) loader.message("Downloading", 100);
|
||||
queue.getNext();
|
||||
},
|
||||
onprogress: function (evt) {
|
||||
var percent = Math.round(evt.loaded / evt.total * 100);
|
||||
if (loader) loader.message("Downloading", percent);
|
||||
}
|
||||
});
|
||||
},
|
||||
onComplete: function() {
|
||||
MIDI.AudioTag.connect(callback);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
connect.webaudio = function(filetype, instruments, callback) {
|
||||
// works awesome! safari and chrome support
|
||||
var queue = createQueue({
|
||||
items: instruments,
|
||||
getNext: function(instrumentId) {
|
||||
DOMLoader.sendRequest({
|
||||
url: "./soundfont/" + instrumentId + "-" + filetype + ".js",
|
||||
onload: function(response) {
|
||||
MIDI.Soundfont[instrumentId] = JSON.parse(response.responseText);
|
||||
if (loader) loader.message("Downloading", 100);
|
||||
queue.getNext();
|
||||
},
|
||||
onprogress: function (evt) {
|
||||
var percent = Math.round(evt.loaded / evt.total * 100);
|
||||
if (loader) loader.message("Downloading", percent);
|
||||
}
|
||||
});
|
||||
},
|
||||
onComplete: function() {
|
||||
MIDI.WebAudioAPI.connect(callback);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/// Helpers
|
||||
|
||||
var plugins = {
|
||||
"#webaudio": true,
|
||||
"#audiotag": true,
|
||||
"#java": true,
|
||||
"#flash": true
|
||||
};
|
||||
|
||||
var createQueue = function(conf) {
|
||||
var self = {};
|
||||
self.queue = [];
|
||||
for (var key in conf.items) {
|
||||
self.queue.push(conf.items[key]);
|
||||
}
|
||||
self.getNext = function() {
|
||||
if (!self.queue.length) return conf.onComplete();
|
||||
conf.getNext(self.queue.shift());
|
||||
};
|
||||
setTimeout(self.getNext, 1);
|
||||
return self;
|
||||
};
|
||||
|
||||
})();
|
Loading…
Add table
Add a link
Reference in a new issue