MIDI 按钮松开后又触发一次,怎样统一 Note Off 与零力度 Note On
把MIDI按钮映射到节目触发时,要先将Note Off和零力度Note On统一识别为释放。若只按状态高四位等于9就触发,松开按钮发送的零力度Note On也会再次启动节目。事件归一化与业务动作映射应分成两个可检查步骤。
先固定输入与适用条件
本例限定MIDI 1.0音符消息,按通道与note组成门控键,不把音符号直接当成标准展项编号。释放速度可以存在于真正的Note Off中,而零力度Note On没有可变释放速度;业务只需要pressed或released时,可以保留原始字段同时归一化。
本篇的OSC内容限定1.0规范,MIDI内容限定1.0字节消息;未涉及MIDI 2.0的UMP编码。桥接动作属于接收应用约定,不能从协议格式推断产品已经支持。
按字段与边界执行
-
保存状态字节、note和velocity,先验证每个数据字节均在零到127。不能因为监视器写着Note On,就忽略力度为零的特殊含义。
-
将8n消息归为released,将9n且力度大于零归为pressed,将9n且力度为零归为released。保留原始消息类型,方便分析设备习惯。
-
为每个通道和note维护状态,首次按下只触发一次,重复pressed是否忽略由项目约定。释放事件只清除门控,不再执行节目启动。
-
用两种释放方式各跑一遍同样的业务映射,并检查未知通道及未配置note如何处理。设备掉线后门控复位策略还需要另行定义,不能靠猜测补一条释放。
用具体样例核对结果
第一组90 3C 64后跟90 3C 00,第二组90 3C 64后跟80 3C 40。两组都会产生一次pressed和一次released,最终门控为空,各触发一次虚拟cue。附件解析器实际比较两组归一化结果,但不会向播放软件发送命令;cue是示例输出标签。
通过条件是两种释放路径得到同样门控结果,释放不会触发开播,状态键同时包含通道和note。只按note存状态会让两块不同通道的控制器互相释放;完全丢弃Note Off则会导致门控一直按下。若目标桥接软件本身已经归一化,不要再叠加一个会把正常重复事件吞掉的未知过滤器,先记录它的实际行为。
下载与复现
analyze.py、input.json、result.json。
input保存两组原始hex,result同时给出原消息、规范化事件和虚拟触发数量。现场对接应另外补充端口身份、映射表和断连策略,本文算法通过不能替代真实控制器按键测试。
把输入与脚本保存到同一个本地目录后执行 python analyze.py,脚本只读取输入、计算并重写同目录的结果文件。先保留原始附件副本,再将自己的脱敏输入另存为新版本,记录输入摘要与执行日期;不要把合成字段覆盖成看似真实的现场日志。
已用 Python 3.12.4 实际运行附件算法并检查断言。结果来自同目录合成输入;没有接入真实NDI源、控制器、灯具、接收卡或LED屏,不能据此填写现场验收通过。
对接下一步与一级来源
基础背景可看MIDI 控制协议在展厅的应用速查。相关流程收在展厅中控专题;需要项目对接时,带上本文输入及结果向SoftControl核对实际能力。
一级来源核对日期:2026-10-24。原始协议规则、本文原创运算和目标系统行为应分别留证;附件计算正确,不等于设备已经按该参数工作。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。