Назад в Центр знаний
Платформа

Web MIDI API: разрешения и приватность устройств

Проектируйте Web MIDI с активацией пользователя, разрешением, изменениями портов, ограниченными сообщениями и надёжным запасным режимом.

BotBrowser Team

Документация

Нужна структурированная документация по теме Платформа?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

BotBrowser может проверить разрешённый поток Web MIDI, когда управляемый браузер предоставляет navigator.requestMIDIAccess() и объявленное действие запускает запрос. Он не создаёт физический инструмент, не выбирает порт за пользователя, не выдаёт разрешение вне браузера и не превращает имя порта во владение. Нужен видимый контракт: запрос, результат, проверка сообщений, согласование изменений и рабочий путь без MIDI.

Действие пользователя запрашивает MIDI, изменения портов и ограниченные сообщения ведут к безопасному запасному режиму

TL;DR

Web MIDI даёт доступ к входным и выходным портам после разрешения браузера. Это не неограниченный инвентарь оборудования и не постоянный идентификатор инструмента. Проверьте navigator.requestMIDIAccess, вызывайте его из явного действия, запрашивайте минимальную возможность и считайте MIDIAccess живым изменяемым представлением. Слушайте statechange, проверяйте MIDIMessageEvent.data и удаляйте обработчики при исчезновении порта.

Спецификация W3C Web MIDI определяет MIDIAccess, порты, изменения состояния, события сообщений и необязательный System Exclusive. MDN отмечает ограниченную поддержку. BotBrowser может записать видимые состояния разрешения и портов, но не доказывает наличие инструмента, владение им или создание звука.

Содержание

Разрешение является границей возможности

navigator.requestMIDIAccess() запрашивает возможность, которой управляет браузер, а не открывает все USB-устройства. Нужны защищённый контекст, активация, разрешение и поддержка платформы. Выполненный MIDIAccess означает, что браузер показал поверхность доступа; подключённый или принадлежащий человеку порт из этого не следует.

Запрашивайте минимальный охват. Для обычных нот и контроллеров используйте { sysex: false }. System Exclusive может содержать команды производителя и непрозрачные последовательности; для него нужна отдельная осознанная политика. Не включайте sysex: true только потому, что это допускает библиотека. В Web USB: доступ к устройству и границы приватности описан тот же принцип: разрешение не является инвентарём.

Имена, производитель и версия полезны в видимом выборе, но не доказывают владение и не создают стабильный идентификатор. Сохраняйте только granted, denied, unsupported или no-port, если это нужно задаче. Не объединяйте результат с сетью, экраном и профилем для долгой метки браузера.

Запрашивайте доступ действием пользователя

Проверяйте возможность в момент использования. Кнопка «Подключить MIDI» может быть отключена при отсутствии API. Вызывайте запрос кликом или клавишей, а не при загрузке, таймером или после фоновой сети.

async function connectMidi() {
  if (!window.isSecureContext || !navigator.requestMIDIAccess) {
    return showMidiState('unsupported');
  }
  setMidiState('requesting');
  try {
    const access = await navigator.requestMIDIAccess({ sysex: false });
    attachMidiAccess(access);
    renderPorts(access);
  } catch (error) {
    setMidiState(classifyMidiError(error));
    showMidiFallback();
  }
}
connectButton.addEventListener('click', connectMidi);

Состояние requesting предотвращает двойной выбор и даёт доступный статус. При отказе классифицируйте только известное странице: NotAllowedError, отсутствие поддержки или локальный timeout. Не говорите, что названное устройство отказало. Восстановите кнопку и предложите новый видимый запуск.

Web Bluetooth: разрешения и приватность устройств показывает сопоставимый выбор. Протоколы различны, но нужно разделять наличие API, выданный доступ и пригодное устройство.

Считайте порты изменяемой сессией

MIDIAccess.inputs и MIDIAccess.outputs являются картами портов, показанных в текущий момент. Слушайте statechange при подключении, отключении или перенастройке и заново отображайте всю карту.

function attachMidiAccess(access) {
  access.onstatechange = event => {
    const port = event.port;
    renderPorts(access);
    if (port.state === 'disconnected') detachInput(port.id);
    if (port.state === 'connected' && port.type === 'input') attachInput(port);
  };
  for (const input of access.inputs.values()) attachInput(input);
  for (const output of access.outputs.values()) renderOutput(output);
}

Проверяйте port.state и port.connection перед использованием и обрабатывайте сбой отправки. При отключении удаляйте listener и связанное состояние. Используйте port.id только как короткий ключ сессии, не как профиль или отпечаток. send() не доказывает, что звук был создан или услышан.

Ограничивайте MIDI-сообщения

MIDIMessageEvent.data содержит недоверенную последовательность байтов. Проверяйте длину, байт состояния, канал и диапазон до изменения состояния приложения. Разрешённый список может быть меньше полного протокола.

const MAX_MIDI_BYTES = 3;
const allowedStatus = new Set([0x80, 0x90, 0xb0, 0xe0]);
function acceptMidiMessage(event) {
  const bytes = [...event.data];
  if (bytes.length < 2 || bytes.length > MAX_MIDI_BYTES) return;
  const status = bytes[0] & 0xf0;
  if (!allowedStatus.has(status) || bytes.slice(1).some(byte => byte > 0x7f)) return;
  updateMusicState({ status, channel: bytes[0] & 0x0f, data: bytes.slice(1) });
}

Пример не принимает System Exclusive, realtime и системные сообщения. Их включение должно быть отдельным изменением с лимитом размера и документацией. Не журналируйте байты по умолчанию, ограничивайте частые события и сохраняйте короткий отладочный фрагмент только по явному запросу.

Минимизируйте метаданные и храните запасной путь

Виртуальная клавиатура, импорт файла, клавиши или партитура сохраняют задачу без MIDI. Страница должна сказать, что браузер не показал порт, не притворяясь управлением инструментом. Разделяйте музыкальную модель и адаптер: после отключения редактирование продолжается, а новый порт требует явного выбора.

Короткая запись может включать поддержку, разрешение, тип и состояние порта, локальную метку, счётчик принятых сообщений и дату. Полный производитель, карта портов, сырые байты и посторонние свойства браузера не нужны. Имя порта способно раскрыть модель оборудования или студию, поэтому задайте цель и срок хранения.

Таблица результатов

РезультатБезопасное действиеНе утверждать
Нет API или защищённого контекстаОставить клавиатуру или файлУниверсальную поддержку
Разрешение отклоненоОбъяснить и сохранить задачуОтказ названного устройства
Доступ без портовПоказать настройку и запасной режимОтсутствие физических инструментов
Вход подключёнУстановить проверенный listenerВладение человеком
Выход подключёнТребовать выбор перед отправкойСоздание или слышимость звука
statechange отключёнУдалить listener и отметить offlineАвтоматическое возвращение
Неверные байтыОтбросить и классифицироватьИдентичность отправителя
Запрошен SysExПопросить отдельное решениеБезопасность данных по умолчанию

Проверка с BotBrowser

Управляемый контекст BotBrowser может выполнить детерминированную кнопку, синтетический запасной режим, ограниченный валидатор и видимую запись портов. Записывайте наличие API, результат разрешения, счётчики, statechange и видимость запасного режима. unsupported, permission-denied и no-port допустимы, если не заявляется воспроизведение звука. Документация расширенных возможностей BotBrowser не обещает MIDI-устройство на runner.

{
  "api": "requestMIDIAccess",
  "permission": "unknown",
  "ports": { "inputs": 0, "outputs": 0 },
  "states": ["fallback"],
  "messagesAccepted": 0,
  "rawBytesRetained": false,
  "physicalInstrument": "not-asserted"
}

Повторяйте fixture, меняя одну переменную: версию браузера, защищённый контекст, результат разрешения, подключение или тип сообщения. Сравнивайте первое видимое различие и не распространяйте его на каждый драйвер и систему.

Итог

Web MIDI является меняющейся возможностью браузера, ограниченной разрешением. Запрашивайте её видимым действием, используйте минимальный охват, показывайте живую карту портов, проверяйте сообщения и освобождайте listeners при отключении. BotBrowser может повторить видимые ветви в разрешённых контекстах; он не создаёт инструмент, не обходит разрешение, не гарантирует порт и не выводит владение из метаданных MIDI.

Открытые источники

Дальше

Сравните Web Bluetooth: разрешения и приватность устройств и Web USB: доступ к устройству и границы приватности.

#Web MIDI API#Разрешения#Приватность Устройств#Браузерное Оборудование#BotBrowser

Эта статья входит в руководство: Поверхности веб-платформы: карта проверки

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.