Generuj biały szum

15

Wyzwanie polega na: wygenerowaniu pliku audio z białego szumu.
Wymagania i instrukcje:

  • Twój program musi wygenerować plik audio zawierający tylko biały szum, co oznacza, że ​​jego intensywność jest taka sama dla wszystkich (rozsądnych) częstotliwości i niezerowych [patrz przykładowy wykres ];
  • Plik audio musi być odtwarzany w najnowszej wersji VLC [w momencie pisania odpowiedzi];
  • Program nie potrzebuje silnej kryptograficznie losowości, randfunkcji lub odczytu /dev/randjest w porządku;
  • Program musi być w stanie wygenerować co najmniej 1 godzinę dźwięku, przynajmniej teoretycznie (co oznacza, że ​​ograniczenia systemowe, takie jak maksymalny rozmiar pliku, nie mają zastosowania);
  • Twój wynik to liczba bajtów w kodzie źródłowym plus wszystkie mające zastosowanie premie;
  • Korzystanie z zewnętrznych bibliotek jest w porządku;
  • Program musi działać bez dostępu do Internetu.

Bonusy to:

  • -15%: Pozwala określić format pliku audio (co najmniej dwie opcje; liczba możliwych opcji nie zmienia wyniku);
  • -10%: Pozwala określić czas trwania pliku audio;
  • -5%: Pozwala określić bitrate pliku audio.

Ustawienia mogą być przechowywane w zmiennych, plikach lub podane jako parametry wiersza poleceń do wyboru. Procenty są obliczane na podstawie oryginalnej liczby bajtów, zanim zostanie zastosowany jakikolwiek bonus.

Giulio Muscarello
źródło
Specyfikacja problemu wydaje się opisywać wyzwanie kolifowania kodu, ale tagi mówią inaczej.
undergroundmonorail
Ups! Naprawię to.
Giulio Muscarello
Być może wyzwanie powinno zostać zmienione, aby zezwolić tylko na „istniejące biblioteki stron trzecich” zamiast „dowolnej biblioteki”.
jpmc26
Czy będziesz troche upierdliwy, ponieważ hałas jest biały? Jeśli naprawdę chcesz to zweryfikować: jego autokorelogram powinien mieć wyraźny skok wokół zera i prawie nic w żadnym innym opóźnieniu. Jeśli nie zamierzasz być trikarzem, mówię, że nie ma sensu określać, że będzie to biały szum. Po prostu powiedz hałas.
Tim Seguine
Co z WebAudioAPI? Zakodowałem program js, który gra biały szum
Евгений Новиков

Odpowiedzi:

4

MATLAB, 25

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

zapisuje nowy plik WAV na dysku o nazwie a. Ma częstotliwość próbkowania 8 kHz i 16 bitów na próbkę w formacie liczby całkowitej ze znakiem. Dane źródłowe są równomiernie rozmieszczone w interwale [0,1], który jest zamapowany na interwał [0,32767]po konwersji do formatu liczb całkowitych.

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

Nie jestem pewien, co OP znaczyło o tym, jak ustawienia mogą być przechowywane w zmiennych, ale zinterpretowałem to w sposób korzystny dla tego przypadku. Przy założeniu, że:

  • Pożądana przepływność (w bitach / sekundę) jest podawana przez użytkownika w zmiennej b. Bity na próbkę są zakodowane na stałe na 16.

  • Pożądany czas trwania pliku (w próbkach) podano w zmiennej d.

Wynik to:

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

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

Dodając kolejną warstwę obłudy w pogoni za premiami, przyjmuję inne założenie: pożądana funkcja, która ma zostać użyta do wyprowadzenia pliku, powinna być określona w zmiennej f. Następnie kod upraszcza:

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

Dopuszczalne wartości funkcji to:

f = @wavwrite

lub

f = @auwrite

Każda funkcja spowoduje, że powyższy fragment kodu wypisze plik o odpowiednim formacie (WAV lub .au) z częstotliwością próbkowania 8 kHz o określonym czasie trwania. Zdjąłem tutaj bonus za specyfikację szybkości transmisji, ponieważ auwritedomyślnie wynosi 8 bitów na próbkę zamiast 16 podobnie wavwrite. Nie widzę sposobu na zharmonizowanie tych dwóch elementów bez użycia większej liczby postaci.

Jason R.
źródło
10

Bash, 34

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

Jeśli nie chcesz „losowości” dysku twardego, (dużo wolniej)

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

SPIN, 28

word x=0
repeat
 word[?x]=?x
Doktor
źródło
4
Jakoś nie sądzę, że nagłówek pliku może być całkowicie losowy / taki sam jak pierwszy sektor dysku twardego
John Dvorak
1
Herr Doctor może mieć rację, jeśli uprząż testowa to VLC. VLC jest dość wybaczające.
Jonathan Van Matre
1
Wygenerowałeś hałas, ale czy to biały szum?
Stephen Melvin
1
/ dev / random istnieje również na komputerach Mac, tak! Niestety iTunes nie może odtworzyć wynikowego pliku WAV. Nie mogę narzekać - zdecydowałem się na VLc ze względu na jego wybaczenie i mnogość rodzimych kodeków.
Giulio Muscarello
1
Możesz zapisać pięć znaków, wykonując polecenie, gdy katalog roboczy jest /dev.
David Richerby,
4

Mathematica 52 - 5 = 47

geksportuje plik .wav szumu białego w ssekundach i 8000 bps.

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

Przykład: eksportowany jest 6-sekundowy plik białego szumu.

g[6]

p.wav

DavidC
źródło
4

Supercollider, 89–10% = 80,1 bajtów

Niestety, pomimo tego, że został celowo stworzony do generowania dźwięku / dźwięku, ten język nie wygra tutaj. Ale to pierwszy występ Supercollider na Code Golf, więc to świetnie!

To przesłanie przegrywa przede wszystkim dlatego, że konfiguracja nagrywania i realizacja go jest pełnym procesem ze względu na projekt klienta / serwera tego języka. Mimo to jest to fajny język z dużą mocą w bardzo małym kodzie, gdy go poprosisz rzeczy bardziej złożonej niż zwykły biały szum.

Czas trwania pliku ustawia się poprzez zmianę wartości wait (). Mógłbym umieścić to w zmiennej, ale tak naprawdę nie ma sensu, ponieważ Supercollider nie ma o czym mówić. Interaktywność polega na manipulowaniu kodem na żywo, podczas gdy serwer wciąż gra. Zasadniczo IDE to We / Wy (chyba że zbudujesz interfejs użytkownika dla swojego stworzenia).

Oto wersja golfowa:

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

Oto wersja gry w golfa z opcją nagrywania w formacie aiff lub wav i określania przykładowego formatu (int16, int8 i float to wszystkie opcje). Niestety, pomimo wszystkich bonusów, powyższa wersja wypada lepiej. Będzie to 139–30% = 97,3 bajtów.

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

A oto nieprzylepiona wersja tego drugiego, dzięki czemu możesz zobaczyć, co się dzieje.

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

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

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}
Jonathan Van Matre
źródło
jeden głos za korzystanie z Supercollider. Jest wiele innych zagadek, dla których byłoby WIELKIE. Sprawdź muzykę i audio
Nie że Charles
4

Bash + ALSA, wynik: 44 (52 znaki - (10% + 5%) bonusów)

Dłuższy niż druga bashodpowiedź, ale akceptuje czas trwania i szybkość transmisji. Dodaje również poprawny nagłówek do pliku, więc powinien być w miarę przenośny:

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

Zapisz jako skrypt, chmod +xuruchom i uruchom:

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

Uwaga: wyjście .wav jest ustawione na standardowe wyjście, więc musi zostać przekierowane do pliku.

Cyfrowa trauma
źródło
Możesz zapisać około 1,20 znaków, czytając / dev / random zamiast / dev / urandom, ponieważ szybkość nie jest wymagana.
Giulio Muscarello
1
wyjście jest na standardowe wyjście ?
user253751
0

C 127 115 bajtów

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

Większość kodu zapisuje nagłówek pliku * .au. Spowoduje to wydrukowanie pseudolosowego pliku dźwiękowego na standardowe wyjście.

Częstotliwość próbkowania można dostosować, zmieniając 8000.

Czas trwania można regulować, naciskając, ctrl-cgdy chcesz się zatrzymać :-)

sufitowy
źródło
0

JavaScript, 167 bajtów

UWAGA: Zmniejsz głośność przed uruchomieniem. Biały szum jest paskudny

Nie generuje pliku, może nie tego, czego oczekiwano.

-4 bajty włamują się do odtwarzania szumu tylko na lewym kanale

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

Евгений Новиков
źródło