デバイス連携権限プロンプトあり判定中...
Web MIDI API
USB/BluetoothのMIDIキーボードや音源をブラウザから直接扱えるAPI。入出力デバイスの列挙とMIDIメッセージの送受信ができる。
1対応判定
| ブラウザ | 対応バージョン |
|---|---|
| Chrome | 43+ |
| Firefox | 108+ |
| Safari | 未対応 |
備考: 権限プロンプトあり(sysex)
2権限フロー
権限不要
API呼び出しだけで動く。プロンプトも操作起点の縛りもない
ユーザージェスチャー必須
ボタンクリック等のユーザー操作の中でしか呼べない。プロンプトは出ない
権限プロンプトありこのAPI
呼び出すとブラウザが許可/ブロックのプロンプトを表示し、ユーザーが選ぶ
iOS独自requestPermission
iOSではrequestPermission()を操作起点で呼び、明示的に許可を得る
requestMIDIAccess() 呼び出し時に権限プロンプトが表示される(sysex要求時は特に明示的な許可が必要)。
現在の権限状態(navigator.permissions.query): このブラウザでは取得できません
3ライブデモ: MIDIキーボードの入力を可視化
4コードスニペット
TypeScript(要約版)
// MIDIアクセスを要求(ここで権限プロンプトが出る)
const access = await navigator.requestMIDIAccess({ sysex: false });
// 入力デバイスを列挙してハンドラを張る
for (const input of access.inputs.values()) {
console.log(input.manufacturer, input.name);
input.onmidimessage = (e) => {
const [status, note, velocity] = e.data!;
const command = status & 0xf0;
if (command === 0x90 && velocity > 0) {
// Note On: note番号 (60 = 中央のC)
noteOn(note, velocity);
} else if (command === 0x80 || (command === 0x90 && velocity === 0)) {
noteOff(note);
}
};
}
// デバイスの抜き差しも監視できる
access.onstatechange = (e) => {
console.log(e.port?.name, e.port?.state);
};
// 後始末: ページ離脱時にハンドラを外す
for (const input of access.inputs.values()) {
input.onmidimessage = null;
}