MIDI Javascript:如何在没有库的javascript中生成单个MIDI音符?

时间:2015-02-28 04:41:18

标签: javascript api web midi web-midi

我一直在阅读有关Web Midi API的文档,我试图查看有关该主题的不同网站。有没有办法播放midi声音而不使用花哨的库和东西?让我们说我只想生成一个注释:如何访问本地计算机上存在的midi模块?任何人都可以编写一小段代码来播放单个音符并且我可以简单地嵌入元素中吗?

3 个答案:

答案 0 :(得分: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年12月草案)WebAudio规范

答案 1 :(得分:0)

MIDI是描述连接多种电子音乐硬件的通信协议的技术标准。

MIDI根本不描述音频和声音。您无法通过MIDI通道演奏乐器。代替此,您可以向MIDI键盘或MIDI合成器发送命令。

如果要从浏览器播放声音,则需要一些库。例如piano keys with 1500 of instrumentscomplex player for MIDI files

答案 2 :(得分:0)

Web MIDI API的W3C工作草案包括一个简单的合成器的代码: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(MIDI中的#60)大约1秒钟:

noteOn(60);
await new Promise(resolve => setTimeout(noteOff, 1000, 60));