我一直在抛出异常。 当我尝试创建一个新的Sequencer对象时,我不断收到javax.sound.midi.MidiUnavailableException:Audio Device Unavailable exception。 所以,这是代码:
import javax.sound.midi.*;
public class MiniMusicPlayer1
{
public static void main(String[] args)
{
try
{
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
for (int i = 5; i < 61; i += 4)
{
track.add(makeEvent(144, 1, i, 100, i));
track.add(makeEvent(128, 1, i, 100, (i+2)));
}
sequencer.setSequence(seq);
sequencer.setTempoInBPM(220);
sequencer.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static MidiEvent makeEvent(int comd, int chan, int one, int two, int tick)
{
MidiEvent event = null;
try
{
ShortMessage a = new ShortMessage();
a.setMessage(comd, chan, one, two);
event = new MidiEvent(a, tick);
}
catch (Exception e)
{
e.printStackTrace();
}
return event;
}
}
这是完整的错误(在编译时):
javax.sound.midi.MidiUnavailableException: Audio Device Unavailable
at com.sun.media.sound.MixerSynth.implOpen(MixerSynth.java:165)
at com.sun.media.sound.AbstractMidiDevice.doOpen(AbstractMidiDevice.java:144)
at com.sun.media.sound.AbstractMidiDevice.openInternal(AbstractMidiDevice.java:134)
at com.sun.media.sound.AbstractMidiDevice.getReceiverReferenceCounting(AbstractMidiDevice.java:339)
at javax.sound.midi.MidiSystem.getReceiver(MidiSystem.java:243)
at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:442)
at javax.sound.midi.MidiSystem.getSequencer(MidiSystem.java:348)
at MiniMusicPlayer1.main(MiniMusicPlayer1.java:9)
首先我无法在我的电脑上播放MIDI文件,但后来我开始工作,所以现在我可以播放MIDI文件了,没关系。 我甚至试图关闭使用我的声卡的每个进程,但错误仍然存在。 有人可以帮帮我吗?
答案 0 :(得分:1)
检查您的进程列表以查看是否有任何正在运行的程序副本。如果它曾经工作过,可能性很好:
sequencer.open();
失败,因为已经打开了定序器以供另一个程序独占访问。可能,“其他程序”只是您正在运行的程序的副本,无论出于何种原因。如果是这样,那么关闭的程序可能是“java”程序之一。听起来你已经尝试过关闭其他midi程序了。
另外,您可能正在打开“错误的”MIDI设备。在
Sequencer sequencer = MidiSystem.getSequencer();
只会打开“默认”设备。此默认设备可能配置错误或不可用,而您的工作程序使用的设备可能不同。这样的事情发生的可能性很小,但你可能想要编写像
这样的代码MidiSystem.getMidiDeviceInfo()
并浏览返回的设备,如摘录
所示// Obtain information about all the installed synthesizers.
Vector synthInfos;
MidiDevice device;
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
try {
device = MidiSystem.getMidiDevice(infos[i]);
} catch (MidiUnavailableException e) {
// Handle or throw exception...
}
if (device instanceof Synthesizer) {
synthInfos.add(infos[i]);
}
}
// Now, display strings from synthInfos list in GUI.
在http://java.sun.com/docs/books/tutorial/sound/accessing-MIDI.html
中有更详细的解释答案 1 :(得分:1)
我不会尝试解释错误,但我做了以下操作来解决与您类似的问题。
<强> 1。安装胆小玩家
$ sudo apt-get install timidity
安装后执行播放器
$ aplaymidi -l
1 Port Client name Port name
2 14:0 Midi Through Midi Through Port-0
如果上述命令不起作用,则可能需要重新启动机器
<强> 2。完成alsa-oss ALSA(高级Linux声音架构)的安装
$ sudo apt-get install alsa-oss
第3。执行文件
$ aoss java MidiClassTest
如果您使用Eclipse或其他IDE,则可能需要使用,例如
$ aoss eclipse
或使用别名
alias eclipse='aoss eclipse-indigo &'
答案 2 :(得分:0)
我的猜测是:
MidiSystem.getSequencer(false)
获取未连接的音序器,但这不会非常有用。胆怯等应用程序不会受到影响,因为它们会执行自己的软件综合。
可以使用virtual MIDI port来发挥Java的胆怯。