使用javascript连接midi键盘或其他实时midi输入?

时间:2011-06-28 23:39:15

标签: javascript midi

我想创建一个简单的可视化工具,它可以代表我在屏幕上播放midi键盘。我演奏了一种相对新颖的乐器类型,称为谐波表:

http://en.wikipedia.org/wiki/Harmonic_table_note_layout

http://www.soundonsound.com/newspix/image/axis49.jpg

并希望构建工具以简化其使用并教会其他人如何使用它们。

但是,我找不到一个很好的方法来获得midi进入javascript环境(或者,就此而言,Flash或Java没有大量帮助jiggery-pokery稍微超出我的范围,并且使用来自什么看起来相当陈旧和废弃的开源项目。在任何情况下,我都不太热衷于为这个项目工作。

是否有我错过的合适的图书馆或应用程序,这将使我能够做到这一点?

8 个答案:

答案 0 :(得分:13)

在寻找另一种解决方案时(基于Flash,使用Red5开源闪存服务器的功能 - 真的很难看,但我现在很绝望)我发现有人做了我需要用Java接口的东西与硬件。他们开始使用闪存解决方案,最近移植到Javascript。耶!

http://www.abumarkub.net/abublog/?p=505

不要让关于'概念证明'的警告劝阻你:基本功能似乎是坚实的,至少我能够投入的一切。

所以现在我正在路上,所以其他任何想要构建基于javascript的midi接口/合成器的人/你有什么。

我可以在javascript中操作实时midi!这比飞行汽车和喷气式飞机要好得多。

答案 1 :(得分:10)

我制作了一个NPAPI浏览器插件,可让您通过Javascript与MIDI设备进行通信。

目前,它适用于Chrome和Safari中的OSX以及Chrome中的Windows。

我正致力于支持其他浏览器(Firefox,Internet Explorer)和其他操作系统(Linux,Android,iOs)

请参阅:http://abumarkub.net/abublog/?p=754

答案 2 :(得分:8)

编辑:

我最近发布了这个模块https://github.com/hems/midi2funk这是一个node.js模块,它监听midi并通过socket.io广播它,所以如果你有幸在本地与你的客户端一起运行node.js服务可能会从中获得一些乐趣...

~~~~~

其他一些方便的链接,我认为对我来说最重要的是:

编辑:刚刚意识到线程已经老了,希望链接可以帮助某人(:

答案 3 :(得分:5)

Web MIDI API现已在Google Chrome 43+中使用。我甚至写了一个库,以便更容易使用它。如果您仍然感兴趣并且不关心它目前仅适用于Chrome,请查看:https://github.com/cotejp/webmidi

答案 4 :(得分:1)

出于明显的安全原因,大多数浏览器不允许访问除键盘和鼠标之外的任何硬件,因此除非将其作为其中一个设备插入,否则您不太可能访问midi设备。

您可以尝试找到一个将midi输出转换为按键的驱动程序,然后在浏览器中处理这些驱动程序,但这只是一个单机解决方案。

答案 5 :(得分:1)

我对即将到来的Web MIDI API感到非常兴奋。据我所知,它只是在讨论中,尚未进入任何浏览器。

结合已经开始在某些浏览器中实现的Web Audio API,可以在浏览器中进行完整的软件合成。激动人心的时刻。

答案 6 :(得分:1)

由于Web MIDI API仍然是草稿,因此无法直接访问浏览器中的MIDI事件。

一个简单的解决方法可能是编写一个小型服务器,您可以在其中注册MIDI事件并使用websocket将它们传递给您的javascript。这可以在Python中轻松完成。

答案 7 :(得分:0)

现在的浏览器都支持MIDI收听。您只需要

navigator.requestMIDIAccess().then(requestMIDIAccessSuccess, requestMIDIAccessFailure);

和听键

function requestMIDIAccessSuccess(midi) {
            var inputs = midi.inputs.values();
            for (var input = inputs.next(); input && !input.done; input = inputs.next()) {
                console.log('midi input', input);
                input.value.onmidimessage = midiOnMIDImessage;
            }
            midi.onstatechange = midiOnStateChange;
        }

请参阅工作示例here