Вопрос по c#, java, audio – Java эквивалент C # system.beep?

24

Я работаю над 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);
    }
    }
}
@YoryeNathan Это печатает07 внутри любой IDE. Hunter McMillen
Может бытьthis может помочь. Pau Kiat Wee
@HunterMcMillen, даже если вы используете решение для набора инструментов (которое тоже не всегда работает - поскольку это просто природа java), вы все равно можете подавать только звуковой сигнал по умолчанию. SimpleVar
@YoryeNathan - если стандартный вывод не идет на консоль, он вообще не будет издавать звуковой сигнал. Stephen C
Насколько я знаю, вы можете подать только звуковой сигнал по умолчанию:System.out.println("\007"); SimpleVar

Ваш Ответ

8   ответов
47

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

EDIT

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

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

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

1 - Unless your users are all tone-deaf. Of course you can do things like beeping in Morse code ... but that's not a tune.

2 - Obviously, you could make native calls to a Windows beep function. But that would not be portable.

0

Вотгде методbeep() определено.

3

зависящим от Windows, является использование JNA и прямой вызов WindowsФункция звукового сигнала, доступно в 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>
Error: User Rate Limit Exceeded
1
//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();
    }
}
Эндрю, уже объяснил (27 мая, 12), ЭТО не будет работать под Linux с Gnome, и я протестировал его снова.
Это полная копияan earlier answer
не будет работать и под Windows.
Работает на Windows 7.
0

использование Applet вместо. Вы должны предоставить звуковой файл звукового сигнала в видеwav файл, но это работает. Я попробовал это на Ubuntu:


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
7

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

System.out.println("\007")

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
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'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 sam,ple = (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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededevent.getType() == Type.STARTError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededgist.github.com/jbzdak/61398b8ad795d22724dd

Похожие вопросы