如何让node-easymidi与FL Studio同时读取MIDI键盘输入?
解决Windows下Node.js(node-easymidi)与FL Studio同时读取MIDI键盘的问题
这个坑我之前踩过,本质是Windows系统下WinMM MIDI API的独占访问限制——FL Studio运行时会以独占模式占用你的CASIO MIDI设备,导致node-midi(node-easymidi的底层依赖)无法再打开它,就会抛出你看到的MidiInWinMM::initialize: no MIDI input devices currently available错误。下面给你几个可行的解决办法:
方法1:换用支持共享访问的MIDI库
node-midi的官方版本不支持MIDI设备的共享打开,但有一个维护活跃的fork @julusian/midi 支持这个功能,还有适配它的@julusian/easymidi,完全兼容你原来的代码逻辑:
步骤:
- 卸载旧依赖,安装新库:
npm uninstall node-midi easymidi npm install @julusian/midi @julusian/easymidi
- 修改代码启用共享模式:
const easymidi = require('@julusian/easymidi'); const inputs = easymidi.getInputs(); const outputs = easymidi.getOutputs(); console.log(inputs, outputs); // 依然能识别你的CASIO设备 // 创建输入时添加shared参数启用共享 const input = new easymidi.Input('CASIO USB-MIDI 0', { shared: true }); input.on('noteon', (msg) => console.log('Note On:', msg)); input.on('noteoff', (msg) => console.log('Note Off:', msg));
这样设置后,FL Studio和Node应用就能同时读取同一个MIDI设备的输入了。
方法2:用虚拟MIDI路由工具转发信号
如果不想换库,可以用虚拟MIDI工具把物理设备的信号复制到多个虚拟端口,让FL和Node各自连接一个虚拟端口:
步骤:
下载安装LoopMIDI(免费轻量)或者MIDI Ox(功能更全),以LoopMIDI为例:
- 打开软件后点击
+,创建两个虚拟MIDI端口,比如命名为MIDI Shared 1和MIDI Shared 2
- 打开软件后点击
设置信号转发:
- 在LoopMIDI的路由界面,把你的
CASIO USB-MIDI输入分别映射到两个虚拟输出端口
- 在LoopMIDI的路由界面,把你的
修改Node代码连接虚拟端口:
var easymidi = require('easymidi'); var inputs = easymidi.getInputs(); console.log(inputs); // 现在能看到你创建的虚拟端口 var input = new easymidi.Input('MIDI Shared 1'); // 连接其中一个虚拟端口 input.on('noteon', function (msg) { console.log(msg); }); input.on('noteoff', function (msg) { console.log(msg); });
然后在FL Studio的MIDI设置里选择另一个虚拟端口作为输入,两个程序就能同时收到MIDI信号了。
方法3:调整FL Studio的MIDI独占设置
部分DAW支持关闭MIDI设备的独占模式,你可以试试:
- 打开FL Studio的
Options > MIDI Settings - 在你的CASIO设备对应的输入选项里,查找
Exclusive Mode(独占模式)开关,将其关闭 - 保存设置后重启FL Studio,再启动Node应用测试
不过这个方法不一定对所有设备生效,有些硬件驱动本身会强制独占,所以前两个方法更可靠。
内容的提问来源于stack exchange,提问作者ー PupSoZeyDe ー
相关产品推荐
相关产品推荐

