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.


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.


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

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


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
}

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.


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 :-)


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.