Generar ruido blanco


15

El desafío es: generar un archivo de audio hecho de ruido blanco.
Requisitos e instrucciones:

  • Su programa debe generar un archivo de audio que contenga solo ruido blanco, lo que significa que su intensidad es la misma para todas las frecuencias (razonables) y no nulas [vea un diagrama de ejemplo ];
  • Uno debe poder reproducir el archivo de audio en la última versión de VLC [al momento de escribir su respuesta];
  • El programa no necesita aleatoriedad, randfunciones o lectura criptográficamente fuertes, /dev/randestá bien;
  • El programa debe poder generar al menos 1 hora de audio, al menos en teoría (lo que significa que las limitaciones del sistema como el tamaño máximo de archivos no se aplican);
  • Su puntaje es el número de bytes en su código fuente, más todos los bonos que aplican;
  • Usar cualquier biblioteca externa de terceros está bien;
  • El programa debe funcionar sin acceso a Internet.

Los bonos son:

  • -15%: permite especificar el formato del archivo de audio (al menos dos opciones; el número de opciones posibles no cambia la puntuación);
  • -10%: permite especificar la duración del archivo de audio;
  • -5%: permite especificar la tasa de bits del archivo de audio.

La configuración se puede almacenar en variables, archivos o como parámetros de línea de comando, según su elección. Los porcentajes se calculan a partir del número original de bytes, antes de que se aplique cualquier bonificación.


La especificación del problema parece estar describiendo un desafío de colfing de código, pero las etiquetas dicen lo contrario.
undergroundmonorail

Whoops! Lo arreglaré
Giulio Muscarello

Quizás el desafío debería revisarse para permitir solo "bibliotecas de terceros existentes" en lugar de "cualquier biblioteca".
jpmc26

¿Vas a ser un fanático del ruido blanco? Si realmente desea verificar: su autocorrelograma debe tener un pico claro alrededor de cero, y casi nada en ningún otro retraso. Si no va a ser un fanático, le digo que no tiene sentido especificar que sea ruido blanco. Solo di ruido.
Tim Seguine

¿Qué pasa con WebAudioAPI? Codifiqué el programa js, que reproduce ruido blanco
Евгений Новиков

Respuestas:


4

MATLAB, 25

wavwrite(rand(8e3,1),'a')

escribe un nuevo archivo WAV en el disco llamado a. Tiene una frecuencia de muestreo de 8 kHz y 16 bits por muestra en formato entero con signo. Los datos de origen se distribuyen uniformemente en el intervalo [0,1], que se asigna al intervalo [0,32767]después de la conversión a formato entero.

MATLAB, 28-4 (10% + 5%) = 24

No estoy seguro de lo que significaba el OP sobre cómo se podrían almacenar las configuraciones en las variables, pero lo interpreté de una manera favorable para este caso. Asumiendo que:

  • La velocidad de bits deseada (en bits / segundo) la proporciona el usuario en la variable b. Los bits por muestra están codificados en 16.

  • La duración deseada del archivo (en muestras) se da en la variable d.

El resultado es:

wavwrite(rand(d,1),b/16,'a')

MATLAB, 16-4 (15% + 10%) = 12

Agregando otra capa de sordidez en busca de bonos, hago otra suposición: la función deseada para usar para generar el archivo debe especificarse en la variable f. Entonces el código se simplifica a:

f(rand(d,1),'a')

Los valores permitidos para la función son:

f = @wavwrite

o

f = @auwrite

Cada función hará que el fragmento anterior escriba un archivo del formato apropiado (WAV o .au) a una frecuencia de muestreo de 8 kHz con la duración especificada. Quité la bonificación por la especificación de la tasa de bits aquí, porque el valor auwritepredeterminado es 8 bits por muestra en lugar de 16 como lo wavwritehace. No veo una manera de armonizar los dos sin usar más personajes.


10

Bash, 34

dd if=/dev/sda of=file.wav count=1

Si no desea "aleatoriedad" del disco duro, (mucho más lento)

dd if=/dev/random of=file.wav count=9

SPIN, 28

word x=0
repeat
 word[?x]=?x

44
De alguna manera, no creo que el encabezado del archivo pueda ser completamente aleatorio / igual que el primer sector de la unidad de disco duro
John Dvorak

1
Herr Doctor puede tener razón, si el arnés de prueba es VLC. VLC es bastante indulgente.
Jonathan Van Matre

1
Has generado ruido, pero ¿es ruido blanco?
Stephen Melvin

1
/ dev / random también existe en Mac, ¡yay! Lamentablemente, iTunes no puede reproducir el archivo wav resultante. No es que me pueda quejar: opté por VLc debido a su perdón y la multitud de códecs nativos.
Giulio Muscarello

1
Puede guardar cinco caracteres ejecutando el comando mientras está el directorio de trabajo /dev.
David Richerby

4

Mathematica 52-5 = 47

gexporta un archivo .wav de ruido blanco de ssegundos y 8000 bps.

g@s_:=Export["p.wav",RandomReal@{-1,1}~Play~{t,0,s}]

Ejemplo: se exporta un archivo de ruido blanco de 6 segundos.

g[6]

p.wav


4

Supercollider, 89 - 10% = 80.1 bytes

Lamentablemente, a pesar de haber sido creado deliberadamente para la generación de sonido / audio, este lenguaje no va a ganar aquí. Pero es la primera aparición de Supercollider en Code Golf, ¡así que es genial!

Este envío se pierde principalmente porque la configuración de la grabación y su realización es un proceso detallado debido al diseño cliente / servidor de este lenguaje. Aún así, es un lenguaje genial con mucho poder en muy poco código cuando le pides que haga cosas más complejas que el simple ruido blanco.

La duración del archivo se establece cambiando el valor de wait (). Podría ponerlo en una variable, pero realmente no tiene sentido, ya que Supercollider no tiene ningún estándar para hablar. La interactividad está en manipular el código en vivo mientras el servidor todavía está jugando. Esencialmente, el IDE es la E / S (a menos que cree una IU para su creación).

Aquí está la versión de golf:

{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

Aquí hay una versión de golf con la opción de grabar en aiff o wav, y especificar un formato de muestra (int16, int8 y float son todas las opciones). Desafortunadamente, incluso con todos los bonos, la versión anterior tiene mejores resultados. Esto sería 139-30% = 97.3 bytes.

s.recSampleFormat='int16';s.recHeaderFormat='wav';{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

Y aquí hay una versión no protegida de este último, para que pueda ver lo que está sucediendo.

s.recSampleFormat='int16';
s.recHeaderFormat='wav';

{WhiteNoise.ar(1)}.play;
s.prepareForRecord;

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}

Un voto para el uso de Supercollider. Hay muchos otros acertijos para los que sería GENIAL. Mira música y audio
No es que Charles

4

Bash + ALSA, puntuación: 44 (52 caracteres - (10% + 5%) bonificaciones)

Más largo que la otra bashrespuesta, pero acepta duración y tasa de bits. También agrega un encabezado razonablemente correcto al archivo, por lo que debe ser razonablemente portátil:

arecord -r$2|head -c44;head -c$[$2*$1] /dev/urandom

Guardar como un script, chmod +xy ejecutar:

$ ./wav.sh 1 44100 > c.wav
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 44100 Hz, Mono
$ 

Tenga en cuenta que la salida .wav es stdout, por lo que debe redirigirse a un archivo.


Puede guardar aproximadamente 1,20 caracteres leyendo / dev / random en lugar de / dev / urandom, ya que la velocidad no es un requisito.
Giulio Muscarello

1
salida es a stdin ?
user253751

0

C 127 115 bytes

#define H htonl
main(c){for(write(1,(int[]){H(779316836),H(24),-1,H(2),H(8000),H(1)},24);;write(1,&c,1))c=rand();}

La mayoría del código escribe el encabezado para un archivo * .au. Esto imprime un archivo de sonido pseudoaleatorio a la salida estándar.

La frecuencia de muestreo se puede ajustar cambiando el 8000.

La duración se puede ajustar presionando ctrl-ccuando quieras parar :-)


0

JavaScript, 167 bytes

PRECAUCIÓN: Disminuya el volumen antes de ejecutar. El ruido blanco es desagradable

No genere archivos, quizás no sea lo que se esperaba.

Hack de -4 bytes de reproducción de ruido solo en el canal izquierdo

c=new AudioContext()
n=c.createScriptProcessor(s=512)
n.connect(c.destination)
n.onaudioprocess=e=>{a=s;while(a--){e.outputBuffer.getChannelData(0)[a]=Math.random()}}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.