Gerar ruído branco

15

O desafio é: gerar um arquivo de áudio feito de ruído branco.
Requisitos e instruções:

  • Seu programa deve gerar um arquivo de áudio contendo apenas ruído branco, o que significa que a intensidade é a mesma para todas as frequências (razoáveis) e diferentes de zero [veja um gráfico de exemplo ];
  • É preciso ser capaz de reproduzir o arquivo de áudio na versão mais recente do VLC [no momento em que você escreve sua resposta];
  • O programa não precisa de aleatoriedade, randfunções ou leitura criptograficamente forte /dev/rand;
  • O programa deve ser capaz de gerar pelo menos 1 hora de áudio, pelo menos em teoria (o que significa que limitações do sistema, como tamanho máximo de arquivo não se aplicam);
  • Sua pontuação é o número de bytes no seu código-fonte, mais todos os bônus que se aplicam;
  • Usar qualquer biblioteca externa de terceiros é bom;
  • O programa deve funcionar sem acesso à Internet.

Os bônus são:

  • -15%: permite especificar o formato do arquivo de áudio (pelo menos duas opções; o número de opções possíveis não altera a pontuação);
  • -10%: permite especificar a duração do arquivo de áudio;
  • -5%: permite especificar a taxa de bits do arquivo de áudio.

As configurações podem ser armazenadas em variáveis, arquivos ou fornecidas como parâmetros de linha de comando, à sua escolha. As porcentagens são calculadas a partir do número original de bytes, antes que qualquer bônus seja aplicado.

Giulio Muscarello
fonte
A especificação do problema parece estar descrevendo um desafio de resfriamento de código, mas as tags dizem o contrário.
Undergroundmonorail
Ops! Eu vou consertar isso.
Giulio Muscarello
Talvez o desafio deva ser revisado para permitir apenas "bibliotecas de terceiros existentes" em vez de "qualquer biblioteca".
Jpmc26
Você vai ser um defensor do barulho sendo branco? Se você realmente deseja verificar: o autocorrelograma deve ter um pico claro em torno de zero e quase nada em qualquer outro atraso. Se você não for um defensor, digo que não faz sentido especificar que seja ruído branco. Apenas diga barulho.
Tim Seguine
E o WebAudioAPI? Eu codifiquei o programa js, que reproduz ruído branco
Евгений Новиков

Respostas:

4

MATLAB, 25

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

grava um novo arquivo WAV no disco chamado a. Tem uma taxa de amostragem de 8 kHz e 16 bits por amostra no formato inteiro assinado. Os dados de origem são distribuídos uniformemente no intervalo [0,1], que é mapeado para o intervalo [0,32767]após a conversão para o formato inteiro.

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

Não sei ao certo o que o OP quis dizer sobre como as configurações podem ser armazenadas nas variáveis, mas interpretei-o de uma maneira favorável a esse caso. Assumindo que:

  • A taxa de bits desejada (em bits / segundo) é fornecida pelo usuário na variável b. Os bits por amostra são codificados em 16.

  • A duração desejada do arquivo (em amostras) é fornecida na variável d .

O resultado é:

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

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

Adicionando outra camada de sleaze em busca de bônus, faço outra suposição: a função desejada a ser usada para gerar o arquivo deve ser especificada na variável f. Em seguida, o código simplifica para:

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

Os valores permitidos para a função são:

f = @wavwrite

ou

f = @auwrite

Cada função fará com que o trecho acima grave um arquivo no formato apropriado (WAV ou .au) a uma taxa de amostragem de 8 kHz com a duração especificada. Tirei o bônus para a especificação da taxa de bits aqui, porque o auwritepadrão é 8 bits por amostra em vez de 16 como o wavwritefaz. Não vejo uma maneira de harmonizar os dois sem usar mais caracteres.

Jason R
fonte
10

Bash, 34

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

Se você não quiser 'aleatoriedade' no disco rígido (muito mais lento)

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

SPIN, 28

word x=0
repeat
 word[?x]=?x
O médico
fonte
4
De alguma forma eu não acho que o cabeçalho do arquivo pode ser totalmente aleatória / o mesmo que o disco rígido primeiro setor
John Dvorak
1
Herr Doctor pode estar certo, se o equipamento de teste for VLC. VLC é bastante perdoador.
Jonathan Van Matre
1
Você gerou ruído, mas é ruído branco?
Stephen Melvin
1
/ dev / random também existe em Macs, sim! Infelizmente, o iTunes não pode reproduzir o arquivo wav resultante. Não que eu possa reclamar - optei pelo VLc por causa de seu perdão e da multiplicidade de codecs nativos.
Giulio Muscarello
1
Você pode salvar cinco caracteres executando o comando enquanto o diretório de trabalho estiver /dev.
David Richerby
4

Mathematica 52 - 5 = 47

gexporta um arquivo .wav de ruído branco de ssegundos e 8000 bps.

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

Exemplo: um arquivo de ruído branco de 6 segundos é exportado.

g[6]

p.wav

DavidC
fonte
4

Supercollider, 89 - 10% = 80,1 bytes

Infelizmente, apesar de ter sido feito deliberadamente para geração de som / áudio, esse idioma não vai ganhar aqui. Mas é a primeira aparição de Supercollider no Code Golf, então isso é legal!

Esse envio perde principalmente porque configurar e fazer acontecer é um processo detalhado devido ao design do cliente / servidor desse idioma. Ainda assim, é uma linguagem legal com muito poder em muito pouco código quando você pede para fazer coisas mais complexas que o mero ruído branco.

A duração do arquivo é definida alterando o valor wait (). Eu poderia colocá-lo em uma variável, mas realmente não faz sentido, já que o Supercollider não tem o que falar. A interatividade está em manipular o código ao vivo enquanto o servidor ainda está em execução. Essencialmente, o IDE é a E / S (a menos que você crie uma interface do usuário para sua criação).

Aqui está a versão do golfe:

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

Aqui está uma versão com a opção de gravar em aiff ou wav e especifique um formato de amostra (int16, int8 e float são todas as opções). Infelizmente, mesmo com todos os bônus, a versão acima se sai melhor. Isso seria 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}

E aqui está uma versão desmontada desta última, para que você possa ver o que está acontecendo.

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

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

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}
Jonathan Van Matre
fonte
um voto para o uso do Supercollider. Existem muitos outros quebra-cabeças pelos quais seria ótimo. Confira música e áudio
Não que Charles
4

Bash + ALSA, pontuação: 44 (52 caracteres - (10% + 5%) bônus)

Mais longo que a outra bashresposta, mas aceita duração e taxa de bits. Também adiciona um cabeçalho razoavelmente correto ao arquivo, portanto deve ser razoavelmente portátil:

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

Salve como um script chmod +xe execute:

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

Observe que a saída .wav é para stdout, portanto deve ser redirecionada para um arquivo.

Trauma Digital
fonte
Você pode salvar cerca de 1,20 caracteres lendo / dev / random em vez de / dev / urandom, pois a velocidade não é um requisito.
Giulio Muscarello
1
saída é 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();}

A maioria do código grava o cabeçalho de um arquivo * .au. Isso imprime um arquivo de som pseudo-aleatório para a saída padrão.

A taxa de amostragem pode ser ajustada alterando o 8000 .

A duração pode ser ajustada pressionando ctrl-csempre que você quiser parar :-)

teto
fonte
0

JavaScript, 167 bytes

CUIDADO: Diminua o volume antes da execução. O ruído branco é desagradável

Não gera arquivo, talvez não o que era esperado.

-4 bytes cortam ruído de reprodução apenas no canal esquerdo

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

Евгений Новиков
fonte