MIDI Javascript: как создать одну MIDI-ноту в javascript без библиотек?

Я читал документацию по Web Midi API и пытался посмотреть разные сайты на эту тему. Есть ли способ воспроизведения миди-звука без использования модных библиотек и прочего? Допустим, я просто хочу сгенерировать одну заметку: как мне получить доступ к модулю midi, который присутствует на вашем локальном компьютере? Может ли кто-нибудь написать небольшой фрагмент кода, который воспроизводит одну ноту и которую я могу просто вставить в элемент?

2 ответа

Web Audio API не взаимодействует напрямую с MIDI-устройствами, включая программные синтезаторы MIDI на вашем компьютере. Для этого вам нужно будет использовать (не очень хорошо поддерживаемый) Web MIDI API.

Однако, если вы просто хотите воспроизвести простую монофоническую ноту на основе параметров одной ноты MIDI, вы можете преобразовать эти параметры для использования с источником Oscillator:

audio = new (window.AudioContext || window.webkitAudioContext)()

function playNote(frequency, volume, duration)
{
    var halfPeriod = 1/frequency/2
    if(duration > halfPeriod) duration -= duration % halfPeriod
    else duration = halfPeriod

    var g = audio.createGain()
    var o = audio.createOscillator()
    o.connect(g)
    g.connect(audio.destination) // so you actually hear the output

    o.frequency.value = frequency
    g.gain.value = volume
    o.start(0)
    o.stop(audio.currentTime + duration)
}

Три первые строки функции предназначены для настройки продолжительности, чтобы избежать срезания генератора, пока волна не находится в нуле, так как это может вызвать неприятный треск.

Обновлено с последней (черновик декабря 2015 г.) спецификации WebAudio

MIDI- это технический стандарт, описывающий протокол связи, который соединяет широкий спектр электронного музыкального оборудования.

MIDI вообще не описывает звук и звук. Вы не можете играть на инструменте через MIDI-канал. Вместо этого вы можете отправить команду на MIDI-клавиатуру или MIDI-синтезатор.

Вам нужна библиотека, если вы хотите воспроизводить звук из браузера. Например, клавиши пианино с 1500 инструментами или сложный проигрыватель для файлов MIDI.

Рабочий проект W3C Web MIDI API включает код простого синтезатора: https://www.w3.org/TR/webmidi/#a-simple-monophonic-sine-wave-midi-synthesizer

Эта реализация доступна на GitHub: https://github.com/cwilso/monosynth

Демо-версия кода: http://webaudiodemos.appspot.com/monosynth/

Загрузив демонстрационный скрипт, вы можете играть ноты без физического MIDI-устройства. Воспроизведение C4 (#60 в MIDI) примерно 1 секунду:

noteOn(60);
await new Promise(resolve => setTimeout(noteOff, 1000, 60));
Другие вопросы по тегам