PageSourceSearch

https://beatscratch.io/app/MIDI.js/js/midi/plugin.webmidi.js

js beatscratch.io collected 2026-10-02 01:57:25 UTC 2,633 bytes, 93 lines download raw bytes

1/*
2	----------------------------------------------------------------------
3	Web MIDI API - Native Soundbanks
4	----------------------------------------------------------------------
5	http://webaudio.github.io/web-midi-api/
6	----------------------------------------------------------------------
7*/
8
9(function(root) { 'use strict';
10
11	var plugin = null;
12	var output = null;
13	var channels = [];
14	var midi = root.WebMIDI = {api: 'webmidi'};
15	midi.send = function(data, delay) { // set channel volume
16		output.send(data, delay * 1000);
17	};
18
19	midi.setController = function(channel, type, value, delay) {
20		output.send([channel, type, value], delay * 1000);
21	};
22
23	midi.setVolume = function(channel, volume, delay) { // set channel volume
24		output.send([0xB0 + channel, 0x07, volume], delay * 1000);
25	};
26
27	midi.programChange = function(channel, program, delay) { // change patch (instrument)
28		output.send([0xC0 + channel, program], delay * 1000);
29	};
30
31	midi.pitchBend = function(channel, program, delay) { // pitch bend
32		output.send([0xE0 + channel, program], delay * 1000);
33	};
34
35	midi.noteOn = function(channel, note, velocity, delay) {
36		output.send([0x90 + channel, note, velocity], delay * 1000);
37	};
38
39	midi.noteOff = function(channel, note, delay) {
40		output.send([0x80 + channel, note, 0], delay * 1000);
41	};
42
43	midi.chordOn = function(channel, chord, velocity, delay) {
44		for (var n = 0; n < chord.length; n ++) {
45			var note = chord[n];
46			output.send([0x90 + channel, note, velocity], delay * 1000);
47		}
48	};
49
50	midi.chordOff = function(channel, chord, delay) {
51		for (var n = 0; n < chord.length; n ++) {
52			var note = chord[n];
53			output.send([0x80 + channel, note, 0], delay * 1000);
54		}
55	};
56
57	midi.stopAllNotes = function() {
58		output.cancel();
59		for (var channel = 0; channel < 16; channel ++) {
60			output.send([0xB0 + channel, 0x7B, 0]);
61		}
62	};
63
64	midi.connect = function(opts) {
65		root.setDefaultPlugin(midi);
66		var errFunction = function(err) { // well at least we tried!
67			if (window.AudioContext) { // Chrome
68				opts.api = 'webaudio';
69			} else if (window.Audio) { // Firefox
70				opts.api = 'audiotag';
71			} else { // no support
72				return;
73			}
74			root.loadPlugin(opts);
75		};
76		///
77		navigator.requestMIDIAccess().then(function(access) {
78			plugin = access;
79			var pluginOutputs = plugin.outputs;
80			if (typeof pluginOutputs == 'function') { // Chrome pre-43
81				output = pluginOutputs()[0];
82			} else { // Chrome post-43
83				output = pluginOutputs[0];
84			}
85			if (output === undefined) { // nothing there...
86				errFunction();
87			} else {
88				opts.onsuccess && opts.onsuccess();			
89			}
90		}, errFunction);
91	};
92
93})(MIDI);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.