Pregunta

((Respuesta seleccionada - ver Edición 5 a continuación))

Necesito escribir un simple generador de ruido rosa en C #. El problema es que nunca antes había hecho ningún trabajo de audio, así que no sé cómo interactuar con la tarjeta de sonido, etc. Sé que quiero evitar usar DirectX, principalmente porque no quiero descargar un SDK masivo solo para este pequeño proyecto.

Entonces tengo dos problemas:

  1. ¿Cómo genero ruido rosa?
  2. ¿Cómo lo transmito a la tarjeta de sonido?

Editar : realmente quiero hacer un generador de ruido rosa ... Soy consciente de que hay otras formas de resolver el problema raíz. =)

Editar 2 : nuestro firewall bloquea la transmisión de audio y video; de lo contrario, iría a www .simplynoise.com como se sugiere en los comentarios. :(

Edit 3 : reduje la generación de ruido blanco y envié la salida a la tarjeta de sonido; ahora todo lo que necesito saber es cómo convertir el ruido blanco en ruido rosa. Ah, y no quiero hacer un bucle de un archivo wav porque cada aplicación que he intentado usar para un bucle termina con una pequeña interrupción entre bucles, lo cual es lo suficientemente discordante como para haberme guiado en esta dirección. ...

Editar 4 : ... Me sorprende que tanta gente haya saltado para responder de manera muy explícita a no una pregunta. Probablemente habría obtenido una mejor respuesta si mintiera acerca de por qué necesito ruido rosa ... Esta pregunta es más sobre cómo generar y transmitir datos a la tarjeta de sonido que sobre qué tipo de auriculares debería usar. Con ese fin, he editado los detalles de fondo; puedes leerlo en las ediciones ...

Editar 5 : seleccioné la respuesta de Paul a continuación porque el enlace que me proporcionó me dio la fórmula para convertir el ruido blanco (que se genera fácilmente a través del generador de números aleatorios) en ruido rosa. Además de esto, usé entrada CodeProject de Ianier Munoz & Quot; Programación de efectos de audio en C # " para aprender a generar, modificar y enviar datos de sonido a la tarjeta de sonido. Gracias chicos por su ayuda. =)

¿Fue útil?

Solución

Tal vez pueda convertir el código C / C ++ aquí a C #:

http://www.firstpr.com.au/dsp/pink-noise /

La forma más fácil de obtener sonido en la tarjeta de sonido es generar un wav (escupir algunos encabezados codificados y luego datos de muestra). Luego puede reproducir el archivo .wav.

Otros consejos

El ruido rosa es solo ruido blanco puesto a través de un LPF de -3dB / octava. Puede generar ruido blanco usando rand () (o cualquier función que genere números aleatorios uniformes).

Transmitir cosas a la tarjeta de sonido es razonablemente trivial, siempre que tenga Google a mano. Si elige evitar DirectX, considere usar PortAudio o ASIO para interactuar con la tarjeta de sonido ... aunque creo que tendrá que usar C ++ o C.

Aparte de eso, ¿por qué perder el tiempo de la CPU generándolo? ¡Reproduce un maldito archivo WAV!

un poco tarde para esto, me doy cuenta, pero cualquiera que lo encuentre para obtener respuestas debería saber que el ruido rosa es ruido blanco con -3dB / octava, no -6 como se indicó anteriormente, que en realidad es ruido marrón.

¿No es realmente una respuesta a tu pregunta, pero no puedes escuchar algo de música, idealmente con unos auriculares con cancelación de ruido?

Aquí hay un ejemplo de cómo se ve el hilo de reproducción. Estoy usando DirectSound para crear un SecondaryBuffer donde se escriben las muestras. Como puede ver, es bastante sencillo:

    /// <summary>
    /// Thread in charge of feeding the playback buffer.
    /// </summary>
    private void playbackThreadFn()
    {
        // Begin playing the sound buffer.
        m_playbackBuffer.Play( 0, BufferPlayFlags.Looping );

        // Change playing state.
        IsPlaying = true;

        // Playback loop.
        while( IsPlaying )
        {
            // Suspend thread until the playback cursor steps into a trap...
            m_trapEvent.WaitOne();

            // ...read audio from the input stream... (In this case from your pink noise buffer)
            Input.Collect( m_target, m_target.Length );

            // ...calculate the next writing position...
            var writePosition = m_traps[ ((1 & m_pullCounter++) != 0) ? 0 : 1 ].Offset;

            // ...and copy audio to the device buffer.
            m_playbackBuffer.Write( writePosition, m_deviceBuffer, LockFlag.None );
        }

        // Stop playback.
        m_playbackBuffer.Stop();
    }

Si necesita más detalles sobre cómo funciona, con gusto lo ayudaré.

Como una forma rápida y sucia de hacerlo, ¿qué tal si simplemente colocas una onda de ruido rosa en tu reproductor de audio? (Sí, sé que parte de la diversión es hacerlo tú mismo ...)

¿Qué pasa con una muestra .mp3 de Pink Noise en repetición?

Puede usar Audacity para generar tanto ruido rosa como desee y luego repetirlo.

O podría profundizar en el código fuente y ver cómo Audacity hace la generación de ruido rosa.

¡Aquí hay una manera muy simple de crear ruido rosa, que solo suma muchas ondas espaciadas logarítmicamente, juntas! Puede ser demasiado lento para sus propósitos si desea que se cree el sonido en tiempo real, pero seguramente es posible una mayor optimización (por ejemplo: una función de coseno más rápida).

Las funciones generan una matriz doble con valores de -1 a 1. Esto representa los puntos más bajos y más altos en la forma de onda respectivamente.

El parámetro quality representa el número de ondas producidas para hacer el sonido. Encuentro 5000 ondas (aproximadamente 40 intervalos por semitono) es casi el umbral donde no puedo detectar ninguna mejora notable con valores más altos, pero para estar seguro, podría (opcionalmente) aumentar esto a aproximadamente 10,000 ondas o más . Además, según Wikipedia, 20 hertzios están alrededor del límite inferior de la percepción humana en términos de lo que podemos escuchar, pero también puede cambiar esto si lo desea.

Tenga en cuenta que el sonido se vuelve más silencioso con un valor volumeAdjust más alto debido a razones técnicas, por lo que puede (opcionalmente) querer ajustar el volumen a través del parámetro <=>.

public double[] createPinkNoise(double seconds, int quality=5000, double lowestFrequency=20, double highestFrequency = 44100, double volumeAdjust=1.0)
{
    long samples = (long)(44100 * seconds);
    double[] d = new double[samples];
    double[] offsets = new double[samples];
    double lowestWavelength = highestFrequency / lowestFrequency;
    Random r = new Random();
    for (int j = 0; j < quality; j++)
    {
        double wavelength = Math.Pow(lowestWavelength, (j * 1.0) / quality)  * 44100 / highestFrequency;
        double offset = r.NextDouble() * Math.PI*2;     // Important offset is needed, as otherwise all the waves will be almost in phase, and this will ruin the effect!
        for (int i = 0; i < samples; i++)
        {
            d[i] += Math.Cos(i * Math.PI * 2 / wavelength + offset) / quality * volumeAdjust;
        }
    }
    return d;
}

No puedo hablar de C #, pero es posible que esté mejor con unos buenos auriculares con cancelación de ruido y sus mp3 favoritos.

Si está en Linux, puede usar SOX (puede que ya lo tenga, pruebe el comando play).

play -t sl - synth 3 pinknoise band -n 1200 200 tremolo .1 40 < /dev/zero

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top