-
Notifications
You must be signed in to change notification settings - Fork 2
/
canaryPolyfillMIDIAccess.js
194 lines (156 loc) · 5.79 KB
/
canaryPolyfillMIDIAccess.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
// Backported from v2, polyfills a MIDIAccess object as provided by Chrome Canary
// to match a version of the WebMIDI API spec that is now a few months old.
module.declare("canaryPolyfillMIDIAccess", [], function () {
function canaryPolyfillMIDIAccess (access) {
console.warn("MIDISource(.canaryPolyfillMIDIAccess): Attempting to polyfill MIDIAccess object...");
var MIDIPortPolyfill = (function () {
function MIDIPortPolyfill (input_or_output) {
Object.defineProperties(this, {
"_input_or_output": {
enumerable: false,
writable: false,
value: input_or_output,
},
"id": {
enumerable: true,
writable: false,
value: input_or_output.id,
},
"manufacturer": {
enumerable: true,
writable: false,
value: input_or_output.manufacturer,
},
"name": {
enumerable: true,
writable: false,
value: input_or_output.name,
},
"type": {
enumerable: true,
writable: false,
value: input_or_output.type,
},
"version": {
enumerable: true,
writable: false,
value: input_or_output.version,
},
"ondisconnect": {
enumerable: true,
get: function () {
return input_or_output.ondisconnect.bind(input_or_output);
},
set: function (new_value) {
return (input_or_output.ondisconnect = new_value);
}
}
});
}
return MIDIPortPolyfill;
})();
var NotFoundError = NotFoundError || (function () {
function NotFoundError () {}
NotFoundError.prototype = Object.create(Error);
return NotFoundError;
});
var NotSupportedError = NotSupportedError || (function () {
function NotSupportedError () {}
NotSupportedError.prototype = Object.create(Error);
return NotSupportedError;
});
if (!access.getInputs) {
console.warn("MIDISource(.canaryPolyfillMIDIAccess): `getInputs` needs polyfill.");
access.getInputs = (function () {
var id_to_port_map = {};
return function () {
return this.inputs().map(function (canary_midi_input) {
var memoized_port = id_to_port_map[canary_midi_input.id];
if (memoized_port) {
return memoized_port;
}
return id_to_port_map[canary_midi_input.id] = new MIDIPortPolyfill(canary_midi_input);
});
};
})();
}
if (!access.getInput) {
console.warn("MIDISource(.canaryPolyfillMIDIAccess): `getInput` needs polyfill.");
access.getInput = function (target) {
var ports = this.getInputs();
if (typeof target === "string") {
// Select by `id` property.
for (var i = 0; i < ports.length; i++) {
if (ports[i].id == target) {
return ports[i]._input_or_output;
}
}
throw new NotFoundError("Could not find MIDI input with id '" + target + "'!");
} else if (typeof target === "number") {
// Select by index in ports array.
var port = ports[target];
if (!port) {
throw new NotFoundError("Invalid index '" + target + "' for MIDI input!");
}
return port._input_or_output;
} else if (MIDIPortPolyfill.prototype.isPrototypeOf(target)) {
// Select by passing MIDIPortPolyfill.
for (var i = 0; i < ports.length; i++) {
if (ports[i] == target) {
return ports[i]._input_or_output;
}
}
throw new NotFoundError("Could not find MIDI input matching the given port!");
}
throw new NotSupportedError("Invalid target for MIDI input!");
};
}
if (!access.getOutputs) {
console.warn("MIDISource(.canaryPolyfillMIDIAccess): `getOutputs` needs polyfill.");
access.getOutputs = (function () {
var id_to_port_map = {};
return function () {
return this.outputs().map(function (canary_midi_output) {
var memoized_port = id_to_port_map[canary_midi_output.id];
if (memoized_port) {
return memoized_port;
}
return id_to_port_map[canary_midi_output.id] = new MIDIPortPolyfill(canary_midi_output);
});
};
})();
}
if (!access.getOutput) {
console.warn("MIDISource(.canaryPolyfillMIDIAccess): `getOutput` needs polyfill.");
access.getOutput = function (target) {
var ports = this.getOutputs();
if (typeof target === "string") {
// Select by `id` property.
for (var i = 0; i < ports.length; i++) {
if (ports[i].id == target) {
return ports[i]._input_or_output;
}
}
throw new NotFoundError("Could not find MIDI output with id '" + target + "'!");
} else if (typeof target === "number") {
// Select by index in ports array.
var port = ports[target];
if (!port) {
throw new NotFoundError("Invalid index '" + target + "' for MIDI output!");
}
return port._input_or_output;
} else if (MIDIPortPolyfill.prototype.isPrototypeOf(target)) {
// Select by passing MIDIPortPolyfill.
for (var i = 0; i < ports.length; i++) {
if (ports[i] == target) {
return ports[i]._input_or_output;
}
}
throw new NotFoundError("Could not find MIDI output matching the given port!");
}
throw new NotSupportedError("Invalid target for MIDI output!");
};
}
};
return canaryPolyfillMIDIAccess;
});