Подтвердить что ты не робот

Java-эквивалент С# system.beep?

Я работаю над программой Java, и мне действительно нужно иметь возможность воспроизводить звук с определенной частотой и продолжительностью, подобно методу С# System.Beep, я знаю, как использовать его в С#, но я могу Найти способ сделать это в 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);
    }
    }
}
4b9b3361

Ответ 1

Я не думаю, что есть способ воспроизвести мелодии 1 с "звуковым сигналом" в портативной 2 Java. Я думаю, вам нужно будет использовать API javax.sound.* Если только вы не найдете стороннюю библиотеку, которая упростит вам задачу.

Если вы хотите пойти по этому пути, то эта страница может дать вам некоторые идеи.


1 - Если ваши пользователи не глухие.Конечно, вы можете делать такие вещи, как писк в азбуке Морзе... но это не мелодия.

2 - Очевидно, вы могли бы сделать собственные вызовы звуковой функции Windows.Но это не будет портативным.

Ответ 2

Вы можете использовать это:

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

ИЗМЕНИТЬ

Если вы пытаетесь воспроизвести что-нибудь продолжительности и с разными звуками, вам действительно нужно изучить библиотеку Java MIDI. Звуковой сигнал по умолчанию не сможет удовлетворить ваши потребности, так как вы не можете изменить длину звукового сигнала.

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

Ответ 3

Просто напечатайте его:

System.out.println("\007")

Работает как минимум на MacOS.

Ответ 4

Я взломал функцию, которая работает для меня. Он использует кучу вещей от 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 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);
    }
}

EDIT: По-видимому, кто-то улучшил мой код. Я еще не пробовал, но проголосую: https://gist.github.com/jbzdak/61398b8ad795d22724dd

Ответ 5

Другим решением, зависящим от Windows, является использование JNA и прямой вызов Windows Beep function, доступный в kernel32. К сожалению, Kernel32 в JNA не предоставляет этот метод в 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>

Ответ 6

//Here 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();
    }
}

Ответ 7

Вы можете получить ссылку на класс Toolkit здесь, где определен метод beep().

Ответ 8

Вместо этого используйте 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