Web MIDI API

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.

Web MIDI API kết nối và tương tác với các thiết bị Musical Instrument Digital Interface (MIDI).

Các giao diện này xử lý những khía cạnh thực tế của việc gửi và nhận thông điệp MIDI. Vì vậy, API này có thể được dùng cho cả mục đích âm nhạc lẫn phi âm nhạc, với bất kỳ thiết bị MIDI nào được kết nối với máy tính của bạn.

Giao diện

MIDIInputMap

Đại diện cho tất cả các cổng đầu vào MIDI hiện có.

MIDIOutputMap

Đại diện cho tất cả các cổng đầu ra MIDI hiện có.

MIDIAccess

Cung cấp các phương thức để liệt kê thiết bị đầu vào và đầu ra, đồng thời truy cập từng thiết bị riêng lẻ.

MIDIPort

Đại diện cho một cổng MIDI riêng lẻ.

MIDIInput

Cung cấp một phương thức để xử lý các thông điệp MIDI từ một cổng đầu vào.

MIDIOutput

Xếp hàng các thông điệp để gửi tới cổng MIDI được liên kết. Thông điệp có thể được gửi ngay lập tức hoặc sau một độ trễ xác định.

MIDIMessageEvent

Sự kiện được truyền tới sự kiện midimessage của MIDIInput.

MIDIConnectionEvent

Sự kiện được truyền tới các sự kiện statechange của MIDIAccessstatechange của MIDIPort, khi một cổng trở nên khả dụng hoặc không khả dụng.

Yêu cầu bảo mật

Quyền truy cập API được yêu cầu bằng phương thức navigator.requestMIDIAccess().

  • Phương thức này phải được gọi trong secure context.
  • Quyền truy cập có thể bị chặn bởi HTTP Permission Policy midi.
  • Người dùng phải cấp quyền rõ ràng để sử dụng API thông qua cơ chế cụ thể của user agent, hoặc đã từng cấp quyền trước đó. Lưu ý rằng nếu quyền truy cập bị từ chối bởi policy quyền, thì quyền của người dùng cũng không thể cấp lại được.

Trạng thái quyền có thể được truy vấn bằng phương thức của Permissions API navigator.permissions.query(), bằng cách truyền vào một permission descriptor với quyền midi và thuộc tính sysex (tùy chọn):

js
navigator.permissions.query({ name: "midi", sysex: true }).then((result) => {
  if (result.state === "granted") {
    // Truy cập được cấp.
  } else if (result.state === "prompt") {
    // Việc sử dụng API sẽ yêu cầu cấp quyền
  }
  // Quyền bị từ chối bởi lời nhắc của người dùng hoặc bởi permission policy
});

Ví dụ

Lấy quyền truy cập vào cổng MIDI

Phương thức navigator.requestMIDIAccess() trả về một promise mà khi resolve sẽ cho ra một đối tượng MIDIAccess, từ đó có thể dùng để truy cập một thiết bị MIDI. Phương thức này phải được gọi trong một secure context.

js
let midi = null; // đối tượng MIDIAccess toàn cục
function onMIDISuccess(midiAccess) {
  console.log("MIDI đã sẵn sàng!");
  midi = midiAccess; // lưu vào biến toàn cục (trong thực tế có thể sẽ giữ trong một instance đối tượng)
}

function onMIDIFailure(msg) {
  console.error(`Không thể lấy quyền truy cập MIDI - ${msg}`);
}

navigator.requestMIDIAccess().then(onMIDISuccess, onMIDIFailure);

Liệt kê đầu vào và đầu ra

Trong ví dụ này, danh sách các cổng đầu vào và đầu ra được lấy ra và in ra console.

js
function listInputsAndOutputs(midiAccess) {
  for (const entry of midiAccess.inputs) {
    const input = entry[1];
    console.log(
      `Cổng đầu vào [type:'${input.type}']` +
        ` id:'${input.id}'` +
        ` manufacturer:'${input.manufacturer}'` +
        ` name:'${input.name}'` +
        ` version:'${input.version}'`,
    );
  }

  for (const entry of midiAccess.outputs) {
    const output = entry[1];
    console.log(
      `Cổng đầu ra [type:'${output.type}'] id:'${output.id}' manufacturer:'${output.manufacturer}' name:'${output.name}' version:'${output.version}'`,
    );
  }
}

Xử lý đầu vào MIDI

Ví dụ này in tất cả thông điệp đầu vào MIDI ra console.

js
function onMIDIMessage(event) {
  let str = `Đã nhận thông điệp MIDI tại timestamp ${event.timeStamp}[${event.data.length} bytes]: `;
  for (const character of event.data) {
    str += `0x${character.toString(16)} `;
  }
  console.log(str);
}

function startLoggingMIDIInput(midiAccess) {
  midiAccess.inputs.forEach((entry) => {
    entry.onmidimessage = onMIDIMessage;
  });
}

Thông số kỹ thuật

Specification
Web MIDI API

Tương thích trình duyệt

api.Navigator.requestMIDIAccess

http.headers.Permissions-Policy.midi

api.Permissions.permission_midi

Xem thêm