【问题标题】:How do I calculate the number of ticks per measure from a MIDI file如何从 MIDI 文件计算每个小节的节拍数
【发布时间】:2020-03-12 07:17:28
【问题描述】:

我正在尝试从 MIDI 文件计算每个小节(小节)的节拍数,但我有点卡住了。

我有一个 MIDI 文件,我可以从中提取以下信息(在元消息中提供):

@0: 拍号:4/4,节拍器脉冲:24 MIDI clock ticks per click,每拍 32 分音符数:8

有两条节奏信息,我不确定它们是否相关:

@0: 每四分音符微秒数:400000,每分钟节拍数:150.0

@1800: 每四分音符微秒数:441176,每分钟节拍数:136.0001450668214

通过反复试验,查看 Note On 消息,并查看 Garageband 中的 MIDI 文件,我可以“猜测”每个小节的节拍数为 2100,带有四分音符 525 节拍。

我的问题是:我可以使用上面提供的速度信息到达2100 号码吗?如果可以,如何?还是我没有从 MIDI 文件中解析出足够多的信息,是否还有其他一些我需要查看的控制消息?

【问题讨论】:

  • 速度消息不相关。您需要文件头中的每季度刻度值。
  • 你是对的。我忘记了标题,只是看着轨道。标题将PPQ 设为480,这意味着我用525 有点过头了。如果您希望将您的评论重新定义为答案,我很乐意接受。
  • 我懒得查文档了;只需用工作代码回答自己。

标签: midi javax.sound.midi


【解决方案1】:

使用以下 Java 11 代码提取每个度量的刻度。这假设每个小节有 4 个四分音符。

public MidiFile(String filename) throws Exception {

    var file = new File(filename);
    var sequence = MidiSystem.getSequence(file);
    System.out.println("Tick length: " + sequence.getTickLength());
    System.out.println("Division Type: " + sequence.getDivisionType());
    System.out.println("Resolution (PPQ if division = " + javax.sound.midi.Sequence.PPQ + "): " + sequence.getResolution());
    System.out.println("Ticks per measure: " + (4 * sequence.getResolution()));

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多