首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SysEx不会发送字节"AD“

SysEx不会发送字节"AD“
EN

Stack Overflow用户
提问于 2015-01-04 03:11:03
回答 2查看 210关注 0票数 2

好的,在用两种不同语言(Java和Cocoa)编写的两个不同的程序(我自己的和QLab)中,在两个不同的系统(Mac和PC)上尝试这一点,结果是相同的。所以我很困惑。

本质上,我试图发送以下Sysex信息:

代码语言:javascript
复制
F0 43 10 3E 12 01 00 33 00 00 00 00 AD 00 00 00 AD F7

当我发送它时,我的Midi监控程序(同样是两个不同的程序)要么说这个被发送了:

代码语言:javascript
复制
F0 43 10 3E 12 01 00 33 00 00 00 00 F7

然后这个被发送了:

代码语言:javascript
复制
Aftertouch Ch14 C-2 0
Invalid 1 Byte
Invalid 1 Byte

或者,另一个只是说三个后续,然后是来自Java的通道闭包。

因此,在仅对Mac程序进行故障排除之后,我发送了以下消息:

代码语言:javascript
复制
F0 43 10 3E 12 01 00 33 00 00 00 00 00 00 00 00 AD F7

上面写着我发了这个

代码语言:javascript
复制
F0 43 10 3E 12 01 00 33 00 00 00 00 00 00 00 00 F7

然后这个:

代码语言:javascript
复制
Invalid 1 Byte

如果这有帮助的话,我正在尝试发送的信息kInputFader雅马哈LS9。

赛克斯不喜欢AD字节吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-04 05:44:52

MIDI基本上只有7位。

看看这张表:http://midi.org/techspecs/midimessages.php

就像它说的,SysEx消息

  • F0开始
  • 可能只包含位于[00 .. 7F]范围内的字节。
  • 除了F7,它结束了SysEx消息。

MIDI主要是以Bytes格式发送的7位编码。只有少数特殊字节(如消息的起始字节)具有高位集。

当控制器支持超出[0..127]范围的值时,需要将值拆分为多个字节。

识别范围

下表帮助识别范围。

代码语言:javascript
复制
                Range                         |Data|Bytes
     unsigned     |           signed          |Bits|req'd
------------------+---------------------------+----+------
 0 ..         127 |         -64 ..         63 |  7 |  1
 0 ..       16383 |       -8192 ..       8191 | 14 |  2
 0 ..     2097151 |    -1048576 ..    1048575 | 21 |  3
 0 ..   134217728 |   -67108864 ..   67108863 | 26 |  4
 0 .. 17179869184 | -8589934592 .. 8589934591 | 34 |  5

意义在于该特定控制器支持的值范围,而不是实际值。例如,如果控制器支持值范围[0..1023],则始终需要2个字节,即使要发送的值是00只需要一个字节。

确定Java程序中的长度

如果您知道maxValue,可以使用以下算法确定长度:

代码语言:javascript
复制
public static int getDataLengthUnsigned(final int maxValue) {
    int ret = 1;
    while ((1 << (ret * 7)) <= maxValue) ret++;
    return ret;
}

int转换为MIDI的byte[]

这假设您的MIDI设备对小Endian格式的消息进行操作。通常情况是这样的,因为MIDI消息的音调弯曲是LSB第一。也许特快专递在某个地方说的东西应该是小安迪安,我不知道。

代码语言:javascript
复制
public static byte[] encodeAsSysExUnsigned(int value, final int maxValue) {
    if (value > maxValue || value < 0)
        throw new IllegalArgumentException(String.format("Value %d out of range [0 .. %d]", value, maxValue));
    final int dataLength = getDataLengthUnsigned(maxValue);
    final byte[] sysExData = new byte[dataLength];
    for (int i = 0; i < dataLength; i++, value >>>= 7)
        sysExData[i] = (byte) (value & 0x7F);
    return sysExData;
}   
票数 2
EN

Stack Overflow用户

发布于 2015-01-04 03:17:39

好吧,忘了这是MIDI。如果我错了,请纠正我,但除了标题之外,Sysex消息只能包含00-7F(0-127 12月)。

来源:http://beatwise.proboards.com/thread/1705/sysex-hardware-clips-help

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27761981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档