Start · Sprachen · JavaScript · Referenz · MIDIAccess.inputs

MIDIAccess.inputs

Eigenschaft

Schreibgeschützte Eigenschaft, die eine <code>MIDIInputMap</code> mit allen aktuell verfügbaren MIDI-Eingangsports (<code>MIDIInput</code>) liefert.

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

Signatur

MIDIAccess.inputs

Beschreibung

Die Eigenschaft inputs eines MIDIAccess-Objekts gibt eine MIDIInputMap zurück. Diese Map ist schreibgeschützt und funktioniert wie eine Map: Die Schlüssel sind die eindeutigen Port-IDs (string), die Werte sind MIDIInput-Objekte. Sie können darüber iterieren (for...of, forEach(), keys(), values(), entries()) und mit get() bzw. has() gezielt auf einzelne Ports zugreifen.

Sie bekommen ein MIDIAccess-Objekt über navigator.requestMIDIAccess(). Danach nutzen Sie inputs, um angeschlossene Keyboards, Controller oder Drum-Pads zu finden und über das midimessage-Event eingehende Noten, Controller-Änderungen und andere MIDI-Nachrichten zu empfangen.

Die Map zeigt den Zustand zum Zeitpunkt des Zugriffs. Werden Geräte an- oder abgesteckt, meldet der Browser das über das statechange-Event am MIDIAccess-Objekt. Lesen Sie inputs in diesem Fall neu aus, statt eine zwischengespeicherte Liste weiterzuverwenden.

Rückgabewert

Typ
MIDIInputMap
Beschreibung
Eine schreibgeschützte, Map-ähnliche Sammlung: Die Schlüssel sind Port-IDs (string), die Werte sind MIDIInput-Objekte mit Eigenschaften wie name, manufacturer, state und connection.

Beispiele

Alle MIDI-Eingänge auflisten

const listInputs = async () => {
  if (!navigator.requestMIDIAccess) {
    console.warn('Web MIDI API wird nicht unterstützt.');
    return;
  }
  const access = await navigator.requestMIDIAccess();
  console.log(`Gefundene Eingänge: ${access.inputs.size}`);
  for (const [id, input] of access.inputs) {
    console.log(`${id}: ${input.name} (${input.manufacturer}) – ${input.state}`);
  }
};

listInputs();
Gefundene Eingänge: 1 input-0: Launchkey Mini (Novation) – connected

Noten von allen Eingängen empfangen

const handleMessage = (event) => {
  const [status, note, velocity] = event.data;
  const command = status & 0xf0;
  if (command === 0x90 && velocity > 0) {
    console.log(`Note an: ${note}, Anschlagstärke ${velocity}`);
  } else if (command === 0x80 || (command === 0x90 && velocity === 0)) {
    console.log(`Note aus: ${note}`);
  }
};

const access = await navigator.requestMIDIAccess();
access.inputs.forEach((input) => {
  // Setzen von onmidimessage öffnet den Port implizit
  input.onmidimessage = handleMessage;
});
Note an: 60, Anschlagstärke 100 Note aus: 60

Auf An- und Abstecken von Geräten reagieren

const access = await navigator.requestMIDIAccess();

const attach = (input) => {
  input.addEventListener('midimessage', (e) => console.log(input.name, e.data));
};

access.inputs.forEach(attach);

access.addEventListener('statechange', (event) => {
  const port = event.port;
  if (port.type !== 'input') return;
  console.log(`${port.name}: ${port.state}`);
  if (port.state === 'connected' && port.connection === 'closed') {
    attach(access.inputs.get(port.id));
  }
});
Launchkey Mini: disconnected Launchkey Mini: connected

// Wichtig · Fallstricke

  • Browserunterstützung: Chromium-Browser und Firefox (ab 108) unterstützen die Web MIDI API, Safari nicht. Prüfen Sie deshalb immer zuerst, ob navigator.requestMIDIAccess existiert.
  • Sicherer Kontext und Berechtigung: Die API funktioniert nur über HTTPS (oder localhost). Der Nutzer muss den Zugriff erlauben, und die Berechtigungsrichtlinie (Permissions-Policy: midi) darf ihn nicht blockieren. Lehnt der Nutzer ab, wird das Promise verworfen. Behandeln Sie diesen Fall deshalb mit try/catch.
  • SysEx: inputs liefert SysEx-Nachrichten nur, wenn der Zugriff mit { sysex: true } angefragt wurde. Dafür fragt der Browser meist ausdrücklich nach.
  • Momentaufnahme: Die Map ist nicht dauerhaft gültig. Werden Geräte an- oder abgesteckt, ändert sich ihr Inhalt. Reagieren Sie deshalb auf statechange, statt Referenzen dauerhaft zu speichern.
  • Keine Array-Methoden: MIDIInputMap ist kein Array. Nutzen Sie Array.from(access.inputs.values()), wenn Sie map() oder filter() brauchen.
  • „Note an“ mit Anschlagstärke 0: Viele Geräte senden „Note an“ mit Anschlagstärke 0 statt „Note aus“. Werten Sie beide Fälle aus.