我创建了一个简单的脚本来列出连接的midi输入设备。这在Windows上的Chrome中运行良好,但在Mac上的Chrome上失败,并且无法读取未定义的属性名称'。如果我复制并粘贴w3c.org示例中的代码,也会发生这种情况:http://www.w3.org/TR/webmidi/#listing-inputs-and-outputs
这是我的代码:
var midiTest = {
midiAcess: null,
init: function() {
function onMIDISuccess(midiAccess) {
console.log(midiAccess);
var inputDeviceCount = midiAccess.inputs.size;
if(inputDeviceCount > 0) {
for(var i=0; i<inputDeviceCount; i++) {
var input = midiAccess.inputs.get(i);
var deviceName = input.name;
console.log(deviceName);
}
}
}
function onMIDIFailure(e) {
console.log('No access to MIDI devices' + e);
}
if(navigator.requestMIDIAccess)
navigator.requestMIDIAccess({ sysex: false }).then(onMIDISuccess, onMIDIFailure);
else
alert("No MIDI support in your browser.");
},
};
midiTest.init();
console.log(midiAccess)运行正常。知道这里发生了什么吗?
答案 0 :(得分:2)
现在通过更换循环来实现它:
var inputs=midiAccess.inputs.values();
for ( var input = inputs.next(); input && !input.done; input = inputs.next()) {
var deviceName = input.value.name;
console.log(deviceName);
}
这适用于mac和windows,不知道为什么以前的代码不起作用。
答案 1 :(得分:1)
我可能会有点迟到,但midiAccess.inputs
有一个forEach
方法:
midiAccess.inputs.forEach(function (input) {
console.log(input.name);
});
答案 2 :(得分:0)
提供更多有关为什么midiTest代码在Windows而不是macOS上运行的解释。
get
上的midiAccess.inputs
方法需要端口ID。 Windows不支持“完全唯一的永久标识符”,而仅使用所连接的MIDI设备或USB端口的索引。在不支持“完全唯一的永久标识符”的macOS上,这些ID是一串唯一的数字。
因此,尝试使用端口索引获取端口不会在macOS上返回任何设备。