Я пишу приложение Chrome, используя текущую стабильную сборку Chrome (42.0.2311.152). У меня есть эта проблема как на 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? Действительно ли клавиатура передает на этом канале? –
Мое чтение [spec] (http://webaudio.github.io/web-midi-api/) заставило меня поверить, что все полученные MIDI-сообщения должны вызывать обработчик независимо от MIDI-канала. Конечно, я мог ошибаться. – fcahoon
Мой опыт работы с MIDI в целом заключается в том, что принимающее устройство может фильтровать по каналу. Проверьте документацию вашего приемного устройства и посмотрите, нужно ли его запрограммировать для указания канала приема или если вы можете установить его в OMNI (принимать по всем каналам). –