用Javascript生成实时MIDI

12

我进行了一些研究,似乎JavaScript和MIDI目前并不兼容。至少根据Google上的说法是这样的。

如此话题所述: 在JavaScript中生成MIDI,可以创建一个文件,无论是在JavaScript或服务器端,并像播放普通文件那样播放它。

但是,我真的想发送单个的MIDI事件,“实时”地,就像是用户的持续交互一样。 我猜我的备选方案是创建一个Java小程序来执行此操作,但这样我的应用就不再是纯HTML5了。

我还听说HTML5的音频支持现在不太出名,因此我也想知道,如果现在没有解决方案,未来可能的结果是什么?

谢谢。

3个回答

3
请参考John Resig的博客文章中的音乐嵌入部分。(出于某种原因,Resig链接的马里奥游戏在Firefox中为我播放声音,但在Chrome或Safari中没有;值得探究原因)。
这个想法是使用data URI将数据的base64编码版本嵌入到HTML文件本身中。因此,您可以编写JavaScript持续生成MIDI格式的数据,然后对其进行base64编码,并将其注入到HTML5 <audio>元素中。

这就是我已经在生成整个序列的过程中所做的,而且我认为我将不得不坚持这样做来演奏单音。问题是延迟有点明显,即使它并不是那么大。但我想除了使用Java小程序之外,这现在是最好的解决方案了。 - Manux
你能贴一下你的代码链接吗?通过在后台不断生成音调并创建多个音频元素来填充它们,可能可以减少延迟。 - Long Ouyang

1

我认为目前你最好的选择是通过xhr或websockets从你的HTML应用程序与运行在服务器上的后端系统进行通信,该系统可以将其实际翻译成midi事件。你可能会发现已经有许多可用的彗星服务器可以使你的生活更轻松,但是许多midi应用程序需要相对较低的延迟,而你很难将彗星技术降低到100毫秒以下。


这并没有真正帮助,我仍然需要找到一种方法将MIDI事件发送到客户端的操作系统。 - Manux

0
如果HTML5是一个选项,你可以尝试使用WebSockets生成OSC事件,并使用服务器代理转换为MIDI信号。
我不确定JavaScript中的定时器是否稳定到足以产生准确的时间。

等等,那我得将音乐流式传输到客户端吗?以那种速度,我不明白为什么要使用OSC。或者,一旦我在客户端的机器上获得了MIDI信号,我应该把它们发送到哪里呢?:^? - Manux
OSC事件不是直播音乐流,而是通过UDP或TCP传输的控制信号。在桌面上,您可以运行一个小代理程序,将OSC事件转换为MIDI信号,并发送到您想要控制的MIDI设备。 - Nikolaus Gradwohl
那么我需要在客户端的机器上安装那个代理吗?我猜这在Javascript中是做不到的。 - Manux
我认为这在JavaScript中无法完成 - 代理必须是在本地机器上运行的应用程序。 - Nikolaus Gradwohl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接