Start · Sprachen · JavaScript · Referenz · MIDIPort.connection

MIDIPort.connection

Eigenschaft

Schreibgeschützte Eigenschaft, die den Verbindungsstatus eines MIDI-Ports als <code>"open"</code>, <code>"closed"</code> oder <code>"pending"</code> liefert.

seit JavaScript Web MIDI API — Chrome 43+, Edge 79+, Firefox 108+, Kategorie: webapi

Signatur

MIDIPort.connection

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 mit MIDIPort.open() oder automatisch, etwa durch Setzen von onmidimessage bzw. Aufruf von send(). Nachrichten lassen sich jetzt empfangen oder senden.
  • "closed": Der Port ist nicht geöffnet. Das ist der Anfangszustand, und er tritt auch nach MIDIPort.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

Typ
"open" | "closed" | "pending"
Beschreibung
Eine Zeichenkette mit dem aktuellen Verbindungsstatus des Ports. Die Eigenschaft ist schreibgeschützt. Den Status ändern Sie mit 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));
Digital Piano: state=connected, connection=closed

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();
Vorher: closed Nachher: open

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();
Digital Piano: connected / open Digital Piano wurde getrennt – wartet auf Wiederverbindung

// Wichtig · Fallstricke

  • Nicht mit state verwechseln: Ein Port kann state === "connected" haben und trotzdem connection === "closed" sein. Wenn Sie eingehende Nachrichten erwarten, prüfen Sie connection.
  • Implizites Öffnen: Wenn Sie onmidimessage setzen oder send() aufrufen, wird der Port automatisch geöffnet. Ein Listener über addEventListener('midimessage', …) öffnet den Port dagegen nicht. In diesem Fall müssen Sie open() selbst aufrufen.
  • Asynchronität: open() liefert ein Promise zurück. Lesen Sie connection daher erst nach await aus. 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 Policy midi kann die API in iframes gesperrt sein.
  • Datenschutz: Der Zugriff auf SysEx ({ sysex: true }) erfordert eine zusätzliche Zustimmung der Nutzerin bzw. des Nutzers.