读取 MIDI 文件

Posted

技术标签:

【中文标题】读取 MIDI 文件【英文标题】:Reading MIDI Files 【发布时间】: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 文件中打印乐谱。另外,有人知道的任何开源 Java 选项吗? 【参考方案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 文件的串行/顺序读取(而不是按时间顺序)。

以上是关于读取 MIDI 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 从一段 MIDI 文件中读取 MIDI 事件、消息

使用 AudioKit 从 MIDI 文件中读取音符

使用 NAudio 从 MIDI 文件中读取音符

NAudio 和 Midi 文件读取

music21:读取 MIDI 文件的 BPM 和乐器信息并将其写回文件

如何读取 MIDI 文件、更改其乐器并将其写回?