3
我正在使用Chrome的當前穩定版本(42.0.2311.152)編寫Chrome應用程序。我在Linux和Chromebook上都遇到了這個問題。爲什麼這個Web MIDI API代碼沒有檢測到MIDI事件?
我有一個USB MIDI鍵盤被識別,但沒有檢測到MIDI事件。我檢查過其他程序,並確定我的設備正在發送MIDI事件。
這裏是我的代碼:
function midihandler(event) {
console.log("Received MIDI event");
var msg = "Recieved MIDI event ";
for (i=0 ; i < event.data.length ; i++) {
msg += "0x" + event.data[i].toString(16) + " ";
}
console.log(msg);
}
function setupMIDI() {
navigator.requestMIDIAccess().then(
function (m) {
console.log("MIDI initialized");
m.inputs.forEach(
function (entry) {
console.log("detected MIDI input device " + entry.name);
entry.onmidimessage = midihandler;
for (var key in entry) {
console.log("entry." + key + " = " + entry[key]);
}
}
);
},
function (msg) { console.log("error initializing MIDI: " + msg); }
);
}
window.onload = function() {
console.log("window.onload called");
setupMIDI();
};
控制檯輸出我得到的是:
window.onload called
MIDI initialized
detected MIDI input device MPKmini2 MIDI 1
entry.onmidimessage = function midihandler(event) {
console.log("Received MIDI event");
var msg = "Recieved MIDI event ";
for (i=0 ; i < event.data.length ; i++) {
msg += "0x" + event.data[i].toString(16) + " ";
}
console.log(msg);
}
entry.ondisconnect = null
entry.version = USB-Audio/ALSA library version 1.0.25
entry.type = input
entry.name = MPKmini2 MIDI 1
entry.manufacturer = AKAI
entry.id = 24:0 MPKmini2 MIDI 1
entry.addEventListener = function addEventListener() { [native code] }
entry.removeEventListener = function removeEventListener() { [native code] }
entry.dispatchEvent = function dispatchEvent() { [native code] }
detected MIDI input device Midi Through Port-0
entry.onmidimessage = function midihandler(event) {
console.log("Received MIDI event");
var msg = "Recieved MIDI event ";
for (i=0 ; i < event.data.length ; i++) {
msg += "0x" + event.data[i].toString(16) + " ";
}
console.log(msg);
}
entry.ondisconnect = null
entry.version = ALSA library version 1.0.25
entry.type = input
entry.name = Midi Through Port-0
entry.manufacturer =
entry.id = 14:0 Midi Through Port-0
entry.addEventListener = function addEventListener() { [native code] }
entry.removeEventListener = function removeEventListener() { [native code] }
entry.dispatchEvent = function dispatchEvent() { [native code] }
也就是說,設備被識別出來,並onmidimessage處理器似乎設置。
但是,當我按下MIDI鍵盤上的按鍵時,未檢測到事件。
我在做什麼錯?
您是否在正確的MIDI通道上接收?鍵盤是否真的在該頻道上傳輸? –
我對[the spec](http://webaudio.github.io/web-midi-api/)的閱讀使我相信,無論MIDI通道如何,接收到的所有MIDI消息都應調用處理程序。當然,我可能會誤解。 – fcahoon
我對MIDI的使用經驗總的來說就是接收設備可以通過頻道進行過濾。檢查接收設備的文檔,看看它是否需要編程來指定接收通道,或者是否可以將其設置爲OMNI(在所有通道上接收)。 –