簡體   English   中英

Java 軟合成器中超過 16 個通道的 MIDI 輸出

[英]MIDI output on more than 16 channels in Java soft synthesizer

MIDI 通道管理諸如聲音、聲像、音量等參數; 因此,對於合奏音樂,它的每一個真實樂器都應該由它自己的通道來表示。 如果涉及超過 15 種非打擊樂器,則單個 MIDI 行是不夠的。

我編寫的 Java 軟件是為大多數將使用 Java 內置軟件合成器的用戶設計的。 我想允許超過 16 種樂器。 據我所知,鑒於現有的 API,我需要幾個獨立工作的 MidiReceiver 對象。

第一次嘗試:軟合成器斷言“getMaxReceivers() == -1”,即無限制,所以我根據需要創建任意數量。 不幸的是,他們都使用相同的渠道——失敗。

第二次嘗試:我為同一個 Info 對象創建了兩個 MidiDevice 對象,並為每個對象創建了一個 MidiReceiver。 當我嘗試打開第二個時,我得到一個異常,說沒有更多的音頻線可用。

第三次嘗試:和第二次一樣,但是為了打開設備,我使用了 SoftSynthesizer 類的一個特殊方法,它允許我用給定的音頻線打開它; 我這樣做是使用同一行。 沒有拋出異常——但音頻輸出混亂。 由於這兩個對象彼此不了解,因此它們無法優雅地添加它們的輸出。 又失敗了。

問題:

A)我是否忽略了什么?

B)如果沒有,有聯系和聲譽的人會提醒 Java 接口和 SoftSynthesizer 的作者嗎? 我的建議,微創:(Soft)Synthesizer 對象應該被賦予額外的方法,例如“MidiDevice getSubdevice()”,getReceiver() 在該方法上根據需要提供新的通道。

(重新編輯后:難道普通的 getReceiver() 方法實際上就是為此目的,如我上面的“第一次嘗試”中所述,並且只是被 SoftSynthesizer“Gervill”錯誤實現了嗎?如果是這樣,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 定序器會簡單地忽略這些端口消息,因此會錯誤地播放文件。 這可能是解決問題的額外動機:每個端口都有一個 Receiver 對象。

MIDI 標准只支持 16 個通道。 句號。

因此,您想要控制更多通道的任何操作都超出了正常的 MIDI 規范。 常規的 Windows GM 合成器支持它所支持的並且不會改變。 如果您需要其他功能,則必須在應用程序中使用不同的合成器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM