【问题标题】:Why java midi synth on mac stop playing notes为什么 mac 上的 java midi 合成器停止播放音符
【发布时间】:2011-12-06 15:26:25
【问题描述】:

我正在尝试制作一个从 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 合成器,只要他们能弹基本的钢琴、长笛和吉他(我不需要任何专业,只要好的声音)。

谢谢!

【问题讨论】:

    标签: java macos osx-lion midi


    【解决方案1】:

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

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

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

    谢谢你!

    【讨论】:

    • 感谢您的回复。我所做的是使用“Audio midi setup”实用程序设置虚拟midi连接,并将逻辑表达用作合成器。缺点是您需要一个外部软件合成器($$ 除非您使用车库乐队,因为它读取所有 MIDI 输入设备而受到限制)但您获得的声音比一般的 MIDI 声音库中的构建要好得多。
    • 该死的,我以为只有我一个人!前几天我提交了一份关于这个问题的错误报告。
    • 从 Java 6 开始,有一个替代品可用:Gervill。它工作正常,可以加载音库,因此提供了很大的灵活性。在 Java
    【解决方案2】:

    你的问题不在于 midi,而在于这个:

    while ( in.readLine() != null )

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

    尝试只按一次 Enter 键,看看是否能保持连续的音符。

    我会寻找一种更好的方法来将密钥读入您的程序。请参阅this SO question 了解可能的方法。

    【讨论】:

    • 这只是一个演示代码。实际的软件从硬件设备(鼓垫)读取 MIDI,即使我玩得很慢,我也会得到相同的结果。时间只是为了获得快速而肮脏的输入法。无论如何,谢谢你的回答......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多