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
midimessagecủaMIDIInput. MIDIConnectionEvent-
Sự kiện được truyền tới các sự kiện
statechangecủaMIDIAccessvàstatechangecủaMIDIPort, 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):
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.
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.
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.
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> |