summaryrefslogtreecommitdiffstats
path: root/Processing-js/libs/js/MIDI/LoadPlugin.js
diff options
context:
space:
mode:
Diffstat (limited to 'Processing-js/libs/js/MIDI/LoadPlugin.js')
-rw-r--r--Processing-js/libs/js/MIDI/LoadPlugin.js179
1 files changed, 179 insertions, 0 deletions
diff --git a/Processing-js/libs/js/MIDI/LoadPlugin.js b/Processing-js/libs/js/MIDI/LoadPlugin.js
new file mode 100644
index 0000000..dad5cbd
--- /dev/null
+++ b/Processing-js/libs/js/MIDI/LoadPlugin.js
@@ -0,0 +1,179 @@
+/*
+ -----------------------------------------------------------
+ MIDI.loadPlugin : 0.1.2 : 01/22/2014
+ -----------------------------------------------------------
+ https://github.com/mudcube/MIDI.js
+ -----------------------------------------------------------
+ MIDI.loadPlugin({
+ targetFormat: "mp3", // optionally can force to use MP3 (for instance on mobile networks)
+ 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 = {};
+if (typeof (MIDI.Soundfont) === "undefined") MIDI.Soundfont = {};
+
+(function() { "use strict";
+
+var USE_JAZZMIDI = false; // Turn on to support JazzMIDI Plugin
+
+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 ];
+ ///
+ for (var n = 0; n < instruments.length; n ++) {
+ var instrument = instruments[n];
+ if (typeof(instrument) === "number") {
+ instruments[n] = MIDI.GeneralMIDI.byId[instrument];
+ }
+ };
+ ///
+ MIDI.soundfontUrl = conf.soundfontUrl || MIDI.soundfontUrl || "./soundfont/";
+ /// Detect the best type of audio to use.
+ MIDI.audioDetect(function(types) {
+ var api = "";
+ // use the most appropriate plugin if not specified
+ if (apis[conf.api]) {
+ api = conf.api;
+ } else if (apis[window.location.hash.substr(1)]) {
+ api = window.location.hash.substr(1);
+ } else if (USE_JAZZMIDI && navigator.requestMIDIAccess) {
+ api = "webmidi";
+ } else if (window.webkitAudioContext || window.AudioContext) { // Chrome
+ api = "webaudio";
+ } else if (window.Audio) { // Firefox
+ api = "audiotag";
+ } else { // Internet Explorer
+ api = "flash";
+ }
+ ///
+ if (!connect[api]) return;
+ // use audio/ogg when supported
+ if (conf.targetFormat) {
+ var filetype = conf.targetFormat;
+ } else { // use best quality
+ var filetype = types["audio/ogg"] ? "ogg" : "mp3";
+ }
+ // load the specified plugin
+ MIDI.lang = api;
+ MIDI.supports = types;
+ connect[api](filetype, instruments, conf);
+ });
+};
+
+///
+
+var connect = {};
+
+connect.webmidi = function(filetype, instruments, conf) {
+ if (MIDI.loader) MIDI.loader.message("Web MIDI API...");
+ MIDI.WebMIDI.connect(conf);
+};
+
+connect.flash = function(filetype, instruments, conf) {
+ // fairly quick, but requires loading of individual MP3s (more http requests).
+ if (MIDI.loader) MIDI.loader.message("Flash API...");
+ DOMLoader.script.add({
+ src: conf.soundManagerUrl || "./inc/SoundManager2/script/soundmanager2.js",
+ verify: "SoundManager",
+ callback: function () {
+ MIDI.Flash.connect(instruments, conf);
+ }
+ });
+};
+
+connect.audiotag = function(filetype, instruments, conf) {
+ if (MIDI.loader) MIDI.loader.message("HTML5 Audio API...");
+ // works ok, kinda like a drunken tuna fish, across the board.
+ var queue = createQueue({
+ items: instruments,
+ getNext: function(instrumentId) {
+ DOMLoader.sendRequest({
+ url: MIDI.soundfontUrl + instrumentId + "-" + filetype + ".js",
+ onprogress: getPercent,
+ onload: function (response) {
+ addSoundfont(response.responseText);
+ if (MIDI.loader) MIDI.loader.update(null, "Downloading", 100);
+ queue.getNext();
+ }
+ });
+ },
+ onComplete: function() {
+ MIDI.AudioTag.connect(conf);
+ }
+ });
+};
+
+connect.webaudio = function(filetype, instruments, conf) {
+ if (MIDI.loader) MIDI.loader.message("Web Audio API...");
+ // works awesome! safari, chrome and firefox support.
+ var queue = createQueue({
+ items: instruments,
+ getNext: function(instrumentId) {
+ DOMLoader.sendRequest({
+ url: MIDI.soundfontUrl + instrumentId + "-" + filetype + ".js",
+ onprogress: getPercent,
+ onload: function(response) {
+ addSoundfont(response.responseText);
+ if (MIDI.loader) MIDI.loader.update(null, "Downloading...", 100);
+ queue.getNext();
+ }
+ });
+ },
+ onComplete: function() {
+ MIDI.WebAudio.connect(conf);
+ }
+ });
+};
+
+/// Helpers
+
+var apis = {
+ "webmidi": true,
+ "webaudio": true,
+ "audiotag": true,
+ "flash": true
+};
+
+var addSoundfont = function(text) {
+ var script = document.createElement("script");
+ script.language = "javascript";
+ script.type = "text/javascript";
+ script.text = text;
+ document.body.appendChild(script);
+};
+
+var getPercent = function(event) {
+ if (!this.totalSize) {
+ if (this.getResponseHeader("Content-Length-Raw")) {
+ this.totalSize = parseInt(this.getResponseHeader("Content-Length-Raw"));
+ } else {
+ this.totalSize = event.total;
+ }
+ }
+ ///
+ var percent = this.totalSize ? Math.round(event.loaded / this.totalSize * 100) : "";
+ if (MIDI.loader) MIDI.loader.update(null, "Downloading...", percent);
+};
+
+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;
+};
+
+})(); \ No newline at end of file