Saltar al contenido

Generador de sonido de onda sinusoidal en Java

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *