使用 MetaMessage getData() 和/或 MetaMessage 值从 java 中的 MIDI 文件中提取速度?
Posted
技术标签:
【中文标题】使用 MetaMessage getData() 和/或 MetaMessage 值从 java 中的 MIDI 文件中提取速度?【英文标题】:Extracting tempo from MIDI file in java using MetaMessage getData() and/or MetaMessage value? 【发布时间】:2020-04-17 21:14:57 【问题描述】:使用this thread 我已经弄清楚如何使用getData(),但是我得到的不是0x51,而是随机值,例如[B@37d78d93、[B@29d74462和[B@1c5ca652]
输出元消息本身也会产生类似的值,例如 javax.sound.midi.MetaMessage@364d4fca、javax.sound.midi.MetaMessage@5581f86d 和 javax.sound.midi.MetaMessage@3f011b2b
例如,使用
System.out.print ("the meta message is " + mm + ", ");
System.out.print ("the type of meta message is " + mm.getType());
System.out.println(" and the data is " + mm.getData());
输出
the meta message is javax.sound.midi.MetaMessage@3f011b2b, the type of meta message is 81 and the data is [B@1c5ca652
如何使用输出的mm
值末尾的值或取自mm.getData()
的值来获取 MIDI 文件的速度?
【问题讨论】:
你得到的是对象。您必须通过调用适当的访问器函数从这些对象中提取值。 【参考方案1】:一旦您获得节奏 MetaMessage,您就可以使用此代码以每分钟节拍数获得节奏。
/**
* Get the tempo in BPM coded in a Tempo Midi message.
*
* @param mm Must be a tempo MetaMessage (type=81)
* @return
*/
static public int getTempoInBPM(MetaMessage mm)
byte[] data = mm.getData();
if (mm.getType() != 81 || data.length != 3)
throw new IllegalArgumentException("mm=" + mm);
int mspq = ((data[0] & 0xff) << 16) | ((data[1] & 0xff) << 8) | (data[2] & 0xff);
int tempo = Math.round(60000001f / mspq);
return tempo;
【讨论】:
以上是关于使用 MetaMessage getData() 和/或 MetaMessage 值从 java 中的 MIDI 文件中提取速度?的主要内容,如果未能解决你的问题,请参考以下文章
使用 getData() 从 Firebase 存储下载 jpeg 图像时出现错误 13010“对象不存在”
意图过滤器:intent.getData() 返回 null