java - MidiSystem.getMidiDevice(...) 返回意外的类
问题描述
我正在尝试使用 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
类中的所有方法。知道我缺少什么吗?
解决方案
该Synthesizer
接口由用 Java 实现的合成器使用,并且可以通过该接口进行控制。
FluidSynth 不是用 Java 编写的,也没有实现该接口。从 JVM 的角度来看,FluidSynth 看起来就像任何其他 MIDI 端口。
要控制 FluidSynth,您必须发送正常的 MIDI 信息。
推荐阅读
- ruby-on-rails - 数组中的rails组匹配日期
- javascript - 模态函数只显示黑屏而不是实际的模态,
- javascript - 无法在 flex child 上将高度设置为 100%
- oop - Unity - 带有 Sets 和 Gets 的 NullReferenceException
- wordpress - Wordpress 中的 Watson Assistant 插件
- javascript - Youtube 下载器 - ytdl-core
- jwt - 使用 IdentityServer 的 IdentityModel 库时,System.IdentityModel.Tokens.Jwt 是否需要与 JWT 一起使用?
- apache-spark - 如何增加 Spark Streaming/Kafka 中处理某个阶段的 executor 数量?
- swift - Swift 本地通知,显示视图控制器并传递数据
- python - 凯撒密码移动了两个字母而不是一个