MidiSystem.getMidiDevice(...)返回意外的类

时间:2018-06-25 17:21:18

标签: java midi javax.sound.midi fluidsynth

我正在尝试使用javax.sound.midi编写一个简单的程序,该程序通过FluidSynth读取,编辑然后播放Midi文件。这是我的代码段:

  Synthesizer synth;

  // Look through the available midi devices for a software synthesizer
  MidiDevice.Info[] deviceInfo = MidiSystem.getMidiDeviceInfo();

  for(MidiDevice.Info currentDevice : deviceInfo){
    if(currentDevice.getName().matches("FluidSynth virtual port.*"))
        synth = (Synthesizer) MidiSystem.getMidiDevice(currentDevice);
  }   

  // If FluidSynth is not found, use default synth
  if(synth == null){
    synth = MidiSystem.getSynthesizer();
    System.out.println("Using default synth");
  }

  // Do stuff with synth

代码成功编译,但是当我运行它时,出现以下异常:

 Exception in thread "main" java.lang.ClassCastException: java.desktop/com.sun.media.sound.MidiOutDevice cannot be cast to java.desktop/javax.sound.midi.Synthesizer
    at SynthesizerDemo.main(SynthesizerDemo.java:49)

我期望返回Synthesizer类,但我不理解com.sun.media.sound.MidiOutDevice类是什么。如果将合成器切换到MidiDevice类,则可以播放,但是我无法访问Synthesizer类中的所有方法。对我想念的东西有任何想法吗?

2 个答案:

答案 0 :(得分:1)

Synthesizer接口由用Java实现的合成器使用,并且可以通过该接口进行控制。

FluidSynth不是用Java编写的,并且不实现该接口。从JVM的角度来看,FluidSynth看起来就像其他MIDI端口一样。

要控制FluidSynth,您必须发送普通的MIDI消息。

答案 1 :(得分:0)

检查您的演员表:

for(MidiDevice.Info currentDevice : deviceInfo){
    if(currentDevice.getName().matches("FluidSynth virtual port.*")) {
        MidiDevice device = MidiSystem.getMidiDevice(currentDevice);
        if (device instanceof Synthesizer) {
            synth = (Synthesizer) MidiSystem.getMidiDevice(currentDevice);
            break;
        }
    }
}