Java 读取MIDI文件

Java 读取MIDI文件,java,midi,Java,Midi,读取具有多个曲目的MIDI文件(按时间顺序)的最佳方法是什么?(爪哇) 注意:我不想播放MIDI文件,只需阅读消息即可 两个想法: 假设没有短于1/64音符的音符事件安全吗?或者我应该访问每一首曲目,只在所有其他曲目之后移动到下一首曲目 假设没有比1/64音符短的midi事件,并将当前位置记号计数移动该固定增量 访问每一个轨道,并进展到下一个最早的滴答声 在Java中,您可以通过以下方式读取midi文件: try { Sequencer sequencer = MidiSyst

读取具有多个曲目的MIDI文件(按时间顺序)的最佳方法是什么?(爪哇)

注意:我不想播放MIDI文件,只需阅读消息即可

两个想法:

假设没有短于1/64音符的音符事件安全吗?或者我应该访问每一首曲目,只在所有其他曲目之后移动到下一首曲目

  • 假设没有比1/64音符短的midi事件,并将当前位置记号计数移动该固定增量
  • 访问每一个轨道,并进展到下一个最早的滴答声

在Java中,您可以通过以下方式读取midi文件:

try {
        Sequencer sequencer = MidiSystem.getSequencer();
        sequencer.setSequence(MidiSystem.getSequence(yourMidiFile));
        sequencer.open();
        sequencer.start();
        while(true) {
            if(sequencer.isRunning()) {
                try {
                    Thread.sleep(1000); // Check every second
                } catch(InterruptedException ignore) {
                    break;
                }
            } else {
                break;
            }
        }

} catch(Exception e) {
        System.out.println(e.toString());
} finally {
    // Close resources
    sequencer.stop();
    sequencer.close();
}
此代码应该读取midi文件(即使有多个曲目)

可以读取midi文件并按时间顺序对消息进行排序


结果可以被解读为JFugue musicstring(例如,C-sharp,5th octave,whole note=“C#5w”),或者您可以编写自己的ParserListener并将其附加到MidiParser,这样您就可以输出自己的文本。

我不一定要播放序列,只需在tracks@srand我想这只是一个例子,您可以使用MidiSystem、Sequence和Track类来读取文件中存储的midi事件。@Jasper是的,这就是我目前正在做的,但是它是midi文件的串行/顺序读取(而不是按时间顺序)。假设1/64音符,例如1/128音符也存在是不安全的。但是,可以安全地假设数据存储在单个字节中。(您可以使用MidiMessage类来评估它们)。@yxk我也喜欢从Midi文件中创建适当的乐谱。你和我的向导启动了吗?Anvil Studio有一个60美元的选项,可以从midi文件打印乐谱。还有,有人知道读取MIDI文件的开源java选项吗?