c# - telecomunicaciones - ¿Cómo puedo hacer un generador de ruido rosa?
sonido de ruido (10)
((Respuesta seleccionada - vea Editar 5 a continuación))
Necesito escribir un simple generador de ruido rosa en C #. El problema es que nunca antes he hecho ningún trabajo de audio, así que no sé cómo interactuar con la tarjeta de sonido, etc. Sé que quiero evitar el uso de DirectX, sobre todo porque no quiero para descargar un SDK masivo solo para este pequeño proyecto.
Entonces tengo dos problemas:
- ¿Cómo genero Pink Noise?
- ¿Cómo puedo transmitirlo 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 de raíz. =)
Edición 2 : nuestro cortafuegos bloquea la transmisión de audio y video; de lo contrario, simplemente iría a www.simplynoise.com como se sugiere en los comentarios. :(
Edición 3 : Tengo baja la generación de ruido blanco y envío de salida a la tarjeta de sonido. Ahora todo lo que necesito saber es cómo convertir el ruido blanco en ruido rosa. Oh, y no quiero hacer un bucle en un archivo wav porque cada aplicación que he intentado usar para bucles termina con un pequeño quiebre entre bucles, lo cual es bastante discordante para haberme impulsado en esta dirección, en primer lugar ...
Edit 4 : ... Me sorprende que tantas personas se hayan sumado de forma muy explícita para no responder una pregunta. Probablemente habría obtenido una mejor respuesta si hubiera mentido sobre 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. Para ello, he editado los detalles del fondo, puedes leer sobre esto en las ediciones ...
Editar 5 : He seleccionado la respuesta de Paul a continuación porque el enlace que 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, utilicé la entrada CodeProject de Ianier Muñoz "Programar 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. =)
¿Qué tal una muestra .mp3 de Pink Noise en repeat?
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 pueden 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, estaré encantado de ayudarlo.
Como una forma rápida y sucia de hacerlo, ¿qué tal simplemente ponerle un sonido rosa en tu reproductor de audio? (Sí, sé que parte de la diversión es hacerlo tú mismo ...)
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 uniformemente aleatorios).
Transmitir cosas a la tarjeta de sonido es razonablemente trivial, siempre y cuando tengas Google a mano. Si eliges evitar DirectX, considera usar PortAudio o ASIO para interactuar con la tarjeta de sonido ... aunque creo que vas a tener que usar C ++ o C.
Aparte de eso, ¿por qué perder tiempo de CPU generando? ¡Bucle un maldito archivo WAV!
No es realmente una respuesta a su pregunta, pero ¿no puede simplemente escuchar algo de música, idealmente con algunos auriculares con cancelación de ruido?
No puedo hablar sobre C #, pero podría estar mejor con algunos buenos auriculares con cancelación de ruido y tus mp3 favoritos.
Puede usar Audacity para generar el mayor ruido rosa que desee y luego repetirlo.
O podría profundizar en el código fuente y ver cómo Audacity genera la generación de ruido rosa.
Si está en Linux, puede usar SOX (puede tenerlo ya, pruebe el comando de play
).
play -t sl - synth 3 pinknoise band -n 1200 200 tremolo .1 40 < /dev/zero
Tal vez puedas 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 para la tarjeta de sonido es generar un wav (escupe algunos encabezados codificados y luego muestree los datos). Luego puede reproducir el archivo .wav.
Un poco tarde para esto, me doy cuenta, pero cualquier persona que encuentre respuestas debe saber que el ruido rosado es ruido blanco con -3dB / octava, no -6 como se indicó anteriormente, que en realidad es ruido marrón.