MIDI Javascript:如何在没有库的情况下用Javascript生成单个MIDI音符

MIDI Javascript: how to generate a single MIDI note in javascript without libraries?

本文关键字:MIDI Javascript 情况下 音符 单个      更新时间:2024-06-25

我一直在阅读有关Web Midi API的文档,并尝试查看有关该主题的不同网站。有没有一种方法可以在不使用花哨的库之类的东西的情况下播放midi声音?假设我只想生成一个注释:我如何访问本地机器上的midi模块?有人能写一小段代码来播放一个音符,我可以简单地嵌入元素中吗?

Web Audio API不直接与MIDI设备接口,包括计算机上的软件MIDI合成器。为此,您需要使用(不太受支持的)WebMIDI API。

然而,如果你只想根据单个MIDI音符的参数播放一个简单的单声道音符,你可以将这些参数转换为与振荡器一起使用。来源:

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规范

MIDI是一种技术标准,用于描述连接各种电子音乐硬件的通信协议。

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

如果你想从浏览器播放声音,你需要一些库。例如,带有1500种乐器的钢琴键或MIDI文件的复杂播放器。

W3C Web MIDI API工作草案包含一个简单合成器的代码:https://www.w3.org/TR/webmidi/#a-简单单声道正弦波中频合成器

此实现可在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));