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
相关产品推荐
相关产品推荐

