gpt4 book ai didi

Java从MIDI序列中获取乐器列表

转载 作者:行者123 更新时间:2023-12-01 11:17:08 28 4
gpt4 key购买 nike

我需要从通用 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");
}

来源: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 设备选择乐器,您需要向其发送程序更改消息(这也会考虑 Bank Select Controller 的当前设置)。

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

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

关于Java从MIDI序列中获取乐器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31688902/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com