为什么java midi synth在mac上停止播放笔记

我正在尝试制作一个简单的应用程序,从midi端口(硬件)读取并将事件转发到软件合成器。 它主要起作用,只是软合成器不时停止播放。 我可以在日志中看到midi消息被转发,我可以在调试中跟踪并看到事件到达合成器接收器中的本机代码但由于某种原因,合成器不播放音符。 如果你等待然后声音再次播放,然后停止,然后再次播放…

这是一个演示应用程序,显示问题。 如果您在控制台中按住回车按钮,您将反复听到一个音符。 一段时间后(可能不到一分钟),声音将停止(如果您按住按钮则发生事件),然后它将返回。

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合成器,只要他们可以演奏基本的钢琴,长笛和吉他(我不需要任何专业,只是体面的声音)。

谢谢!

这是一个狮子问题。 我正在开发一种工具,它将MIDI发送到不同的端口并在许多平台上进行测试。 Java声音合成器适用于所有OS X – 除Lion之外的版本。 似乎合成器的缓冲区溢出。 在几个音符后它停止播放,如果我发送一个音符,它再次开始工作并再次停止,…

然而,遗憾的是,Java声音合成器是一个古老的东西,似乎没有人支持它。

有没有人知道通过Java播放MIDI Sounds的其他可能性,除了将它发送到第三方音序器? 如果会有像另一个通用MIDI库那样的东西会很好。

谢谢,格力兹!

你的问题不在于midi,它是这样的:

while ( in.readLine() != null )

您按住了回车键,这使循环可以非常快速地执行多次。 你的代码会像输入缓冲区一样快速地打开和关闭音符,并且听起来是连续的,但我敢打赌,如果你要阅读midi信号,那么你将会有数百个这样的信号。几秒钟。 你的声音可能会停止,因为合成器无法处理你喂它的大量midi数据。

尝试按一次输入,看看是否保持连续记录。

我会研究一种更好的方法来读取程序中的键。 请参阅此SO问题,了解可行的方法。