读取MIDI文件

9
什么是阅读多轨MIDI文件(按时间顺序)的最佳方式?(Java)
注:我不想播放MIDI文件,只想读取信息。
几个想法:
1.是否可以假设没有音符事件短于1/64个音符?或者应该访问每个轨道,在其他所有轨道的刻度之后再移动到下一个刻度?
  • 假设没有midi事件短于1/64的音符,并通过该固定增量将当前位置刻度计数向前移动。
  • 访问每个轨道并前进到下一个最早的刻度

1
不要假定只有1/64的音符,例如还有1/128的音符。但是,可以安全地假定数据存储在一个字节中(您可以使用MidiMessage类进行评估)。 - Jasper Bekkers
@yxk 我也喜欢从Midi文件中制作适当的乐谱。你有什么指南可以给我开始吗? - Kalpesh
Anvil Studio有一个$60的选项,可以从midi文件打印乐谱。 此外,有人知道任何开源Java选项读取MIDI文件吗? - Matthew Cordaro
2个回答

3

JFugue可以读取MIDI文件并按照时间顺序排序消息。

结果可以作为JFugue MusicStrings读取(例如,C#,第5个八度,全音符=“C#5w”),或者您可以编写自己的ParserListener并将其附加到MidiParser,以便您可以输出自己的文本。


0
在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 文件(即使有多个轨道)


我并不一定要播放这个序列,只是想在轨道中获取事件消息。 - worbel
@srand 我假设这只是一个例子,你可以使用MidiSystem、Sequence和Track类来读取存储在文件中的MidiEvents。 - Jasper Bekkers
@Jasper 是的,这就是我目前正在做的事情,但它是对 MIDI 文件进行串行/顺序读取(而不是按时间顺序)。 - worbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接