-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebMidiMultiplexer.html
122 lines (99 loc) · 3.66 KB
/
webMidiMultiplexer.html
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
<html>
<head>
<meta charset="utf-8"/>
<link id="favicon" rel="shortcut icon" type="image/png" href="data:image/png;base64,....==" />
<title>webMidiMultiplexer</title>
<style type="text/css">
</style>
</head>
<body>
<h1>webMidiMultiplexer</h1>
<div>
<h2>Input</h2>
<ul id="midi_inputs"></ul>
</div>
<div>
<h2>Output</h2>
<ul id="midi_outputs"></ul>
</div>
<script type="text/javascript">
// Variables -----------------------------------------------------------
const midiDevicesActive = new Map();
// Midi Event Transfer -------------------------------------------------
const onMidiMessage = (msg) => {
console.debug(msg.data);
for (let midiDevice of midiDevicesActive.keys()) {
if (midiDevice.type == "output") {
midiDevice.send(msg.data); // https://www.w3.org/TR/2015/WD-webmidi-20150317/#midioutput-interface
}
}
};
// Persist Selected Devices --------------------------------------------
const persist_midiDevicesActive_base = () => {
return {input: {}, output: {}};
};
const persist_midiDevicesActive = () => {
let data = persist_midiDevicesActive_base();
for (let midiDevice of midiDevicesActive.keys()) {
data[midiDevice.type][midiDevice.name] = true;
}
localStorage.midiDevicesActive = JSON.stringify(data);
};
const load_midiDevicesActive = () => {
try {return JSON.parse(localStorage.midiDevicesActive);}
catch (e) {return persist_midiDevicesActive_base();}
};
// Selected Devices Management -----------------------------------------
const onMidiDeviceItemUpdate = (checked, midiDevice) => {
if (checked) {
midiDevicesActive.set(midiDevice);
}
else {
midiDevicesActive.delete(midiDevice);
}
if (midiDevice.type == 'input') {
midiDevice.onmidimessage = checked ? onMidiMessage : undefined;
}
};
// UI Events -----------------------------------------------------------
const onMidiUIItemChanged = (event, midiDevice) => {
let checked = event;
if (event.target != undefined) {
checked = event.target.checked;
}
//console.log(event, midiDevice);
onMidiDeviceItemUpdate(checked, midiDevice);
//console.log(midiDevicesActive);
persist_midiDevicesActive();
};
// UI Init -------------------------------------------------------------
const addMidiUIItems = (id, midiDevices) => {
const localStorage_midiDevicesActive = load_midiDevicesActive();
const ul = document.getElementById(id);
ul.innerHTML = "";
for (let midiDevice of midiDevices.values()) {
onMidiDeviceItemUpdate(localStorage_midiDevicesActive[midiDevice.type][midiDevice.name], midiDevice);
const checkbox = document.createElement('input');
checkbox.setAttribute('type', 'checkbox');
checkbox.setAttribute('value', midiDevice.name);
checkbox.checked = localStorage_midiDevicesActive[midiDevice.type][midiDevice.name];
checkbox.onchange = function(event) {onMidiUIItemChanged(event, midiDevice);};
const li = document.createElement('li');
li.appendChild(checkbox);
li.appendChild(document.createTextNode(midiDevice.name));
ul.appendChild(li);
}
};
// Midi Init -----------------------------------------------------------
const bindMidiDevices = (midiAccess) => {
addMidiUIItems('midi_inputs', midiAccess.inputs);
addMidiUIItems('midi_outputs', midiAccess.outputs);
};
const initMidi = (bindMidiDevices) => {
if (window.navigator.requestMIDIAccess) {
window.navigator.requestMIDIAccess({sysex: false}).then(bindMidiDevices, function() {console.warn('MIDI Access Failed');});
} else {console.warn("No browser MIDI support");}
};
initMidi(bindMidiDevices);
</script>
</body>