私は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);
}
}
}
曲を演奏する方法はないと思う1 ポータブルで「ビープ」2 Java。私が思うにjavax.sound.*
APIを使用する必要があります...あなたのために物事を簡素化するサードパーティのライブラリを見つけることができない限り。
この道を進みたい場合は、 このページ でアイデアが得られるかもしれません。
1-ユーザーがすべて耳が聞こえない場合。もちろん、モールス信号でビープ音を鳴らすなどのことができますが、それは曲ではありません。
2-当然、Windowsビープ機能をネイティブに呼び出すことができます。しかし、それは移植性がありません。
これを使用できます:
Java.awt.Toolkit.getDefaultToolkit().beep();
[〜#〜] edit [〜#〜]
異なる長さのサウンドを再生しようとする場合は、Java MIDIライブラリ。デフォルトのビープ音はできません。ビープ音の長さは変更できないため、ニーズに合わせてください。
印刷するだけです:
System.out.println("\007")
少なくともMacOSで動作します。
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>
自分に合った機能を一緒にハックしました。 _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
//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();
}
}
Toolkitクラスのリファレンスを取得できます here 、メソッドbeep()
が定義されています。
使用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