【问题标题】:Reading MIDI Files读取 MIDI 文件
【发布时间】:2009-07-25 19:43:20
【问题描述】:

读取具有多个轨道的 MIDI 文件(按时间顺序)的最佳方法是什么? (Java)

注意:我不想播放 MIDI 文件,只是阅读消息。

几个想法:

假设没有短于 1/64 音符的音符事件是否安全?或者我应该访问每个轨道,并且只在所有其他滴答轨道之后移动到下一个滴答声

  • 假设没有短于 1/64 音符的 midi 事件,并将当前位置滴答计数移动该固定增量。
  • 访问每首曲目并进入下一个最早的刻度

【问题讨论】:

  • 假设 1/64 音符是不安全的,例如 1/128 也存在。但是,可以安全地假设数据存储在单个字节中。 (您可以使用 MidiMessage 类评估那些)。
  • @yxk 我也喜欢从 Midi 文件中创建合适的乐谱。有你和指导我开始吗?
  • Anvil Studio 有一个 60 美元的选项,可以从 MIDI 文件中打印乐谱。另外,有人知道读取 MIDI 文件的任何开源 Java 选项吗?

标签: java midi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我不一定要播放序列,只是获取曲目中的事件消息
    • @srand 我假设这只是一个示例,您可以使用 MidiSystem、Sequence 和 Track 类来读出文件中存储的 MidiEvents。
    • @Jasper 是的,这就是我目前正在做的事情,但是它是对 midi 文件的串行/顺序读取(而不是按时间顺序)。
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多