Signatur
Beschreibung
Die Eigenschaft MIDIConnectionEvent.port ist schreibgeschützt und verweist auf den MIDIPort, der das statechange-Ereignis ausgelöst hat. Das Ereignis wird sowohl auf dem MIDIAccess-Objekt als auch auf dem betroffenen Port selbst ausgelöst, z. B. wenn ein USB-MIDI-Keyboard eingesteckt oder abgezogen wird oder wenn ein Port geöffnet bzw. geschlossen wird.
Der zurückgegebene Port ist entweder ein MIDIInput oder ein MIDIOutput. Über seine Eigenschaften type ("input"/"output"), state ("connected"/"disconnected"), connection ("open"/"closed"/"pending") sowie id, name und manufacturer kannst du feststellen, was genau passiert ist.
Typischer Einsatz: Geräteliste in der Oberfläche live aktualisieren, beim Anschließen eines Controllers automatisch einen onmidimessage-Handler registrieren und beim Trennen aufräumen oder den Nutzer informieren.
Rückgabewert
port-Option ist der Wert null.Beispiele
Anschließen und Trennen von Geräten protokollieren
const access = await navigator.requestMIDIAccess();
access.addEventListener('statechange', (event) => {
const { port } = event;
console.log(`${port.type} "${port.name}" (${port.manufacturer}): ${port.state} / ${port.connection}`);
});
Neu verbundene Eingänge automatisch abhören
const handleMessage = (msg) => {
const [status, note, velocity] = msg.data;
console.log('MIDI:', status.toString(16), note, velocity);
};
const access = await navigator.requestMIDIAccess();
// Bereits vorhandene Eingänge anbinden
access.inputs.forEach((input) => { input.onmidimessage = handleMessage; });
access.onstatechange = ({ port }) => {
if (port.type !== 'input') return;
if (port.state === 'connected') {
port.onmidimessage = handleMessage; // öffnet den Port implizit
} else {
port.onmidimessage = null;
console.warn(`Gerät getrennt: ${port.name}`);
}
};
Geräteliste in der Oberfläche aktualisieren
const list = document.querySelector('#midi-devices');
const access = await navigator.requestMIDIAccess();
const render = () => {
list.replaceChildren(
...[...access.inputs.values(), ...access.outputs.values()].map((p) => {
const li = document.createElement('li');
li.textContent = `${p.type === 'input' ? '⬅' : '➡'} ${p.name} (${p.state})`;
return li;
})
);
};
access.addEventListener('statechange', (event) => {
console.log('Geändert:', event.port.id);
render();
});
render();
// Wichtig · Fallstricke
- Mehrfache Ereignisse: Ein Gerät kann mehrere
statechange-Ereignisse auslösen – eines für den Anschluss (state) und weitere beim Öffnen/Schließen (connection). Prüfe daher immerport.stateundport.connection, statt jedes Ereignis als „neues Gerät“ zu werten. - Ein- und Ausgänge: Ein physisches Gerät erscheint meist als separater
MIDIInputundMIDIOutputmit eigenerid; es feuern also zwei Ereignisse. - Implizites Öffnen: Das Setzen von
onmidimessageöffnet einen Eingang und löst selbst ein weiteresstatechangeaus – Endlosschleifen vermeiden. - Kompatibilität & Sicherheit: Die Web MIDI API erfordert einen sicheren Kontext (HTTPS) und Nutzerzustimmung; Safari unterstützt sie nicht. In Firefox ist zusätzlich eine Berechtigung per Site-Permission-Add-on nötig. Vor Nutzung mit
'requestMIDIAccess' in navigatorprüfen. - Die Eigenschaft ist schreibgeschützt; bei
new MIDIConnectionEvent('statechange', { port })wird sie über das Options-Objekt gesetzt.