从 Midi 事件到 int 的十六进制字节数组
Hexadecimal byte array from a Midi event to int
我正在尝试通过 javax.midi
库检索 MIDI 文件的速度。
MidiMessage message = event.getMessage();
if(message instanceof MetaMessage)
MetaMessage mm = (MetaMessage) message;
System.out.println(Arrays.toString(mm.getData()));
}
我应该收到一个包含三个 ex 的数组,因为 Set Tempo 元消息(在这种情况下,只有 3 个字节指定毫秒数。
这就是 midi 事件 returns
0x07 0xA1 0x20
所以如果你加入他们你有 0x07A120 是 500,000 毫秒,但是 Java returns 在 print
[7, -95, 32]
首先是将它解析为十进制,然后我需要得到这个500,000的数字。我不知道怎么做,因为首先我需要加入所有十六进制,然后我会有数字,但我不知道怎么做。
有人能帮帮我吗?
MetaMessage.getData()
returns 字节数组,使用 Arrays.asList()
将其转换为字节列表,这就是打印字节列表的原因。
下面是一种从 TEMPO MetaMessage 计算每分钟节拍速度的方法。 mspq
变量(每季度毫秒数)是您要查找的值。
/**
* Get the tempo in BPM coded in a Tempo Midi message.
*
* @param tempoMsg Must be a tempo MetaMessage (type=81)
* @return
*/
static public int getTempoInBPM(MetaMessage tempoMsg)
{
byte[] data = tempoMsg.getData();
if (tempoMsg.getType() != 81 || data.length != 3)
{
throw new IllegalArgumentException("tempoMsg=" + tempoMsg);
}
int mspq = ((data[0] & 0xff) << 16) | ((data[1] & 0xff) << 8) | (data[2] & 0xff);
int tempo = Math.round(60000001f / mspq);
return tempo;
}
Here 您会在 java.
中找到更多 Midi 实用程序
int tempo = new BigInteger(mm.getData()).intValue();
会更简单
我正在尝试通过 javax.midi
库检索 MIDI 文件的速度。
MidiMessage message = event.getMessage();
if(message instanceof MetaMessage)
MetaMessage mm = (MetaMessage) message;
System.out.println(Arrays.toString(mm.getData()));
}
我应该收到一个包含三个 ex 的数组,因为 Set Tempo 元消息(在这种情况下,只有 3 个字节指定毫秒数。 这就是 midi 事件 returns
0x07 0xA1 0x20
所以如果你加入他们你有 0x07A120 是 500,000 毫秒,但是 Java returns 在 print
[7, -95, 32]
首先是将它解析为十进制,然后我需要得到这个500,000的数字。我不知道怎么做,因为首先我需要加入所有十六进制,然后我会有数字,但我不知道怎么做。
有人能帮帮我吗?
MetaMessage.getData()
returns 字节数组,使用 Arrays.asList()
将其转换为字节列表,这就是打印字节列表的原因。
下面是一种从 TEMPO MetaMessage 计算每分钟节拍速度的方法。 mspq
变量(每季度毫秒数)是您要查找的值。
/**
* Get the tempo in BPM coded in a Tempo Midi message.
*
* @param tempoMsg Must be a tempo MetaMessage (type=81)
* @return
*/
static public int getTempoInBPM(MetaMessage tempoMsg)
{
byte[] data = tempoMsg.getData();
if (tempoMsg.getType() != 81 || data.length != 3)
{
throw new IllegalArgumentException("tempoMsg=" + tempoMsg);
}
int mspq = ((data[0] & 0xff) << 16) | ((data[1] & 0xff) << 8) | (data[2] & 0xff);
int tempo = Math.round(60000001f / mspq);
return tempo;
}
Here 您会在 java.
中找到更多 Midi 实用程序int tempo = new BigInteger(mm.getData()).intValue();
会更简单