为什么mac上的java midi synth停止播放音符

为什么mac上的java midi synth停止播放音符,java,macos,osx-lion,midi,Java,Macos,Osx Lion,Midi,我试图制作一个简单的应用程序,从midi端口(硬件)读取数据,并将事件转发到软件synth。除了软合成器不时停止播放外,它大部分都能工作。我可以在日志中看到midi消息被转发,我可以在调试中跟踪并看到事件到达synth接收器中的本机代码,但是由于某种原因,synth没有播放注释。如果您等待,然后声音再次播放,然后停止,然后再次播放 下面是一个演示应用程序,它显示了这个问题。如果您在控制台中按住enter按钮,您将反复听到一个音符。一段时间后(可能不到一分钟),声音将停止(如果您一直按下按钮,则会

我试图制作一个简单的应用程序,从midi端口(硬件)读取数据,并将事件转发到软件synth。除了软合成器不时停止播放外,它大部分都能工作。我可以在日志中看到midi消息被转发,我可以在调试中跟踪并看到事件到达synth接收器中的本机代码,但是由于某种原因,synth没有播放注释。如果您等待,然后声音再次播放,然后停止,然后再次播放

下面是一个演示应用程序,它显示了这个问题。如果您在控制台中按住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

有什么想法吗?解决办法?我想尝试其他软件synth,但找不到。我也愿意尝试硬件midi合成器,只要他们能演奏基本的钢琴、长笛和吉他(我不需要任何专业的东西,只需要像样的声音)


谢谢大家!

您的问题不在于midi,而在于:

while(in.readLine()!=null)

按下enter键,循环可以快速执行很多次。您的代码将以输入缓冲区接收数据的速度打开和关闭音符,并且听起来是连续的,但我敢打赌,如果您要读取midi信号,您将在几秒钟内拥有数百个midi信号。您的声音可能会停止,因为synth无法处理您输入的大量midi数据

试着只按一下enter键,看看这是否能保持连续的音符


我会寻找一种更好的方法,将密钥读入您的程序。有关执行此操作的可能方法,请参阅

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

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

除了将MIDI声音发送给第三方音序器之外,有人知道通过Java播放MIDI声音的其他可能性吗?如果有类似于另一个通用MIDI库的东西就好了


谢谢,格里兹

这只是一个演示代码。实际的软件从硬件设备(鼓垫)读取midi,即使我演奏得很慢,也会得到相同的结果。然而,这只是为了得到一个快速而肮脏的输入法。无论如何,谢谢你的回答…谢谢你的回答。我所做的是使用“音频midi设置”实用程序设置一个虚拟midi连接,并使用logic express作为合成器。缺点是你需要一个外部软件合成器(除非你使用garage band,因为它读取所有的midi输入设备,所以受到限制),但是你得到的声音比内置的普通midi声音库要好得多。该死,我还以为只有我呢!前几天我提交了一份关于这个问题的bug报告。自从Java6以来,有一个替代品可用:Gervill。它工作良好,可以加载声音库,因此提供了很大的灵活性。在Java<7中,它可以通过以下VM参数激活:-Dsun.sound.useNewAudioEngine=true Java 7不再需要此参数。