MIDI频道管理诸如声音、摇摄、音量等参数;因此,对于合奏音乐,每一个真正的乐器都应该由自己的一个频道来表示。如果涉及超过15种非打击乐器,一根MIDI线是不够的.
我编写的Java软件是为大多数将使用Java内置软件合成器的用户准备的。我想允许使用16种以上的乐器。根据我所知道的现有API,我需要几个独立工作的MidiReceiver对象。
第一次尝试:软合成器断言"getMaxReceivers() == -1",即无限的,所以我创建了我需要的数量。不幸的是,他们都使用相同的渠道-失败。
第二次尝试:为同一个Info对象创建两个MidiDevice对象,为每个对象创建一个MidiReceiver。当我试图打开第二个,我得到一个例外,说没有更多的音频线路是可用的。
第三次尝试:与第二次相同,但对于打开设备,我使用了SoftSynthesizer类的一种特殊方法,它允许我用给定的音频行打开它;我使用的是同一行。无例外抛出-但混乱的音频输出。因为这两个对象彼此不了解,所以它们不能优雅地添加它们的输出。又失败了。
问题:
我有没有漏掉什么东西?
( B)如果没有,有这种联系和声誉的人会不会向Java接口和SoftSynthesizer的作者发出警报?我的建议是最小侵入性:应该赋予(软)合成器对象一个额外的方法,比如"MidiDevice getSubdevice()",getReceiver()可以根据需要提供新的通道。
(重新编辑时:是否普通的getReceiver()方法实际上就是为了达到这个目的,就像我在上面的“第一次尝试”中所描述的那样,并且仅仅是被SoftSynthesizer的"Gervill“简化了一下?如果是这样的话,格维尔应该被告知,然而,谁是不容易找到谷歌搜索。你可能知道如何联系他/她/他们。
public boolean GetTwoIndependenttReceivers (Receiver [] inhereplease)
{
for (MidiDevice.Info info : MidiSystem.getMidiDeviceInfo ()) try
{
MidiDevice device = MidiSystem.getMidiDevice (info);
if ( device instanceof Synthesizer
&& ( device.getMaxReceivers () < 0
|| device.getMaxReceivers () >= 2)) try
{
device.open ();
inhereplease [0] = device.getReceiver ();
inhereplease [1] = device.getReceiver ();
// will be distinct as objects, but with Gervill not independent
return true;
} catch (Exception ex) {}
} catch (Exception ex) {}
return false;
}注意,例如,自由软件MuseScore用自己的软件合成器来管理这个问题。它输出带有"MIDI端口“MIDI消息的MIDI文件,就像MIDI标准所期望的那样,并优雅地导入它们。内置Java排序器只是忽略了这些端口消息,因此不正确地播放文件。这可能是攻击问题的额外诱因:每个端口都有一个接收对象。
发布于 2022-05-29 20:58:18
MIDI标准只支持16个通道。句号。
所以,任何你想要做的来控制比这更多的通道都超出了正常的MIDI规范。常规的Windows合成器支持它支持的东西,并且不会改变。如果需要额外的功能,则必须在应用程序中使用不同的合成器。
https://stackoverflow.com/questions/72425508
复制相似问题