Start · Sprachen · JavaScript · Referenz · MIDIOutputMap

MIDIOutputMap

Schnittstelle

Schreibgeschützte, Map-ähnliche Sammlung aller aktuell verfügbaren MIDI-Ausgabeports (<code>MIDIOutput</code>), erreichbar über <code>MIDIAccess.outputs</code>.

seit JavaScript Web MIDI API – Chromium-Browser, Firefox 108+, Ope Kategorie: webapi

Signatur

interface MIDIOutputMap

Beschreibung

MIDIOutputMap ist ein schreibgeschütztes, Map-ähnliches Interface der Web MIDI API. Eine Instanz bekommst du über die Eigenschaft outputs des MIDIAccess-Objekts, das navigator.requestMIDIAccess() liefert. Die Schlüssel sind die eindeutigen Port-IDs (string), die Werte sind MIDIOutput-Objekte, an die du mit send() MIDI-Nachrichten schicken kannst.

Weil das Interface „maplike“ ist, stehen dir die lesenden Methoden eines Map zur Verfügung: size, get(), has(), keys(), values(), entries(), forEach() und die Iteration mit for...of. Verändernde Methoden wie set(), delete() oder clear() gibt es nicht. Der Browser pflegt die Map selbst.

Typische Anwendungsfälle: eine Auswahlliste mit angeschlossenen Synthesizern, Controllern oder virtuellen MIDI-Ports erzeugen, einen bestimmten Port per ID wiederfinden oder Noten an alle Ausgänge gleichzeitig senden. Wenn Geräte angeschlossen oder entfernt werden, meldet MIDIAccess das über das Ereignis statechange. Danach solltest du die Map neu auslesen.

Rückgabewert

Typ
MIDIOutputMap
Beschreibung
Map-ähnliches Objekt mit Einträgen [id: string, port: MIDIOutput]; es ist über MIDIAccess.outputs erreichbar.

Beispiele

Alle MIDI-Ausgänge auflisten

const listOutputs = async () => {
  const access = await navigator.requestMIDIAccess();
  const outputs = access.outputs; // MIDIOutputMap

  console.log(`Gefundene Ausgänge: ${outputs.size}`);
  for (const [id, port] of outputs) {
    console.log(id, port.name, port.manufacturer, port.state);
  }
};

listOutputs().catch((err) => console.error('MIDI nicht verfügbar:', err));
Gefundene Ausgänge: 1 abc123 USB MIDI Interface Roland connected

Note an einen ausgewählten Port senden

const playNote = async (portId, note = 60) => {
  const access = await navigator.requestMIDIAccess();
  if (!access.outputs.has(portId)) {
    throw new Error(`Port ${portId} nicht gefunden`);
  }
  const output = access.outputs.get(portId);
  output.send([0x90, note, 0x7f]);                        // Note On, Kanal 1
  output.send([0x80, note, 0x40], performance.now() + 500); // Note Off nach 500 ms
};

// Beispiel: ersten verfügbaren Port verwenden
const access = await navigator.requestMIDIAccess();
const [firstId] = access.outputs.keys();
if (firstId) await playNote(firstId);

Auswahlliste füllen und bei Geräteänderungen aktualisieren

const select = document.querySelector('#midi-out');
const access = await navigator.requestMIDIAccess();

const render = () => {
  select.replaceChildren();
  access.outputs.forEach((port, id) => {
    select.append(new Option(port.name ?? id, id));
  });
};

render();
access.addEventListener('statechange', (e) => {
  if (e.port.type === 'output') render();
});

// Wichtig · Fallstricke

  • Browserunterstützung: Chromium-basierte Browser (Chrome, Edge, Opera) und Firefox ab Version 108 unterstützen die API. Firefox verlangt dafür ein signiertes Add-on bzw. eine Seitenberechtigung. Safari unterstützt die Web MIDI API nicht. Prüfe deshalb vorher mit 'requestMIDIAccess' in navigator, ob sie vorhanden ist.
  • Die API läuft nur in einem sicheren Kontext (HTTPS oder localhost). Außerdem muss der Nutzer den Zugriff erlauben. Mit { sysex: true } ist eine zusätzliche Berechtigung nötig.
  • Die Map ist schreibgeschützt: set(), delete() und clear() gibt es nicht.
  • Port-IDs sind nicht garantiert dauerhaft stabil, wenn Geräte neu angeschlossen werden oder auf anderen Rechnern laufen. Speicherst du eine Auswahl, solltest du zur Sicherheit auch name und manufacturer abgleichen.
  • Ein Eintrag mit state === 'disconnected' kann kurzzeitig noch in der Map stehen. Prüfe daher vor dem Senden port.state.