You need to enable JavaScript to run this app. Java中如何选择指定MIDI Sequencer 替代默认MidiSystem.getSequencer逻辑
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何选择指定MIDI Sequencer 替代默认MidiSystem.getSequencer逻辑

Java MIDI自定义音序器无输出问题解决方案

问题根源

你调用MidiSystem.getSequencer()获取默认音序器时,方法内部会自动将音序器绑定到系统默认的MIDI合成器输出,所以可以正常发声。但你遍历MidiDevice.Info手动获取的Sequencer实例,没有自动绑定输出设备的逻辑,音序器虽然正常运行解析MIDI数据,但生成的MIDI消息没有传输到发声设备,所以没有声音输出。

解决方案

在打开音序器后,手动将音序器的消息发射器(Transmitter)绑定到MIDI输出设备的消息接收器(Receiver)即可。你可以直接绑定系统默认合成器,也可以让用户自主选择目标输出设备。

核心修改代码示例

在你的playSequence方法中,打开音序器后添加绑定逻辑:

private void playSequence(Sequencer sequencer) {
    if (!sequencer.isOpen()) {
        try {
            sequencer.open();
        } catch (MidiUnavailableException e) {
            e.printStackTrace();
            return;
        }
    }

    // ========== 新增音序器输出绑定逻辑 ==========
    try {
        // 关闭音序器已存在的旧发射器,避免重复输出
        for (Transmitter t : sequencer.getTransmitters()) {
            t.close();
        }
        // 获取系统默认合成器作为输出目标,也可替换为用户选择的其他MIDI输出设备
        Synthesizer defaultSynth = MidiSystem.getSynthesizer();
        if (!defaultSynth.isOpen()) {
            defaultSynth.open();
        }
        // 绑定音序器发射器到合成器接收器
        Transmitter transmitter = sequencer.getTransmitter();
        transmitter.setReceiver(defaultSynth.getReceiver());
    } catch (MidiUnavailableException e) {
        e.printStackTrace();
        return;
    }
    // ========== 绑定逻辑结束 ==========

    try {
        sequencer.setSequence(MidiSystem.getSequence(url));
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }

    System.out.println("尝试播放MIDI");
    sequencer.start();
}

扩展说明

如果你需要支持用户选择外置MIDI端口、第三方合成器等其他输出设备,可以提前遍历所有MIDI设备,筛选出实现了Receiver接口的输出设备,让用户选择后替换代码中的defaultSynth即可。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 18:06:03