diff --git a/js/MIDI/Plugin.js b/js/MIDI/Plugin.js index e391e1e..efcc281 100644 --- a/js/MIDI/Plugin.js +++ b/js/MIDI/Plugin.js @@ -264,6 +264,7 @@ if (window.Audio) (function () { var volume = 127; // floating point var channel_nid = -1; // current channel var channels = []; // the audio channels + var channelInstrumentNoteIds = []; // 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++) { channels[nid] = new Audio(); @@ -272,18 +273,35 @@ if (window.Audio) (function () { var playChannel = function (channel, note) { if (!MIDI.channels[channel]) return; var instrument = MIDI.channels[channel].instrument; - var id = MIDI.GeneralMIDI.byId[instrument].id; + var instrumentId = MIDI.GeneralMIDI.byId[instrument].id; var note = notes[note]; if (!note) return; + var instrumentNoteId = instrumentId + "" + note.id; var nid = (channel_nid + 1) % channels.length; - var time = (new Date()).getTime(); var audio = channels[nid]; - audio.src = MIDI.Soundfont[id][note.id]; + channelInstrumentNoteIds[ nid ] = instrumentNoteId; + audio.src = MIDI.Soundfont[instrumentId][note.id]; audio.volume = volume / 127; audio.play(); channel_nid = nid; }; + var stopChannel = function (channel, note) { + if (!MIDI.channels[channel]) return; + var instrument = MIDI.channels[channel].instrument; + var instrumentId = MIDI.GeneralMIDI.byId[instrument].id; + var note = notes[note]; + if (!note) return; + var instrumentNoteId = instrumentId + "" + note.id; + + for(var i=0;i