Signatur
Beschreibung
Die Eigenschaft connection des Interfaces MIDIPort (und damit auch von MIDIInput und MIDIOutput) zeigt, ob die Anwendung den Port gerade geöffnet hat. Sie kann einen von drei Zeichenketten-Werten haben:
"open": Der Port wurde geöffnet, entweder ausdrücklich mitMIDIPort.open()oder automatisch, etwa durch Setzen vononmidimessagebzw. Aufruf vonsend(). Nachrichten lassen sich jetzt empfangen oder senden."closed": Der Port ist nicht geöffnet. Das ist der Anfangszustand, und er tritt auch nachMIDIPort.close()wieder ein."pending": Der Port wurde geöffnet, aber das Gerät wurde getrennt (state === "disconnected"). Sobald es wieder angeschlossen wird, öffnet der Browser den Port von selbst erneut.
Verwechseln Sie connection nicht mit MIDIPort.state. state zeigt, ob das physische Gerät vorhanden ist ("connected"/"disconnected"). connection zeigt dagegen, ob Ihre Anwendung den Port geöffnet hat. Erst beide Werte zusammen verraten, ob ein Port tatsächlich nutzbar ist.
Jede Änderung von connection oder state löst das Event statechange aus, sowohl am Port selbst als auch am zugehörigen MIDIAccess-Objekt. Darüber lassen sich Benutzeroberflächen (z. B. Statusanzeigen für Geräte) immer aktuell halten.
Rückgabewert
open() bzw. close().Beispiele
Verbindungsstatus aller Eingänge auflisten
const listInputs = async () => {
const access = await navigator.requestMIDIAccess();
for (const input of access.inputs.values()) {
console.log(`${input.name}: state=${input.state}, connection=${input.connection}`);
}
};
listInputs().catch((err) => console.error('MIDI nicht verfügbar:', err));
Port öffnen und Statuswechsel prüfen
const openFirstOutput = async () => {
const access = await navigator.requestMIDIAccess();
const output = access.outputs.values().next().value;
if (!output) return console.warn('Kein MIDI-Ausgang gefunden');
console.log('Vorher:', output.connection); // "closed"
await output.open();
console.log('Nachher:', output.connection); // "open"
// Note C4 anschlagen und nach 500 ms wieder loslassen
output.send([0x90, 60, 100]);
output.send([0x80, 60, 0], performance.now() + 500);
};
openFirstOutput();
Statusänderungen live überwachen (inkl. „pending“)
const watchPorts = async () => {
const access = await navigator.requestMIDIAccess();
access.addEventListener('statechange', (event) => {
const { name, state, connection } = event.port;
if (connection === 'pending') {
console.warn(`${name} wurde getrennt – wartet auf Wiederverbindung`);
} else {
console.log(`${name}: ${state} / ${connection}`);
}
});
// Eingänge automatisch öffnen, indem ein Handler gesetzt wird
for (const input of access.inputs.values()) {
input.onmidimessage = (msg) => console.log('Daten:', msg.data);
}
};
watchPorts();
// Wichtig · Fallstricke
- Nicht mit
stateverwechseln: Ein Port kannstate === "connected"haben und trotzdemconnection === "closed"sein. Wenn Sie eingehende Nachrichten erwarten, prüfen Sieconnection. - Implizites Öffnen: Wenn Sie
onmidimessagesetzen odersend()aufrufen, wird der Port automatisch geöffnet. Ein Listener überaddEventListener('midimessage', …)öffnet den Port dagegen nicht. In diesem Fall müssen Sieopen()selbst aufrufen. - Asynchronität:
open()liefert ein Promise zurück. Lesen Sieconnectiondaher erst nachawaitaus. Sonst kann der Wert noch veraltet sein. - Kompatibilität: Die Web MIDI API gibt es nur in sicheren Kontexten (HTTPS). Safari unterstützt sie nicht. Firefox verlangt eine Freigabe über eine Site-Permission bzw. ein Add-on. Prüfen Sie vorher mit
'requestMIDIAccess' in navigator, ob die API vorhanden ist. Über die Permissions Policymidikann die API in iframes gesperrt sein. - Datenschutz: Der Zugriff auf SysEx (
{ sysex: true }) erfordert eine zusätzliche Zustimmung der Nutzerin bzw. des Nutzers.