2

JavaSound APIを使用して、MIDIシステムエクスクルーシブ(Sysex)メッセージを外部MIDIデバイス(電子キーボード)に送信しています。ヤマハのマニュアルによると、キーの1つを点灯させるために送信するデータは、次の一連のバイトです:F0 43 7F 00 00 03 0041F7。

SysexMessageのJavaDocによると、メッセージのデータを送信する正しい方法は。を使用することsetMessage(int status, byte[] data, int length)です。この場合、F0(または10進数で240)がステータスであり、その他すべてがデータです。これには、Sysexメッセージの終わりを示す最後のF7(10進数で247)が含まれます。

問題は、Javaのバイトが-128..127の範囲に制限されているため、F7をバイト配列で送信できないことです。しかし、JavaDoc for SysexMessageはこの事実に気づいていないようで、「このメッセージにメッセージのシステム専用データがすべて含まれている場合は、ステータスバイト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 に答える