web-dev-qa-db-ja.com

Java C#system.beepと同等?

私は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);
    }
    }
}
26
Glen654

曲を演奏する方法はないと思う1 ポータブルで「ビープ」2 Java。私が思うにjavax.sound.* AP​​Iを使用する必要があります...あなたのために物事を簡素化するサードパーティのライブラリを見つけることができない限り。

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


1-ユーザーがすべて耳が聞こえない場合。もちろん、モールス信号でビープ音を鳴らすなどのことができますが、それは曲ではありません。

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

4
Stephen C

これを使用できます:

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

[〜#〜] edit [〜#〜]

異なる長さのサウンドを再生しようとする場合は、Java MIDIライブラリ。デフォルトのビープ音はできません。ビープ音の長さは変更できないため、ニーズに合わせてください。

http://www.Oracle.com/technetwork/Java/index-139508.html

49
Hunter McMillen

印刷するだけです:

System.out.println("\007")

少なくともMacOSで動作します。

7
Adrian

Windowsに依存する別のソリューションは、JNAを使用して、kernel32で利用可能なWindows ビープ関数 を直接呼び出すことです。残念ながら、JNAのKernel32は4.2.1でこのメソッドを提供していませんが、簡単に拡張できます。

public interface Kernel32 extends com.Sun.jna.platform.win32.Kernel32 {

        /**
         * Generates simple tones on the speaker. The function is synchronous; 
         * it performs an alertable wait and does not return control to its caller until the sound finishes.
         * 
         * @param dwFreq : The frequency of the sound, in hertz. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF).
         * @param dwDuration : The duration of the sound, in milliseconds.
         */
        public abstract void Beep(int dwFreq, int dwDuration);
}

それを使用するには:

static public void main(String... args) throws Exception {
    Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
    kernel32.Beep(800, 3000);
}

Mavenを使用する場合、次の依存関係を追加する必要があります。

<dependency>
    <groupId>net.Java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>4.2.1</version>
</dependency>
<dependency>
    <groupId>net.Java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>4.2.1</version>
</dependency>
4
EFalco

自分に合った機能を一緒にハックしました。 _javax.sound.sampled_からのものを使用します。システムが自動的にAudioSystem.getClip()から新しいClipを提供するオーディオ形式で動作するように調整しました。おそらく、あらゆる種類の方法でより堅牢で効率的にすることができます。

_/**
 * 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

4
Erhannis
//Here's the full code that will DEFINITELY work: (can copy & paste)

import Java.awt.*;

public class beeper
{
    public static void main(String args[])
    {
        Toolkit.getDefaultToolkit().beep();
    }
}
1
whytfng

Toolkitクラスのリファレンスを取得できます here 、メソッドbeep()が定義されています。

0
Bhavik Ambani

使用Applet代わりに。ビープオーディオファイルをwavファイルとして提供する必要がありますが、機能します。 Ubuntuでこれを試しました:

package javaapplication2;

import Java.applet.Applet;
import Java.applet.AudioClip;
import Java.io.File;
import Java.net.MalformedURLException;
import Java.net.URL;

public class JavaApplication2 {

    public static void main(String[] args) throws MalformedURLException {
        File file = new File("/path/to/your/sounds/beep3.wav");
        URL url = null;
        if (file.canRead()) {url = file.toURI().toURL();}
        System.out.println(url);
        AudioClip clip = Applet.newAudioClip(url);
        clip.play();
        System.out.println("should've played by now");
    }
}
//beep3.wav was available from: http://www.pacdv.com/sounds/interface_sound_effects/beep-3.wav
0
Nav