Как играть произвольные MIDI-ноты с помощью javascript?
Чтобы уточнить: я не хочу генерировать MIDI файл и не хочу играть в MIDI файл, я хочу играть на MIDI-заметках "на лету".
Я попытался использовать https://github.com/mudcube/MIDI.js в качестве библиотеки MIDI, и он работает несколько.
Я могу играть в ноты, вызывая MIDI.noteOn(0,midiNumber,100);
. Тем не менее, это играет заметку в течение пары секунд, а затем сужается, даже если я никогда не звоню MIDI.noteOff
.
Я не верю, что именно так работает MIDI. Я хочу иметь возможность называть noteOn и играть в ноту и поддерживать до тех пор, пока не вызывается noteOff.
Предполагаемые браузеры: современный firefox/chrome.
Ответы
Ответ 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.