0

ボリューム レベルが 0 から 1 の間の浮動小数点値として表される場合、Universal SysEx Master Volumeメッセージのデータ バイトを作成する方法は?

これは、与えられた Sysex メッセージ ステータス バイト (0xF0) とデータ バイトを持つ Sysex メッセージ コンストラクターです。

new SysexMessage(0xF0, data, data.length)

MIDI 仕様によると、マスター ボリューム メッセージには 2 つのステータス バイトと 6 つのデータ バイト (ステータス バイトを除く) があり、最後の 2 つのデータ バイトはボリューム レベルを指定します。

0xF0 SysEx (ステータス)
0x7F ユニバーサル リアルタイム
0x7F チャネルを無視
0x04 サブ ID -- デバイス コントロール
0x01 サブ ID2 -- マスター ボリューム 0xLL
14 ビット ボリュームのビット 0 ~ 6 SysEx の終了 (ステータス)

したがって、私が間違っていなければ、データ バイトは次のようになります。

data = new byte[] { 0x7F, 0x7F, 0x04, 0x01, LL, MM }

私の質問は、0 から 1 の間のフロートボリューム レベルからLL および MMバイトを取得する方法です。

4

1 に答える 1

3

このような符号なし型の場合、最小の 14 ビット値はゼロで、最大値は 2 14 -1 = 16383 です。したがって、1.0 を 16383 に変換するには、それを掛けるだけです。

int value_14bits = (int)(float_value * 16383);

あなたが偏執的である場合は、範囲を確認してください。

value_14bits = Math.max(Math.min(value_14bits, 16383), 0);

次に、下位および上位の 7 ビット フィールドを抽出します。

data = new byte[] {
            0x7F, 0x7F, 0x04, 0x01,
            value_14bits & 0x7f,
            value_14bits >> 7 };
于 2014-10-16T06:49:08.917 に答える