MuleRun通过Web MIDI API接入外部MIDI设备,需四步实现:一、在Chrome/Edge中启用并授权MIDI权限;二、用Custom Script监听Note On等消息并存为变量;三、将CC控制器映射至表单字段;四、对串口MIDI设备使用Web Serial API解析字节流。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望在MuleRun中接入外部MIDI设备以实现音乐控制、实时参数映射或音序触发,则需通过浏览器端Web MIDI API桥接硬件信号。MuleRun本身不内置MIDI驱动,但支持在兼容环境中调用系统级MIDI接口并将其事件流转化为可编程变量。以下是实现此连接的具体方法:
一、启用浏览器Web MIDI API权限并授权设备访问
该步骤是所有MIDI交互的基础,确保Chrome或Edge浏览器已开启Web MIDI功能,并允许MuleRun页面访问本地MIDI端口。未完成此授权将导致设备列表为空或onstatechange事件无响应。
1、使用Chrome 115+或Edge 115+浏览器访问https://app.mulerun.ai。
2、点击地址栏左侧的锁形图标,选择“网站设置”。
3、在“权限”列表中找到“MIDI设备”,将其设置为“允许”。
4、刷新页面后,在MuleRun任意支持指令输入的区域键入:midi:connect --auto,系统将自动扫描并列出已连接的MIDI输入设备(如Akai MPK Mini、Novation Launchkey等)。
二、配置MIDI消息监听器并绑定至MuleRun变量
此方式通过JavaScript运行时注入监听逻辑,将MIDI通道消息(Note On/Off、CC、Pitch Bend等)实时映射为MuleRun流程中可引用的变量,供后续Agent调用或条件判断使用。
1、在MuleRun工作流编辑器中插入一个“Custom Script”节点。
2、在脚本内容区粘贴以下代码段:
if ('requestMIDIAccess' in navigator) { navigator.requestMIDIAccess().then(access => { access.inputs.forEach((input, id) => { input.onmidimessage = e => { const cmd = e.data[0] >> 4; const ch = e.data[0] & 0xf; const note = e.data[1]; const vel = e.data[2]; if (cmd === 9 && vel > 0) { mule.setVar('midi_note', note); mule.setVar('midi_velocity', vel); } }); }); }); }
3、保存节点后启用该流程,确保MIDI键盘处于通电且USB连接状态。
4、在后续节点中可通过表达式${midi_note}或${midi_velocity}直接读取最新触发音符与力度值。
三、使用MIDI Control Change映射为结构化表单字段
该方法适用于将旋钮、推子、踏板等连续控制器(CC消息)作为MuleRun交互式表单的物理输入源,替代鼠标拖动,提升音频工作流操作效率。
1、在Input Collector Agent配置中,为某字段(如“混响深度”)启用“MIDI CC绑定”开关。
2、点击“扫描CC信号”,轻触目标旋钮,系统将自动捕获其CC编号(如CC#91)并建立映射关系。
3、设置数值范围:最小值对应CC值0,最大值对应CC值127;勾选“平滑采样”以消除抖动。
4、保存后,该字段输入框将显示为灰色禁用状态,实际值由物理旋钮实时驱动,并同步注入流程上下文变量input.reverb_depth。
四、通过Web Serial API桥接传统MIDI-USB串口设备
部分老旧MIDI接口(如M-Audio Midisport系列)仅提供串口输出,需借助Web Serial API绕过标准MIDI栈,直接解析原始MIDI字节流。此方式需用户手动指定波特率与数据帧格式。
1、在Chrome中访问chrome://flags,启用“Experimental Web Platform features”并重启浏览器。
2、在MuleRun中执行命令:serial:open --port 'MIDI_UART' --baud 31250。
3、确认设备在操作系统中识别为串口(Windows显示为COMx,macOS为/dev/cu.usbserial-*)。
4、在Custom Script节点中添加字节解析逻辑:当收到0x90开头的三字节序列时,提取第二个字节为note,第三个为velocity,并调用mule.setVar写入变量。

















