32

私はJavaプログラムに取り組んでおり、C#メソッドSystem.Beepと同様に、特定の周波数と持続時間でサウンドを再生できるようにする必要があります。C#での使用方法は知っていますが、見つかりませんJavaでこれを行う方法。これを行う同等の方法、または別の方法はありますか?

using System;

class Program
{
    static void Main()
    {
    // The official music of Dot Net Perls.
    for (int i = 37; i <= 32767; i += 200)
    {
        Console.Beep(i, 100);
    }
    }
}
4

8 に答える 8

58

これを使用できます:

java.awt.Toolkit.getDefaultToolkit().beep();

編集

持続時間の異なるサウンドで何かを再生しようとしている場合は、Java MIDI ライブラリを実際に調べる必要があります。ビープ音の長さを変更できないため、デフォルトのビープ音ではニーズを満たすことができません。

http://www.oracle.com/technetwork/java/index-139508.html

于 2012-05-27T03:29:13.903 に答える
5

私は自分のために働く機能を一緒にハックしました。からのたくさんのものを使用しjavax.sound.sampledます。システムが から新しいクリップを自動的に提供するオーディオ形式で動作するように調整しましたAudioSystem.getClip()。より堅牢で効率的なものにする方法はおそらくありとあらゆる方法があります。

/**
 * Beeps.  Currently half-assumes that the format the system expects is
 * "PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian"
 * I don't know what to do about the sample rate.  Using 11025, since that
 * seems to be right, by testing against A440.  I also can't figure out why
 * I had to *4 the duration.  Also, there's up to about a 100 ms delay before
 * the sound starts playing.
 * @param freq
 * @param millis 
 */
public static void beep(double freq, final double millis) {
    try {
        final Clip clip = AudioSystem.getClip();
        AudioFormat af = clip.getFormat();

        if (af.getSampleSizeInBits() != 16) {
            System.err.println("Weird sample size.  Dunno what to do with it.");
            return;
        }

        //System.out.println("format " + af);

        int bytesPerFrame = af.getFrameSize();
        double fps = 11025;
        int frames = (int)(fps * (millis / 1000));
        frames *= 4; // No idea why it wasn't lasting as long as it should.

        byte[] data = new byte[frames * bytesPerFrame];

        double freqFactor = (Math.PI / 2) * freq / fps;
        double ampFactor = (1 << af.getSampleSizeInBits()) - 1;

        for (int frame = 0; frame < frames; frame++) {
            short sample = (short)(0.5 * ampFactor * Math.sin(frame * freqFactor));
            data[(frame * bytesPerFrame) + 0] = (byte)((sample >> (1 * 8)) & 0xFF);
            data[(frame * bytesPerFrame) + 1] = (byte)((sample >> (0 * 8)) & 0xFF);
            data[(frame * bytesPerFrame) + 2] = (byte)((sample >> (1 * 8)) & 0xFF);
            data[(frame * bytesPerFrame) + 3] = (byte)((sample >> (0 * 8)) & 0xFF);
        }
        clip.open(af, data, 0, data.length);

        // This is so Clip releases its data line when done.  Otherwise at 32 clips it breaks.
        clip.addLineListener(new LineListener() {                
            @Override
            public void update(LineEvent event) {
                if (event.getType() == Type.START) {
                    Timer t = new Timer((int)millis + 1, new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            clip.close();
                        }
                    });
                    t.setRepeats(false);
                    t.start();
                }
            }
        });
        clip.start();
    } catch (LineUnavailableException ex) {
        System.err.println(ex);
    }
}

編集:どうやら誰かが私のコードを改善したようです。まだ試していませんが、試してみてください: https://gist.github.com/jbzdak/61398b8ad795d22724dd

于 2014-03-17T23:01:15.870 に答える
4

ポータブル2 Javaで曲1を「ビープ音」で再生する方法はないと思います。私が思うにAPIを使用する必要があります...物事を簡素化するサードパーティのライブラリが見つからない限り。javax.sound.*

この道をたどりたい場合は、このページでいくつかのアイデアが得られるかもしれません。


1 - ユーザーがすべて音痴でない限り。もちろん、モールス符号でビープ音を鳴らすこともできますが、それは曲ではありません。

2 - 明らかに、Windows のビープ機能をネイティブに呼び出すことができます。しかし、それは移植性がありません。

于 2012-05-27T03:36:52.507 に答える
0

メソッドが定義されているツールキット クラスの参照をここで取得できます。beep()

于 2012-05-27T03:31:20.483 に答える