Start · Sprachen · JavaScript · Referenz · MIDIPort.type

MIDIPort.type

Eigenschaft

Schreibgeschützte Eigenschaft, die angibt, ob ein <code>MIDIPort</code> ein Eingang (<code>"input"</code>) oder ein Ausgang (<code>"output"</code>) ist.

seit JavaScript Web MIDI API – Chromium-Browser (Chrome, Edge, Ope Kategorie: webapi

Signatur

MIDIPort.type

Beschreibung

Die schreibgeschützte Eigenschaft type der Schnittstelle MIDIPort liefert eine Zeichenkette, die die Richtung des Ports beschreibt: "input" für einen Port, über den MIDI-Nachrichten empfangen werden (MIDIInput), und "output" für einen Port, über den Nachrichten gesendet werden (MIDIOutput).

Gebraucht wird die Eigenschaft vor allem dann, wenn man Ports unabhängig von ihrer Herkunft gemeinsam verarbeitet, etwa im statechange-Ereignis von MIDIAccess. Dort liefert event.port sowohl Eingänge als auch Ausgänge, und über type lässt sich entscheiden, ob ein onmidimessage-Handler angehängt oder der Port in eine Ausgabeliste übernommen werden soll.

Ein physisches Gerät (z. B. ein USB-Keyboard) erscheint meist als zwei getrennte Ports, einer mit type === "input" und einer mit type === "output", die oft denselben name und manufacturer haben. Welche Ports zusammengehören, lässt sich nur über diese Eigenschaften grob abschätzen.

Rückgabewert

Typ
"input" | "output"
Beschreibung
Eine Zeichenkette aus der Aufzählung MIDIPortType: "input" bei einem MIDIInput, "output" bei einem MIDIOutput.

Beispiele

Alle Ports mit Typ auflisten

const listPorts = async () => {
  const access = await navigator.requestMIDIAccess();
  const ports = [...access.inputs.values(), ...access.outputs.values()];
  for (const port of ports) {
    console.log(`${port.type.padEnd(6)} | ${port.name} (${port.manufacturer})`);
  }
};

listPorts().catch((err) => console.error('MIDI nicht verfügbar:', err));
input | Digital Piano (Roland) output | Digital Piano (Roland)

Neu angeschlossene Geräte im statechange-Ereignis unterscheiden

const access = await navigator.requestMIDIAccess();

access.addEventListener('statechange', (event) => {
  const { port } = event;
  if (port.state !== 'connected') return;

  if (port.type === 'input') {
    // Eingänge: Nachrichten empfangen
    port.onmidimessage = (msg) => console.log('Daten:', [...msg.data]);
    console.log(`Eingang bereit: ${port.name}`);
  } else if (port.type === 'output') {
    // Ausgänge: z. B. einen Ton senden (Note On, C4, Anschlag 100)
    port.send([0x90, 60, 100]);
    console.log(`Ausgang bereit: ${port.name}`);
  }
});
Eingang bereit: USB MIDI Keyboard Ausgang bereit: USB MIDI Keyboard

Eingang und Ausgang desselben Geräts paaren

const findPairs = (access) => {
  const byName = new Map();
  const all = [...access.inputs.values(), ...access.outputs.values()];
  for (const port of all) {
    const entry = byName.get(port.name) ?? {};
    entry[port.type] = port; // Schlüssel ist 'input' oder 'output'
    byName.set(port.name, entry);
  }
  return byName;
};

const access = await navigator.requestMIDIAccess();
for (const [name, { input, output }] of findPairs(access)) {
  console.log(name, { hatEingang: !!input, hatAusgang: !!output });
}
Launchpad Mini { hatEingang: true, hatAusgang: true }

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an port.type hat keine Wirkung (im Strict Mode wird ein TypeError ausgelöst).
  • Statt eines Zeichenkettenvergleichs kann man auch port instanceof MIDIInput nutzen; type funktioniert aber ohne Zugriff auf die Klassen und eignet sich gut als Map-Schlüssel.
  • Kompatibilität: Die Web MIDI API gibt es in Chromium-basierten Browsern und in Firefox ab Version 108, Safari unterstützt sie nicht. Vorher mit 'requestMIDIAccess' in navigator prüfen.
  • Sicherheit: Die API steht nur in sicheren Kontexten (HTTPS) zur Verfügung und braucht die Zustimmung der Nutzer. Für SysEx-Zugriff ({ sysex: true }) ist eine zusätzliche Berechtigung nötig. In iframes muss die Permissions-Policy midi erlaubt sein.
  • Gleiche Namen bei Eingang und Ausgang sind nicht garantiert. Das Paaren über name ist also nur eine Näherung.