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");
}
显然 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;
}
那么有什么办法可以解决这个问题吗?
有没有其他方式获得乐器?
为什么没有实施?
自 2005 年以来真的没有人需要这个吗?
要将 MIDI 设备连接到 select 乐器,您可以向它发送 Program Change 消息(这也会考虑 Bank Select 控制器的当前设置)。
要获得序列中所有补丁的列表,需要遍历所有消息的列表,并收集所有程序编号(以及当时有效的所有库编号)。
如果您的实现没有这样做,您必须手动执行此操作。
我需要从一般 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");
}
显然 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;
}
那么有什么办法可以解决这个问题吗?
有没有其他方式获得乐器?
为什么没有实施?
自 2005 年以来真的没有人需要这个吗?
要将 MIDI 设备连接到 select 乐器,您可以向它发送 Program Change 消息(这也会考虑 Bank Select 控制器的当前设置)。
要获得序列中所有补丁的列表,需要遍历所有消息的列表,并收集所有程序编号(以及当时有效的所有库编号)。
如果您的实现没有这样做,您必须手动执行此操作。