【发布时间】:2015-07-28 23:38:03
【问题描述】:
我需要从通用 MIDI 文件中获取音符、时间戳和乐器列表等等。
几乎一切都完成了,但我还需要每个音轨对应的每个乐器,否则如果我不知道它们属于哪个乐器,这些音符就没用了。
这似乎是通过获取补丁列表来完成的,补丁在 MIDI 序列使用的音库中包含乐器代码。
这看起来很简单,但是当我尝试在 Sequence 对象上使用 getPatchList() 时,它会返回一个空数组。
问题?:似乎这从未在 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 年以来,真的没有人需要这个吗?
【问题讨论】:
-
getPatchList() 是否可行?我对 MIDI 了解不多,但乐器的分配难道不是 Sequence 所不知道的吗?您可以通过扫描所有 MidiMessages 从序列中获取乐器编号,但在我看来,需要Synthesizer 才能知道它们如何映射到补丁。