我正在尝试创建一个简单的应用程序,从midi端口(硬件)读取并将事件转发到软件合成器。它主要起作用,只是软合成器不时停止播放。我可以在日志中看到midi消息被转发,我可以在调试中跟踪并看到事件到达合成器接收器中的本机代码但由于某种原因,合成器不播放音符。如果你等待然后声音再次播放,然后停止,然后再次播放......
这是一个显示问题的演示应用。如果您在控制台中按住enter按钮,您将反复听到一个音符。一段时间后(可能不到一分钟),声音会停止(按下按钮时会发生声音),然后它会回来。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;
public class TestMidi2 {
public static void main( String[] args ) throws Exception {
Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
boolean on = true;
while ( in.readLine() != null ) {
if ( on ) {
synth.getChannels()[0].noteOn( 45, 127 );
} else {
synth.getChannels()[0].noteOff( 45 );
}
on = !on;
}
}
}
如果这会产生影响,我会使用MacOS X Lion(我猜它确实如此)。
有什么想法吗?解决方法?我想尝试其他软件合成器,但找不到任何。我也愿意尝试硬件midi合成器,只要他们可以演奏基本的钢琴,长笛和吉他(我不需要任何专业,只是体面的声音)。
谢谢!
答案 0 :(得分:2)
这是一个狮子问题。我正在开发一种工具,可以将MIDI发送到不同的端口并在许多平台上进行测试。 Java声音合成器适用于所有OS X - 除Lion之外的版本。似乎合成器的缓冲区溢出。在几个音符后它停止播放,如果我发出一连串音符它再次开始工作并再次停止,...
然而,遗憾的是,Java声音合成器是一个古老的东西,似乎没有人支持它。
有没有人知道通过Java播放MIDI Sounds的其他可能性,除非将其发送到第三方音序器?如果会有像另一个通用MIDI库那样的东西会很好。
谢谢,格雷兹!
答案 1 :(得分:0)
你的问题与midi有关,就是这个问题:
while ( in.readLine() != null )
您按住回车键,这样可以让循环快速执行很多次。你的代码会在输入缓冲区可以接收数据的同时快速打开和关闭音符,并且声音连续,但我敢打赌,如果你要阅读midi信号,你会有在几秒钟内就有数百个。你的声音可能会停止,因为合成器无法处理你喂它的大量midi数据。
尝试按一次输入,看看是否会持续记录。
我会研究一种更好的方法来读取你的程序中的键。请参阅this SO question了解可能的方法。