it-swarm.com.de

Java-Äquivalent von C # system.beep?

Ich arbeite an einem Java-Programm, und ich muss wirklich in der Lage sein, einen Sound mit einer bestimmten Frequenz und Dauer abzuspielen, ähnlich wie bei der c # -Methode System eine Möglichkeit, dies in Java zu tun. Gibt es eine gleichwertige oder andere Möglichkeit, dies zu tun?

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);
    }
    }
}
23
Glen654

Ich glaube nicht, dass es eine Möglichkeit gibt, Musik zu spielen1 mit "Piepton" in tragbar2 Java. Ich denke, Sie müssen die javax.sound.*-APIs verwenden, es sei denn, Sie können eine Bibliothek eines Drittanbieters finden, die die Dinge für Sie vereinfacht.

Wenn Sie diesen Weg gehen wollen, dann könnte Ihnen diese Seite einige Ideen geben.


1 - Wenn Ihre Benutzer nicht alle taub sind. Natürlich können Sie im Morse-Code auch ein Piepen machen ... aber das ist keine Melodie.

2 - Sie können natürlich eine Windows-Piepton-Funktion aufrufen. Das wäre aber nicht tragbar.

4
Stephen C

Sie können dies verwenden:

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

EDIT

Wenn Sie versuchen, etwas von Dauer und mit unterschiedlichen Sounds abzuspielen, sollten Sie unbedingt in die Java MIDI - Bibliothek schauen. Der Standard-Signalton kann Ihre Anforderungen nicht erfüllen, da Sie die Länge des Signaltons nicht ändern können.

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

46
Hunter McMillen

Einfach ausdrucken:

System.out.println("\007")

Funktioniert zumindest unter MacOS.

7
Adrian

Ich habe eine Funktion zusammengehackt, die für mich funktioniert. Es verwendet ein paar Sachen von javax.sound.sampled. Ich habe es so eingestellt, dass es mit dem Audioformat arbeitet. Mein System gibt automatisch einen neuen Clip von AudioSystem.getClip() aus. Es gibt wahrscheinlich alle Arten von Möglichkeiten, um es robuster und effizienter zu machen.

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

EDIT: Anscheinend hat jemand meinen Code verbessert. Ich habe es noch nicht ausprobiert, aber probieren Sie es aus: https://Gist.github.com/jbzdak/61398b8ad795d22724dd

4
Erhannis

Eine andere von Windows abhängige Lösung besteht darin, JNA zu verwenden und direkt die Windows Beep-Funktion aufzurufen, die in Kernel32 verfügbar ist. Leider bietet Kernel32 in JNA diese Methode in 4.2.1 nicht, aber Sie können sie leicht erweitern.

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);
}

Um es zu benutzen :

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

Wenn Sie Maven verwenden, müssen Sie die folgenden Abhängigkeiten hinzufügen:

<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>
3
EFalco
//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

Sie können die Referenz der Toolkit-Klasse hier abrufen, wobei die Methode beep() definiert ist.

0
Bhavik Ambani

Verwenden Sie stattdessenApplet. Sie müssen die Piepton-Audiodatei als wav-Datei angeben, aber sie funktioniert. Ich habe dies auf Ubuntu ausprobiert: 

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