Signatur
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
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));
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 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 });
}
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
port.typehat keine Wirkung (im Strict Mode wird einTypeErrorausgelöst). - Statt eines Zeichenkettenvergleichs kann man auch
port instanceof MIDIInputnutzen;typefunktioniert 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 navigatorprü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-Policymidierlaubt sein. - Gleiche Namen bei Eingang und Ausgang sind nicht garantiert. Das Paaren über
nameist also nur eine Näherung.