2014-10-16 2 views
0

Если уровень громкости представлен как значение с плавающей точкой от 0 до 1, как создать байты данных универсального SysEx Master Volume?Как создать MIDI-сообщение громкоговорителя MIDI Sysex с уровня громкости?

Это Sysex конструктор сообщения с присвоенным статусом сообщения SYSEX байтами (0xF0) и байтами данных:

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

Согласно MIDI спецификации, есть 2 байт состояния и 6 байт данных в сообщении Master Volume (без статуса байта), с байтами последних двух данных с указанием уровня громкости:

0xF0 SysEx (Статус)
0x7F Универсального Realtime
0x7F пренебрегает канал
0x04 Sub-ID - Устройство управления
0х01 Sub-ID2 - Master Volume
0xLL Биты 0 до 6 из 14-разрядного объема
0xMM Биты 7 до 13 из 14-разрядного объема
0xF7 Конец SysEx (Статус)

Так что, если я не ошибаюсь, байты данных должны выглядеть следующим образом:

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

Мой вопрос заключается в том, чтобы получить LL и MM байт из поплавка уровня громкости между 0 и 1?

+0

0: 1 <> 0: 2^14 – obiwanjacobi

ответ

3

Для беззнакового типа, как это, smalles 14-битовое значение равно нулю, а наибольшее значение равно 2 -1 = 16383. Таким образом, чтобы преобразовать 1,0 до 16383, просто умножить на что:

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

Если вы параноик, проверьте диапазон:

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

Затем извлечь нижние и верхние семь-битовые поля:

data = new byte[] { 
      0x7F, 0x7F, 0x04, 0x01, 
      value_14bits & 0x7f, 
      value_14bits >> 7 }; 
Смежные вопросы