Подтвердить что ты не робот

Как играть произвольные MIDI-ноты с помощью javascript?

Чтобы уточнить: я не хочу генерировать MIDI файл и не хочу играть в MIDI файл, я хочу играть на MIDI-заметках "на лету".

Я попытался использовать https://github.com/mudcube/MIDI.js в качестве библиотеки MIDI, и он работает несколько.

Я могу играть в ноты, вызывая MIDI.noteOn(0,midiNumber,100);. Тем не менее, это играет заметку в течение пары секунд, а затем сужается, даже если я никогда не звоню MIDI.noteOff.

Я не верю, что именно так работает MIDI. Я хочу иметь возможность называть noteOn и играть в ноту и поддерживать до тех пор, пока не вызывается noteOff.

Предполагаемые браузеры: современный firefox/chrome.

4b9b3361

Ответ 1

Это ошибка вашей версии MIDI.js:

var playChannel = function (id) {
    var note = notes[id];
    if (!note) return;
    var nid = (channel_nid + 1) % channels.length;
    var time = (new Date()).getTime();
    var audio = channels[nid];
    channel_map[note.id] = audio;
    audio.src = MIDI.Soundfont[note.id];
    audio.volume = volume;
    audio.play();
    channel_nid = nid;
};

Как вы можете видеть, playChannel загрузит данную заметку и воспроизведет ее. Поскольку атрибута autoloop нет, он не будет повторяться, поэтому вызов noteOff не требуется. Вы можете исправить это самостоятельно, если вы установите элемент audio в автоматический цикл.

Ответ 2

В качестве альтернативы http://mohayonao.github.io/timbre.js/ предоставляет различные звуковые генераторы, для которых могут быть вызваны noteOn и noteOff.

Ответ 3

Различные инструменты ведут себя по-разному. У пианино есть "внутренняя" записка, но орган этого не делает.

Кроме того, noteOn и noteOff зависят от реализации. modcu.be в реализации HTML5 воспроизводит файл OGG для каждой заметки, и он вообще не заботится о noteOff. Когда OGG заканчивается, звук останавливается. И autoloop не помогло бы для фортепиано в этом случае.

Ответ 4

Google для API веб-интерфейса. Он еще не реализован во всех браузерах, но Chris Wilson в GitHub есть polyfill.