Después de mucho luchar ya hallamos la respuesta de este atolladero que muchos lectores de nuestra web tienen. Si tienes algún dato que compartir no dudes en aportar tu comentario.
Solución:
Ver Beeper
para un ejemplo autónomo.
¿Quizás algo más simple?
Esas 51 líneas de fragmento (repetidas a continuación, espaciadas para una sola línea y comentarios en línea) como se muestra en la parte superior de la respuesta vinculada, es tan simple como generar un tono (OK, puede sacar más de 5 líneas para el armónico).
La gente parece asumir que debería ser un método integrado en el conjunto de herramientas para producir un tono puro. No lo es, y se necesita un poco de cálculo para hacer uno.
/** Generates a tone, and assigns it to the Clip. */
public void generateTone()
throws LineUnavailableException
if ( clip!=null )
clip.stop();
clip.close();
else
clip = AudioSystem.getClip();
boolean addHarmonic = harmonic.isSelected();
int intSR = ((Integer)sampleRate.getSelectedItem()).intValue();
int intFPW = framesPerWavelength.getValue();
float sampleRate = (float)intSR;
// oddly, the sound does not loop well for less than
// around 5 or so, wavelengths
int wavelengths = 20;
byte[] buf = new byte[2*intFPW*wavelengths];
AudioFormat af = new AudioFormat(
sampleRate,
8, // sample size in bits
2, // channels
true, // signed
false // bigendian
);
int maxVol = 127;
for(int i=0; i
Utilice la API de sonido de Java y Math.sin
para crear los niveles de onda reales.
http://www.developer.com/java/other/article.php/2226701 tiene un excelente tutorial sobre esto al que hice referencia hace algún tiempo. http://jsresources.org/examples/ fue otra referencia útil.
Si desea un código fácil para comenzar, esto debería ayudar
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
public class SinSynth
//
protected static final int SAMPLE_RATE = 16 * 1024;
public static byte[] createSinWaveBuffer(double freq, int ms)
int samples = (int)((ms * SAMPLE_RATE) / 1000);
byte[] output = new byte[samples];
//
double period = (double)SAMPLE_RATE / freq;
for (int i = 0; i < output.length; i++)
double angle = 2.0 * Math.PI * i / period;
output[i] = (byte)(Math.sin(angle) * 127f);
return output;
public static void main(String[] args) throws LineUnavailableException
final AudioFormat af = new AudioFormat(SAMPLE_RATE, 8, 1, true, true);
SourceDataLine line = AudioSystem.getSourceDataLine(af);
line.open(af, SAMPLE_RATE);
line.start();
boolean forwardNotBack = true;
for(double freq = 400; freq <= 800;)
byte [] toneBuffer = createSinWaveBuffer(freq, 50);
int count = line.write(toneBuffer, 0, toneBuffer.length);
if(forwardNotBack)
freq += 20;
forwardNotBack = false;
else
freq -= 10;
forwardNotBack = true;
line.drain();
line.close();
Si haces scroll puedes encontrar las notas de otros administradores, tú aún eres capaz dejar el tuyo si lo crees conveniente.