MIDI 1.0规范中“做出相应响应”针对单字节NRPN/RPN参数号的含义
MIDI 1.0中NRPN/RPN单字节参数的处理逻辑
一、参数编号(仅收到MSB或LSB)的响应规则
先明确规范原文的要求:
- [...]接收方应等待收到参数编号的LSB和MSB,以确保操作的是正确参数。
- 若发送方仅发送LSB或MSB来更改参数编号,接收方应能够做出相应响应。[...]
针对疑问的行业通用实现与规范隐含逻辑如下:
- 缺失字节的取值规则:
必须区分RPN和NRPN类型,沿用该类型上一次设置的对应字节值:- 若此前设置过该类型(如RPN)的MSB/LSB,仅收到单个字节时,用新字节替换对应位置,保留另一个历史值组合成新参数编号。比如之前RPN的MSB=0、LSB=16,之后仅收到LSB=32,新编号为
0*128+32=32。 - 若从未设置过该类型,或刚执行
Reset All Controllers(CC121),该类型的MSB和LSB默认值为127(代表“无有效参数”)。此时仅收到单个字节(如RPN MSB=0),新编号为0*128+127=127,属于预留的无效状态。
- 若此前设置过该类型(如RPN)的MSB/LSB,仅收到单个字节时,用新字节替换对应位置,保留另一个历史值组合成新参数编号。比如之前RPN的MSB=0、LSB=16,之后仅收到LSB=32,新编号为
- 后续数据输入消息的处理:
只有当组合后的参数编号是设备支持的有效编号时,才会处理后续的参数值消息(CC6/CC38);若组合后是无效编号(如上述的127),则忽略后续的参数值输入。
二、参数值(仅收到LSB)的处理规则
针对参数值单字节的情况,行业默认逻辑是:
- 若此前设置过该参数的MSB值,仅收到LSB时,沿用历史MSB值组合成新参数值。比如之前某参数的MSB=1、LSB=64,之后仅收到LSB=32,新值为
1*128+32=160。 - 若首次设置该参数,多数设备默认MSB=0,此时参数值直接为LSB的数值(0~127)。
三、行业实现与MIDI 2.0的补充
- 行业标准实现:
主流MIDI设备(如Yamaha、Roland合成器)均遵循上述“沿用历史值”的逻辑,这也是MIDI制造商协会(MMA)推荐的兼容性方案。 - MIDI 2.0的改进:
MIDI 2.0采用32位的Universal MIDI Packet(UMP)结构,RPN/NRPN的参数编号和值都以完整16位形式传输,从根源上解决了单字节缺失的问题。同时,MIDI 2.0明确了所有参数的默认状态和更新规则,不再依赖模糊的历史值逻辑。
内容的提问来源于stack exchange,提问作者root
相关产品推荐
相关产品推荐

