1

我创建了一个简单的脚本来列出连接的 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) 工作正常。知道这里发生了什么吗?

4

3 回答 3

3

通过换出循环来让它现在工作:

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,不知道为什么以前的代码不起作用。

于 2015-12-04T12:53:59.620 回答
2

我可能有点晚了,但midiAccess.inputs有一个forEach方法:

midiAccess.inputs.forEach(function (input) {
    console.log(input.name);
});
于 2016-04-10T19:45:50.623 回答
0

提供更多关于为什么 midiTest 代码在 Windows 上而不是在 macOS 上工作的说明。

geton 方法midiAccess.inputs需要一个端口 ID 。Windows 不支持“完全唯一的持久标识符”,而是仅使用连接的 MIDI 设备或 USB 端口的索引。在支持“完全唯一的持久标识符”的 macOS 上,这些 id 是一串唯一数字。因此,尝试使用端口索引获取端口不会返回 macOS 上的任何设备。

https://webaudio.github.io/web-midi-api/#dom-midiport-id

于 2020-06-23T01:41:18.523 回答