2010-08-02 93 views
12

我做了一些研究,似乎JavaScript和MIDI近来不太合拍。谷歌说至少如此。从Javascript生成现场MIDI

正如本主题中所述: generating MIDI in javascript,可以在Javascript或服务器端创建一个文件,并像播放普通文件一样播放它。

但是,我真的希望能够发送各种midi活动,“活”,因为这将是一个不断的用户交互。 我想我的计划B将创建一个Java applet来做到这一点,但是我的应用程序不再是纯HTML5了。

我也听说过HTML5的音频支持现在不是很出名,所以我也想知道,如果现在没有解决方案,那么未来可能会有哪些结果?

谢谢。

回答

3

查看this blog post by John Resig的音乐嵌入部分。 (出于某种原因,Resig链接的Mario游戏在Firefox中播放声音,但不是Chrome或Safari;这是值得研究的原因)。

想法是,您使用data URI在HTML文件本身内嵌入base64编码版本的数据。所以你可以写Javascript来连续生成MIDI format,然后encode it in base64,然后将其注入到HTML5 <audio>元素

+0

这就是我已经在做的整个序列,我会认为我必须坚持它来播放单个音符。问题在于延迟有点明显,即使它并不那么大。但我猜想没有使用Java applet,这是目前最好的解决方案。 – Manux 2010-08-07 17:10:48

+0

你能发布一个到你的代码的链接吗?通过在背景中持续生成色调并创建多个音频元素来填充它们,可以减少延迟。 – 2010-08-07 18:49:17

0

如果html5是一个选项,您可以尝试使用websockets生成osc事件并使用服务器代理将它们转换为midi信号。

我不知道的是,如果JavaScript中的计时器足够稳定以产生准确的计时。

+0

等待,所以我将不得不将音乐流到客户端?以那个速度,我不明白我为什么会使用OSC。或者,一旦我在客户端的机器上获得了MIDI信号,我应该在哪里发送它们:^? – Manux 2010-08-02 18:45:47

+0

osc事件不是流式传输到用途的现场音乐,而是通过udp或tcp传输的控制信号。在桌面上,您可以运行一个小型代理,将osc事件转换为midi信号,并将其发送到您想要控制的midi设备 – 2010-08-02 19:01:24

+0

因此,我必须在客户机上安装该代理服务器?我想我不能用Javascript做到这一点。 – Manux 2010-08-02 19:11:15

1

我相信您目前的最佳选择是通过xhr或websockets从您的HTML应用程序与您的服务器上运行的后端系统进行通信,该系统可以实际转换为midi事件。你可能会发现许多已经可用的彗星服务器中的一个可以让你的生活变得更轻松,然而许多midi应用程序需要相对较低的延迟,并且你会很难让彗星技术的下降远低于100ms。

+0

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