Java 中用于播放的硬件 MIDI 输出?

Posted

技术标签:

【中文标题】Java 中用于播放的硬件 MIDI 输出?【英文标题】:Hardware MIDI Out for Playback in Java? 【发布时间】:2012-12-28 16:35:10 【问题描述】:

我正在制作一个简单的应用程序来播放 Java 中的 MIDI 文件。 我正在使用javax.sound.midi 库。

我可以正确检索我的 MIDI 输出设备(USB 到 MIDI 电缆)。

但是当我播放序列时,它总是在默认的声音合成器中播放,这是主机操作系统的通用 Midi (Soundfont) 播放。

我遇到的问题是更改默认的 MIDI 输出。

当我执行时

Receiver MidiOutReceiver; //instantiated earlier
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
MidiOutSequencer.open();
MidiOutSequencer.start();

我从扬声器中听到 MIDI 序列再现。

参考后documentation

3.10。 “Java Sound Sequencer”隐式连接到默认合成器, 3.5. 在您的程序中,您可以自己获取 Synthesizer 实例并连接 它使用发射器/接收器对显式发送到定序器。 所以你知道使用的是哪个合成器。 如果您获得了预连接到合成器的音序器, 您可以使用 getTransmitters() 方法找出合成器。 但是没有提到如何显式使用这个 Transmitter / Receiver 对并使用新的 Default Synthesizer 实例化 Sequencer 对象。

我有正确的发射器和接收器。 但是他们并不是把MIDI弹出来的。

当我尝试时

MidiSystem.getTransmitter().setReceiver(MidiOutReceiver);

它似乎没有改变任何东西。

我如何明确地将此接收器/发射器对与合成器一起使用,以便默认音序器使用我的 MIDI 输出端口?

【问题讨论】:

【参考方案1】:

我忽略了一些简单的事情。 MidiSystem.getSequencer(); 返回的默认 Sequencer 有一个 Transmitter,而后者又具有一个 setReceiver() 方法来添加 MIDI 输出设备。但您必须拥有正确的 MIDI 输出设备。我不小心选错了设备。

首先通过查看DeviceInfos 数组来选择正确的输出设备,选择正确的设备,然后用正确的Receiver 实例化Sequencer

MidiDevice.Info[] MidiDeviceInfos = MidiSystem.getMidiDeviceInfo();
//find the suitable device number here, based on some criteria
MidiDevice MidiOutDevice = MidiSystem.getMidiDevice(MidiDeviceInfos[DEVICE_NUMBER]);
Receiver MidiOutReceiver = MidiOutDevice.getReceiver();
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
//Add the new MIDI out device here.
MidiOutSequencer.getTransmitter().setReceiver(MidiOutReceiver);
MidiOutSequencer.open();

现在您可以open() 一个文件和play() 它,但由于还使用了默认的 MIDI 输出设备,您也可以听到通用 MIDI/Soundfont MIDI 声音。起初这让我很失望,但现在 MIDI 设备也将从您添加的Receiver 中发送打开的序列。

【讨论】:

MidiDevice.getReceivers() 的文档说“可以通过关闭接收器从设备中移除它。”所以大概你可以用for (Receiver receiver : MidiSystem.getSequencer().getReceivers()) receiver.close();删除默认的MIDI输出设备

以上是关于Java 中用于播放的硬件 MIDI 输出?的主要内容,如果未能解决你的问题,请参考以下文章

用于显示和播放 MIDI 文件的 Java 小程序

如何在 Java 中播放(MIDI)序列中的音频剪辑?

在音轨播放期间更改乐器 - MIDI/Java

在 Java 中同时播放 .mp3 和一系列音符 (MIDI)

在 Java 上播放单个 MIDI 木版音符?

使用 C# 播放 MIDI 声音的最佳方式