Genera rumore bianco


15

La sfida è: generare un file audio fatto di rumore bianco.
Requisiti e istruzioni:

  • Il tuo programma deve generare un file audio contenente solo rumore bianco, il che significa che la sua intensità è la stessa per tutte le frequenze (ragionevoli) e diverse da zero [vedi un diagramma di esempio ];
  • Uno deve essere in grado di riprodurre il file audio sull'ultima versione di VLC [al momento della scrittura della risposta];
  • Il programma non ha bisogno di casualità, randfunzioni o letture crittograficamente valide, /dev/randva bene;
  • Il programma deve essere in grado di generare almeno 1 ora di audio, almeno in teoria (il che significa che non si applicano limitazioni di sistema come la dimensione massima del file);
  • Il tuo punteggio è il numero di byte nel tuo codice sorgente, oltre a tutti i bonus che si applicano;
  • Utilizzando una libreria esterna di terze parti va bene;
  • Il programma deve funzionare senza accesso a Internet.

I bonus sono:

  • -15%: consente di specificare il formato del file audio (almeno due scelte; il numero di scelte possibili non modifica il punteggio);
  • -10%: consente di specificare la durata del file audio;
  • -5%: consente di specificare il bitrate del file audio.

Le impostazioni possono essere memorizzate in variabili, file o fornite come parametri della riga di comando, a scelta. Le percentuali vengono calcolate dal numero originale di byte, prima che venga applicato qualsiasi bonus.


Le specifiche del problema sembrano descrivere una sfida di codifica del codice, ma i tag dicono diversamente.
undergroundmonorail,

Ops! Lo aggiusterò.
Giulio Muscarello,

Forse la sfida dovrebbe essere rivista per consentire solo "librerie di terze parti esistenti" invece di "qualsiasi libreria".
jpmc26

Sarai un pignolo sul rumore che è bianco? Se vuoi davvero verificare: il suo autocorrelogramma dovrebbe avere un picco evidente attorno allo zero e quasi nulla in qualsiasi altro ritardo. Se non vuoi essere un pignolo, dico che è inutile specificare che si tratta di rumore bianco. Di 'solo rumore.
Tim Seguine,

Che dire di WebAudioAPI? Ho codificato il programma js, che riproduce il rumore bianco
Augвгений Новиков

Risposte:


4

MATLAB, 25

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

scrive un nuovo file WAV sul disco chiamato a. Ha una frequenza di campionamento di 8 kHz e 16 bit per campione in formato intero con segno. I dati di origine vengono distribuiti uniformemente sull'intervallo [0,1], che viene mappato all'intervallo [0,32767]dopo la conversione in formato intero.

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

Non sono sicuro di cosa significasse l'OP riguardo al modo in cui le impostazioni potevano essere memorizzate in variabili, ma l'ho interpretato in modo favorevole a questo caso. Supponendo che:

  • Il bit rate desiderato (in bit / secondo) è fornito dall'utente nella variabile b. I bit per campione sono codificati a 16.

  • La durata desiderata del file (in campioni) è indicata nella variabile d.

Il risultato è:

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

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

Aggiungendo un altro strato di sleaze alla ricerca di bonus, faccio un'altra ipotesi: la funzione desiderata da usare per produrre il file dovrebbe essere specificata nella variabile f. Quindi il codice si semplifica per:

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

I valori consentiti per la funzione sono:

f = @wavwrite

o

f = @auwrite

Ogni funzione farà sì che il frammento di cui sopra scriva un file del formato appropriato (WAV o .au) a una frequenza di campionamento di 8 kHz con la durata specificata. Ho tolto il bonus per la specifica del bitrate qui, perché il auwritevalore predefinito è 8 bit per campione anziché 16 come wavwritefa. Non vedo un modo per armonizzare i due senza usare più personaggi.


10

Bash, 34

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

Se non si desidera la "casualità" del disco rigido, (molto più lentamente)

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

SPIN, 28

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

4
In qualche modo non credo che l'intestazione del file possa essere del tutto casuale / uguale al primo settore del disco rigido
John Dvorak

1
Herr Doctor potrebbe avere ragione, se il cablaggio di prova è VLC. VLC è abbastanza indulgente.
Jonathan Van Matre,

1
Hai generato rumore, ma è rumore bianco?
Stephen Melvin,

1
/ dev / random esiste anche su Mac, yay! Sfortunatamente iTunes non può riprodurre il file wav risultante. Non che io possa lamentarmi - ho optato per VLc per il suo perdono e la moltitudine di codec nativi.
Giulio Muscarello,

1
È possibile salvare cinque caratteri eseguendo il comando mentre la directory di lavoro è /dev.
David Richerby,

4

Mathematica 52-5 = 47

gesporta un file .wav con rumore bianco di ssecondi e 8000 bps.

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

Esempio: viene esportato un file di rumore bianco di 6 secondi.

g[6]

p.wav


4

Supercollider, 89-10% = 80,1 byte

Purtroppo, nonostante sia stato creato deliberatamente per la generazione di suoni / audio, questa lingua non vincerà qui. Ma è la prima apparizione di Supercollider su Code Golf, quindi è fantastico!

Questa presentazione perde principalmente perché impostare la registrazione e realizzarla è un processo dettagliato a causa della progettazione client / server di questa lingua. Tuttavia, è un bel linguaggio con molta potenza in pochissimo codice quando gli chiedi di fare cose più complesse del semplice rumore bianco.

La durata del file viene impostata modificando il valore wait (). Potrei metterlo in una variabile, ma in realtà non ha senso poiché Supercollider non ha stdio di cui parlare. L'interattività consiste nel manipolare il codice dal vivo mentre il server è ancora in esecuzione. In sostanza, l'IDE è l'I / O (a meno che non si crei un'interfaccia utente per la creazione).

Ecco la versione golfata:

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

Ecco una versione golfizzata con l'opzione per registrare in aiff o wav e specificare un formato di esempio (int16, int8 e float sono tutte opzioni). Sfortunatamente, anche con tutti i bonus, la versione sopra costa meglio. Questo sarebbe 139-30% = 97,3 byte.

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

Ed ecco una versione non modificata di quest'ultima, così puoi vedere cosa sta succedendo.

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

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

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

un voto per l'uso di Supercollider. Ci sono molti altri enigmi per cui sarebbe FANTASTICO. Guarda musica e audio
Non che Charles

4

Bash + ALSA, punteggio: 44 (52 caratteri - (10% + 5%) bonus)

Più lungo dell'altra bashrisposta, ma accetta durata e bitrate. Aggiunge anche un'intestazione ragionevolmente corretta al file, quindi dovrebbe essere ragionevolmente portatile:

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

Salva come script, chmod +xeseguilo:

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

Nota. L'output .wav è su stdout, quindi deve essere reindirizzato a un file.


Puoi salvare circa 1,20 caratteri leggendo / dev / random anziché / dev / urandom, poiché la velocità non è un requisito.
Giulio Muscarello,

1
l'output è su stdin ?
user253751

0

C 127 115 byte

#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 maggior parte del codice scrive l'intestazione per un file * .au. Questo stampa un file audio pseudocasuale su standard out.

La frequenza di campionamento può essere regolata modificando il 8000.

La durata può essere regolata colpendo ctrl-cogni volta che vuoi fermarti :-)


0

JavaScript, 167 byte

ATTENZIONE: ridurre il volume prima dell'esecuzione. Il rumore bianco è cattivo

Non genera file, forse non quello che ci si aspettava.

-4 byte hack riproducono il rumore solo sul canale sinistro

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()}}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.