Java 从 MIDI 序列获取乐器列表

Java get instrument list from MIDI Sequence

我需要从一般 MIDI 文件中获取音符、时间戳和乐器列表等所有内容。

几乎一切都完成了,但我还需要每个乐器对应每个音轨,否则如果我不知道它们属于哪种乐器,这些音符就没有用了。

看来这是通过获取补丁列表来完成的,补丁具有MIDI序列使用的音库中的乐器代码。

这看起来很简单,但是当我尝试在 Sequence 对象上使用 getPatchList() 时,它 returns 一个空数组。

问题?:这似乎从未在 java MIDI 库 (??) 中真正实现过,至少从我发现的情况来看是这样:

/**
 * Get an array of patches used in this sequence.
 * 
 * @return an array of patches used in this sequence
 */
public Patch[] getPatchList()
{
  // FIXE: not quite sure how to do this yet. 
  throw new UnsupportedOperationException("Can't get patch list yet");
}

来源:javax.sound.midi.Sequence

显然 Android 开发人员也想不通。 注意这是一个正常的java程序,与Android无关:

public Patch[] getPatchList() {
    //FIXME
    /*
     * I don't understand how to works this method, and so
     * I simply return an empty array. 'patches' initializes
     * in the constructor as empty vector 
     */
    Patch[] patch = new Patch[patches.size()];
    patches.toArray(patch);
    return patch;
}

来源:javax.sound.midi.Sequence

那么有什么办法可以解决这个问题吗?
有没有其他方式获得乐器?
为什么没有实施?
自 2005 年以来真的没有人需要这个吗?

要将 MIDI 设备连接到 select 乐器,您可以向它发送 Program Change 消息(这也会考虑 Bank Select 控制器的当前设置)。

要获得序列中所有补丁的列表,需要遍历所有消息的列表,并收集所有程序编号(以及当时有效的所有库编号)。

如果您的实现没有这样做,您必须手动执行此操作。