2

我正在使用 JavaSound API 将 MIDI System Exclusive (Sysex) 消息发送到外部 MIDI 设备(电子键盘)。根据雅马哈手册,点亮其中一个键的数据是这一系列字节:F0 43 7F 00 00 03 00 41 F7。

根据 SysexMessage 上的 JavaDoc,为消息发送数据的正确方法是使用setMessage(int status, byte[] data, int length). 在这种情况下,F0(或十进制的 240)是状态,其他的都是数据——包括末尾的 F7(十进制的 247),它表示 Sysex 消息的结束。

问题是Java中的字节被限制在-128..127的范围内,所以我不能在字节数组中发送F7。但是 SysexMessage 的 JavaDoc 似乎没有注意到这一事实,它说:“如果该消息包含该消息的所有系统专有数据,则它应该以状态字节 0xF7 结尾。”

关于如何正确发送最后一个字节的任何建议?我是否误解了 SysexMessage 的 JavaDoc?

4

2 回答 2

3

您正在以错误的方式考虑数字 F7。虽然 F7 相当于 247,但它也是 -9。但是,无论您将 F7 解释为数字 247(作为无符号字节)还是数字 -9(作为有符号字节),它仍然是相同的位序列 11110111,并且当该位序列通过线路传输时对于您的键盘,键盘可能会随心所欲地解释。

于 2010-04-01T13:46:28.950 回答
1

对于此类问题,您可以安全地将任何小于或等于 255 (0xFF) 的整数值转换为一个字节。原因是,正如 Jessup 所说,它们将由相同的位模式表示。

int i = 0xF7;
byte b = (byte)i;
于 2010-04-01T14:02:13.637 回答