从 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();

会更简单