Chyba każdy, kto zajmował się Linuksem przez pewien okres czasu zna jedno z nietypowych sposobów wykorzystania generatora pseudolosowego /dev/urandom do wytwarzania białego szumu.
Dla przypomnienia - kod najczęściej wygląda tak:
cat /dev/urandom > /dev/dsp
W moim przypadku wynikła jednak nieco inna potrzeba – potrzebowałem plik wave z zapisem tego szumu, miast słuchania go w wolnej chwili.
Jakoś nie widziało mi się bawienie się w czytanie specyfikacji formatu wave i ręczne wpisywanie nagłówków do pliku. Nie, jeśli chodzi tylko o chwilę rozrywki. Tak więc potrzebowałem prostego sposobu, który nie będzie sprawiać dużo kłopotu.
Z pomocą przyszło Google i Python. Okazuje się, że w pliku README biblioteki pyao opisano krok po kroku, jak to zrobić.
Wystarczy urpmi pyao (w innych dystrybucjach, niż Mandriva możliwe, że konieczna będzie ręczna instalacja pakietu – jednak w wypadku Pythona proces ten jest jeszcze łatwiejszy, niż w paczkach stworzonych przy pomocy autotools) i już możemy zgrywać szum do pliku.
Uruchamiamy shell Pythona i wpisujemy:
>>> import ao
>>> dev = ao.AudioDevice('wav', filename = 'myoutput.wav')
>>> f = open('/dev/urandom', 'r')
>>> data = f.read(1024*1024*8)
>>> dev.play(data)
Zamykamy shella.
8MiB to około 48 sekund szumu. Można się domyśleć, że i rozmiar pliku będzie niewiele większy.
Hmm, jak przeczytałem że potrzebujesz szumu, to pierwsze co mi na myśl przyszło to sox (man sox).
Szybki rzut okiem do manuala i potem robię coś takiego:
$ cat /dev/urandom > szum.raw
# …czekam i wciskam C-c…
$ sox -r 22050 -w -c 2 -s szum.raw szum.wav
# interpretuje dane wejściowe, że niby mają 22kHz, 16 bitów, stereo i kodowane liniowo i wyrzucam do szum.wav
$ mplayer szum.wav
🙂
sox! Nigdy o nim nie pamiętam.
Raz w życiu używałem do przerzucenia 22k wave na 44k, bodajże z powodu niemożności zenkodowania dwudziestek dwójek pod mppenc.
Pamiętam, że gdzieś zapisywałem spostrzeżenia z początków przygody z Linuksem – chyba sobie tego poszukam. 😉