Beep em java

Como eu faço pra fazer o java “apitar” em uma certa frequência, como se fazia no pascal com:

sound(HERTZ);
delay (100);
nosound();

Alguém sabe de uma api ou alguma forma de fazer isso?

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

Mas eu queria ter beeps diferentes, de acordo com a frequência.

Crie vários arquivos .wav ou .au com freqüências diferentes, e os toque (o problema, obviamente, é se você não tiver alto-falantes ou fones de ouvido.)

Se quiser variar a freqüência e usar o alto-falante embutido na CPU, isso não está disponível diretamente no Java (e para o pessoal que diz que o .NET é melhor que o Java, tal variação de freqüência só funciona a partir do .NET Framework 2.0.

Console.Beep (Int32, Int32).

Teria que ser via autofalante interno, já que o pc não está sempre com as caixas ligadas. Tou querendo fazer tipo algo que me alerte de algum evento.

Agora que eu ouvi que mesmo esse beep do toolkit toca uma beep na caixa principal e não no auto falante interno.

Será que tem como fazer com que esse beep da toolkit mande o som pro auto falante interno?

Se o que o pessoal postou anteriormente estiver correto, sua única saída seria JNI.

Pode ser que já exista alguma implementação pronta pra isso (procura no Google).

Inté.

Beep.c

#include <windows.h>
#include "Beep.h"
/*
 * Para compilar (usando Microsoft Visual C++ 6.0)
 * C:\Program Files\Microsoft Visual Studio\VC98\bin\vcvars32
 * cl -LD -IC:\j2sdk1.4.2\include -IC:\j2sdk1.4.2\include\win32 -ojnibeep Beep.c 
 *
 * Para outras versões do Microsoft Visual C++ você também pode ajustar o ambiente
 * com vcvars32 mas ele está em um outro diretório. Para o VC 2005, por exemplo, ele
 * está em C:\Program Files\Microsoft Visual Studio 8\VC\bin .
 */
JNIEXPORT void JNICALL Java_Beep_beep
  (JNIEnv * env, jclass klass, jint dwFreq, jint dwDuration) {
    Beep (dwFreq, dwDuration);
}

Beep.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Beep */

#ifndef _Included_Beep
#define _Included_Beep
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Beep
 * Method:    beep
 * Signature: (II)V
 */
JNIEXPORT void JNICALL Java_Beep_beep
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

Beep.java

final class Beep {
/**
 * @param dwFreq A freqüência do som, em hertz. Pode estar entre 37
 * a 32767 hertz, embora seus ouvidos provavelmente não ouçam acima de 14000.
 * @param dwDuration A duração do som em milissegundos.
 * <pre>
Beep

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.


BOOL Beep(
  DWORD dwFreq,
  DWORD dwDuration
);
Parameters
dwFreq 
[in] The frequency of the sound, in hertz. This parameter must be in the range 37 through 32,767 (0x25 through 0x7FFF). 
Windows Me/98/95:  The Beep function ignores this parameter.
dwDuration 
[in] The duration of the sound, in milliseconds. 
Windows Me/98/95:  The Beep function ignores this parameter. 

 * </pre>
 */
    public native static void beep (int dwFreq, int dwDuration);
	static {
	    System.loadLibrary ("jnibeep");
	}
	/**
	 * Evita que esta classe seja instanciada ou herdada.
	 */
	private Beep() {
	}
	
	public static void main(String[] args) {
	    int freq = Integer.parseInt (args[0]);
		int dur = 500;
	    Beep.beep (freq, dur); 
		// Meu alto-falante não responde para menos que 70 Hz, e não consigo
		// ouvir mais que 7000 Hz. Estou ficando velho...
	}
}

Caraca, tudo isso pra um beep? Em Basic (que saudade do MSX) era um simples beep.

:smiley: Massa, thingol. O serviço completo.

Não consegui produzir som, mas creio que seja algum “problema” local aqui. Normalmente absolutamente não quero que o speaker interno produz sons quando estou trabalhando às 3 da noite e tem gente dormindo no quarto ao lado.

Uma vez usei:

System.out.print("\07");
System.out.flush();

Não tenho mais como testar este codigo aqui porque meu notebook não tem speaker interno. Talvez se vc mudar o numero mude a frequencia.

\07 é a impressão do caracter ASCII “BEL” (também conhecido como Control+G), que não é mostrado na tela, mas simplesmente aciona o beep padrão do computador ou terminal.

(Eu lembro de ter mexido em um terminal serial onde esse “BEL” tocava um sininho :stuck_out_tongue: )

Esse é o único caracter ASCII que é “sonoro”.

Não adianta variar o número.

Use Runtime.getRuntime().exec(“beep”);
mais não funciona no windows 7,afinal o acesso ao hardware e feito pelo sistema operacional e a microsoft tirou alguns , como foi o caso do windows 7