summaryrefslogtreecommitdiff
path: root/src/http/static/trading-in-the-rain/MIDI.js/js/midi/plugin.audiotag.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/static/trading-in-the-rain/MIDI.js/js/midi/plugin.audiotag.js')
-rw-r--r--src/http/static/trading-in-the-rain/MIDI.js/js/midi/plugin.audiotag.js150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/http/static/trading-in-the-rain/MIDI.js/js/midi/plugin.audiotag.js b/src/http/static/trading-in-the-rain/MIDI.js/js/midi/plugin.audiotag.js
new file mode 100644
index 0000000..ec361c6
--- /dev/null
+++ b/src/http/static/trading-in-the-rain/MIDI.js/js/midi/plugin.audiotag.js
@@ -0,0 +1,150 @@
+/*
+ ----------------------------------------------------------------------
+ AudioTag <audio> - OGG or MPEG Soundbank
+ ----------------------------------------------------------------------
+ http://dev.w3.org/html5/spec/Overview.html#the-audio-element
+ ----------------------------------------------------------------------
+*/
+
+(function(root) { 'use strict';
+
+ window.Audio && (function() {
+ var midi = root.AudioTag = { api: 'audiotag' };
+ var noteToKey = {};
+ var volume = 127; // floating point
+ var buffer_nid = -1; // current channel
+ var audioBuffers = []; // the audio channels
+ var notesOn = []; // instrumentId + noteId that is currently playing in each 'channel', for routing noteOff/chordOff calls
+ var notes = {}; // the piano keys
+ for (var nid = 0; nid < 12; nid ++) {
+ audioBuffers[nid] = new Audio();
+ }
+
+ var playChannel = function(channel, note) {
+ if (!root.channels[channel]) return;
+ var instrument = root.channels[channel].instrument;
+ var instrumentId = root.GM.byId[instrument].id;
+ var note = notes[note];
+ if (note) {
+ var instrumentNoteId = instrumentId + '' + note.id;
+ var nid = (buffer_nid + 1) % audioBuffers.length;
+ var audio = audioBuffers[nid];
+ notesOn[ nid ] = instrumentNoteId;
+ if (!root.Soundfont[instrumentId]) {
+ if (root.DEBUG) {
+ console.log('404', instrumentId);
+ }
+ return;
+ }
+ audio.src = root.Soundfont[instrumentId][note.id];
+ audio.volume = volume / 127;
+ audio.play();
+ buffer_nid = nid;
+ }
+ };
+
+ var stopChannel = function(channel, note) {
+ if (!root.channels[channel]) return;
+ var instrument = root.channels[channel].instrument;
+ var instrumentId = root.GM.byId[instrument].id;
+ var note = notes[note];
+ if (note) {
+ var instrumentNoteId = instrumentId + '' + note.id;
+ for (var i = 0, len = audioBuffers.length; i < len; i++) {
+ var nid = (i + buffer_nid + 1) % len;
+ var cId = notesOn[nid];
+ if (cId && cId == instrumentNoteId) {
+ audioBuffers[nid].pause();
+ notesOn[nid] = null;
+ return;
+ }
+ }
+ }
+ };
+
+ midi.audioBuffers = audioBuffers;
+ midi.send = function(data, delay) { };
+ midi.setController = function(channel, type, value, delay) { };
+ midi.setVolume = function(channel, n) {
+ volume = n; //- should be channel specific volume
+ };
+
+ midi.programChange = function(channel, program) {
+ root.channels[channel].instrument = program;
+ };
+
+ midi.pitchBend = function(channel, program, delay) { };
+
+ midi.noteOn = function(channel, note, velocity, delay) {
+ var id = noteToKey[note];
+ if (!notes[id]) return;
+ if (delay) {
+ return setTimeout(function() {
+ playChannel(channel, id);
+ }, delay * 1000);
+ } else {
+ playChannel(channel, id);
+ }
+ };
+
+ midi.noteOff = function(channel, note, delay) {
+// var id = noteToKey[note];
+// if (!notes[id]) return;
+// if (delay) {
+// return setTimeout(function() {
+// stopChannel(channel, id);
+// }, delay * 1000)
+// } else {
+// stopChannel(channel, id);
+// }
+ };
+
+ midi.chordOn = function(channel, chord, velocity, delay) {
+ for (var idx = 0; idx < chord.length; idx ++) {
+ var n = chord[idx];
+ var id = noteToKey[n];
+ if (!notes[id]) continue;
+ if (delay) {
+ return setTimeout(function() {
+ playChannel(channel, id);
+ }, delay * 1000);
+ } else {
+ playChannel(channel, id);
+ }
+ }
+ };
+
+ midi.chordOff = function(channel, chord, delay) {
+ for (var idx = 0; idx < chord.length; idx ++) {
+ var n = chord[idx];
+ var id = noteToKey[n];
+ if (!notes[id]) continue;
+ if (delay) {
+ return setTimeout(function() {
+ stopChannel(channel, id);
+ }, delay * 1000);
+ } else {
+ stopChannel(channel, id);
+ }
+ }
+ };
+
+ midi.stopAllNotes = function() {
+ for (var nid = 0, length = audioBuffers.length; nid < length; nid++) {
+ audioBuffers[nid].pause();
+ }
+ };
+
+ midi.connect = function(opts) {
+ root.setDefaultPlugin(midi);
+ ///
+ for (var key in root.keyToNote) {
+ noteToKey[root.keyToNote[key]] = key;
+ notes[key] = {id: key};
+ }
+ ///
+ opts.onsuccess && opts.onsuccess();
+ };
+ })();
+
+})(MIDI); \ No newline at end of file