读取 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 事件、消息