使用 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 文件中提取速度?的主要内容,如果未能解决你的问题,请参考以下文章

拖放 dataTransfer.getData 为空

record.getData 不是函数

使用 getData() 从 Firebase 存储下载 jpeg 图像时出现错误 13010“对象不存在”

意图过滤器:intent.getData() 返回 null

WPF输入框Paste时出错,IDataObject的GetData抛出OutOfMemoryException

HTML5 拖放 getData() 仅适用于 Chrome 中的拖放事件?