10

この単純なコードは、私がテストに使用したいくつかのマシンで音を出していません。私は Eclipse 内からコードを実行していますが、コマンド ラインを使用しても無駄でした。

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

シーケンサーを取得し、シーケンスに MIDI イベントを追加し、シーケンスを再生することでサウンドを正常に取得できますが、シーケンサーがサポートしていないリアルタイムの音楽効果を実行しようとしています。

何か案は?

解決策を編集:問題は、デフォルトでは JRE にサウンドバンクが付属していないことです (興味深いことに、シーケンサーを使用すると機能しましたが、シンセサイザーを使用すると機能しませんでした)。ありがとう、thejmc !

この問題を解決するために、java.sun.com からサウンドバンクをダウンロードし、(WinXP では) C:\Program Files\jre1.6.0_07\lib\audio に配置しました (オーディオ フォルダを作成する必要がありました)。

4

4 に答える 4

9

JRE の一部のインストールには (スペースを節約するために) JavaSound soundbank.gm が含まれていないため、これらのマシンでトリガーするサウンド ソースがコードに含まれません。

動作しないマシンにサウンドバンクが存在するかどうかを確認します。.class ファイルと同じディレクトリにサウンドバンクを置くこともできます。

これらのマシンにサウンドバンクを追加したり、Java インストールをアップグレードしたりすることは可能です。

于 2009-01-13T21:57:40.957 に答える
0

あなたのコードを私のマシン (Windows XP、JRE 1.6) でテストしたところ、音符が再生されました。おそらく、1音だけでは小さすぎて聞こえません。さらにメモを追加してみてください。また、音量を大きめに設定してみてください。

于 2008-12-19T08:24:48.623 に答える
0

別のチャンネルを使用しようとしましたか? この議論があなたを解決に近づけるかもしれません...

于 2008-12-19T07:42:12.560 に答える
0

シンセサイザーを閉じる前に、もう 1 つのスリープ アクションが必要です。

public static void main(String[] args)
{
    try {
        Synthesizer synthesizer = MidiSystem.getSynthesizer();
        synthesizer.open();

        MidiChannel[] channels = synthesizer.getChannels();

        channels[0].noteOn(60, 60);
        Thread.sleep(200);
        channels[0].noteOff(60);
        Thread.sleep(200);

        synthesizer.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}
于 2009-04-13T00:27:16.423 に答える