web-dev-qa-db-fra.com

Équivalent Java de C # system.be

Je travaille sur un programme Java et j'ai vraiment besoin de pouvoir jouer un son avec une fréquence et une durée déterminées, comme avec la méthode c # System.Beep, je sais comment l'utiliser en C #, mais je ne trouve pas une façon de faire cela en Java. Existe-t-il un équivalent ou un autre moyen de procéder?

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

Je ne pense pas qu'il y ait un moyen de jouer de la musique1 avec "bip" en portable2 Java. Je pense que vous devrez utiliser les API javax.sound.*, à moins que vous ne trouviez une bibliothèque tierce qui vous simplifie la tâche.

Si vous voulez emprunter cette voie, alors cette page peut vous donner quelques idées.


1 - Sauf si vos utilisateurs sont tous sourds. Bien sûr, vous pouvez émettre des bips sonores en code morse ... mais ce n'est pas une mélodie.

2 - Vous pouvez évidemment faire des appels natifs à une fonction de bip Windows. Mais cela ne serait pas portable.

4
Stephen C

Vous pouvez utiliser ceci:

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

MODIFIER

Si vous essayez de jouer quelque chose de durée et avec différents sons, vous devriez vraiment regarder dans la bibliothèque Java MIDI. Le bip par défaut ne pourra pas répondre à vos besoins car vous ne pourrez pas en modifier la durée.

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

46
Hunter McMillen

Il suffit de l'imprimer:

System.out.println("\007")

Fonctionne au moins sur MacOS.

7
Adrian

J'ai piraté ensemble une fonction qui fonctionne pour moi. Il utilise un tas de choses de javax.sound.sampled. Je l'ai adapté au format audio. Mon système crée automatiquement un nouveau clip à partir de AudioSystem.getClip(). Il y a probablement toutes sortes de façons de le rendre plus robuste et plus efficace.

/**
 * 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: Apparemment, quelqu'un a amélioré mon code. Je ne l'ai pas encore essayé, mais essayez-le: https://Gist.github.com/jbzdak/61398b8ad795d22724dd

4
Erhannis

Une autre solution, dépendant de Windows, consiste à utiliser la JNA et à appeler directement Windows Fonction Beep , disponible dans kernel32. Malheureusement, Kernel32 dans la JNA ne fournit pas cette méthode dans la version 4.2.1, mais vous pouvez facilement l'étendre.

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

Pour l'utiliser :

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

Si vous utilisez maven, vous devez ajouter les dépendances suivantes:

<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

Vous pouvez obtenir la référence de la classe Toolkit ici , où la méthode beep() est définie.

0
Bhavik Ambani

UtilisezApplet à la place. Vous devrez fournir le fichier audio bip sous la forme d'un fichier wav, mais cela fonctionne. J'ai essayé ceci sur 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