To jest Tygodniowe Wyzwanie nr 1. Temat: Przetwarzanie audio
Twoim zadaniem jest napisanie programu, który zapisuje plik audio do płyty (w formacie do wyboru), który zawiera kod Morse'a za 2015
, tj
..--- ----- .---- .....
Możesz wybrać dowolny rodzaj dźwięku dla segmentów, np. Falę sinusoidalną o pojedynczej częstotliwości, akord, szum, jakiś instrument (np. Używając plików MIDI), o ile jest to słyszalne. Istnieją jednak pewne ograniczenia dotyczące czasu:
- Krótkie odcinki muszą mieć co najmniej 0,2 sekundy długości.
- Długie odcinki muszą być co najmniej 3 razy dłuższe niż krótkie odcinki.
- Przerwy między segmentami w obrębie cyfry powinny być tej samej długości co krótkie segmenty.
- Przerwy między cyframi powinny mieć taką samą długość jak długie segmenty.
- Każdy segment i przerwa mogą różnić się do 10% od średniej długości tego rodzaju segmentu / przerwy.
- Cały plik audio nie może być dłuższy niż 30 sekund.
Przerwy nie muszą być całkowicie ciche, ale segmenty Morse'a powinny być słyszalnie głośniejsze niż przerwy.
Należy pamiętać, że mają napisać plik audio. Nie można po prostu odtwarzać dźwięku, np. Za pomocą sygnałów systemowych. Możesz używać dowolnego rodzaju biblioteki do obsługi formatu pliku i generowania dźwięku, ale nie możesz używać wbudowanych funkcji do kodowania Morse'a.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Proszę rozważyć połączenie z przesłaniem wynikowego pliku audio (na SoundCloud lub podobnym), aby ludzie mogli sprawdzić wynik bez konieczności uruchamiania kodu. Jeśli przesyłasz do SoundCloud, pamiętaj, aby włączyć pobieranie na karcie Uprawnienia ścieżki.
Jeśli dane wyjściowe używają raczej nietypowego formatu pliku, dodaj informacje o tym, jak je odtworzyć i / lub przekonwertować na bardziej popularny format i przesłać.
Przykładowy utwór
Jest to ręcznie wygenerowana przykładowa ścieżka, która jest zgodna ze specyfikacją i wykorzystuje szum dla segmentów Morse'a (a konkretnie szum tła mikrofonu). Oto link do SoundCloud, jeśli wbudowany odtwarzacz nie działa dla Ciebie.
Szczegóły nagrody
Przyznam nagrodę za najkrótsze zgłoszenie w języku programowania audio , tj. Języku zaprojektowanym do syntezy dźwięku. Ta lista nie jest kompletna, więc możesz użyć innego języka programowania audio, jeśli go znasz. Jeśli nie masz pewności, czy jakiś język, którego chcesz używać, klasyfikuje się jako język programowania audio, daj mi znać w komentarzach lub na czacie , a my możemy to omówić.
Pamiętaj, że Twoje zgłoszenie musi być zgodne ze wszystkimi zasadami - w szczególności musi napisać plik, co może nie być możliwe we wszystkich językach programowania audio. Na przykład, o ile wiem, gibber może odtwarzać tylko dźwięk i nie zapisywać go w pliku.
Odpowiedzi:
AWKBASH:66866774 bajtówZgodnie z prośbą Martina Büttnera dodałem tempo, odkąd sprawdziłem standard Notacji ABC wydaje się, że nie ma zdefiniowanej wartości domyślnej (dziękuję nutki za wskazanie tego).
Piszę również w pliku dyskowym (a) zamiast STDOUT, ponieważ pytanie wyraźnie chciało „plik na dysku”.
Ustawiam tempo 99, co powoduje, że plik audio trwa 22 sekundy; Jest wolniejszy niż moja poprzednia wersja, ale przynajmniej teraz powinien mieć taką samą długość na każdym odtwarzaczu ABC i zmieści się poniżej 30 sekund.
Wygląda ... bardzo podobnie do poprzedniej wersji, jak widać:
Tutaj jest nowy plik midi .
Pierwsza wersja BASH (brakuje tempa)
Dlaczego nie pomyślałem o tym po raz pierwszy ...: o)
To o 22 bajty mniej niż w AWK, dla tego samego wyniku
Podobnie jak poprzednia wersja w AWK, zapisuje na standardowym pliku notacji „ABC” (dzięki Tobia za to, że stwierdzenie „L” było opcjonalne)
To wygląda tak:
I brzmi dokładnie tak jak poprzednia wersja .
Poprzednia wersja w AWK (86 bajtów)
Oto nowa wersja; trochę dłużej, ale z bardziej dokładnym czasem. Pozwoliłem pierwszej wersji poniżej na porównanie / odniesienie:
Jest to nadal prawidłowy plik „abc”, który wygląda następująco:
Oto nowy plik midi (przyspieszyłem tempo, aby pozostać poniżej limitu 30 sekund).
Pierwsza wersja w AWK (66 bajtów):
Jest to o wiele mniej interesujące niż moja poprzednia odpowiedź , ale jest o wiele krótsze, więc:
Wyprowadza to prawidłowy plik „abc”, który można wczytać (między innymi) EasyABC. Będzie to wyglądać tak:
i zabrzmi to tak (plik midi) . +
źródło
kod maszynowy x86 (plik .COM):
121120113109 bajtówHexdump:
Można go łatwo uruchomić pod DosBox; dane wyjściowe to plik .SND o nazwie
SND
. Oto wersja wyjściowa FLAC (a tutaj plik .COM).Skomentowany montaż:
The
data.dat
Zawiera powyżej jest łatwy w obsłudze przedstawia ciąg Morse'a (niższy nieco: dźwięk / dźwięk, górne 7 bitów Długość dźwięku w próbkach >> 4) generowane przez skrypt Pythonieźródło
a
Oda.snd
kładzie się tuż przed nagłówku SND, która rozpoczyna się.snd
po bajtem zerowym, więc otrzymuję.snd
udział za darmo i recyklingu jego zero-terminator. Ponadto fakt, że nagłówek zaczyna się o jeden bajt po nazwie pliku, pozwala mi użyć ainc dx
do przejścia do nagłówka (1 bajt) zamiastmov dx, header
(3 bajty). OTOH, gdybym mógł nazwać to.snd
sam, mógłbym zaoszczędzić dwa bajty, ale nie jestem pewien, czy prawdziwy DOS na to pozwoli (traktowanie rozszerzenia pod DOS było dość osobliwe)..SND
: dostałem się.SND
na DosBox,SND~1
na FreeDOS i oczekuję czegoś innego na „prawdziwym” DOS; dlatego jest to zdecydowanie obszar „niezdefiniowanego zachowania”. W końcu zdecydowałem się na wywołanie plikuSND
(1 bajt mniej z powodu usuniętegoa
, zachowując kosztinc dx
- który staje siędec dx
).Mathematica - 130
Graj online
źródło
Export
, na przykład"m.mid"~Export~Sound@...
.(b=None~s~#&)@.6
powinno być(b=None~s~#&)@.4
również, możesz zapisać 3 znaki używającr = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
Perl 5: 94
122 140Pliki SND mają prostsze nagłówki, nie trzeba drukować w formacie binarnym. Te wersje produkują monofoniczny plik SND 8 kHz o nazwie „a”:
W rezultacie plik .
Stare rozwiązanie. Tworzy 8-bitowy plik WAV mono 1kHz o nazwie „a”:
W rezultacie plik .
Aby uzyskać 122 znaki, musiałem wkleić nagłówek w formacie binarnym zamiast go pakować, co utrudnia skopiowanie kodu. Wersja ucieczkowa to:
Kodowanie Base64 rzeczywistego rozwiązania 122 bajtów:
źródło
.au
rozszerzenia. Dobra robota!AWK:
172170 bajtów... i bez korzystania z biblioteki wave! (*)
Powoduje to wyjście pliku audio Sun au na standardowe wyjście, które może być odtwarzane przez VLC (między innymi). Chociaż format pliku au nie ma żadnych ograniczeń częstotliwości próbkowania, VLC odmawia odtworzenia dowolnego pliku o częstotliwości próbkowania gorszej niż 4096 Hz, więc użyłem tej częstotliwości
EDYCJA: Link do wynikowego pliku audio w DropBox
(*) Czy nie powinna być za to premia? ; o)
źródło
d=d "\177
... konkatenacji. To oszczędza bajt. Ale kiedy odtwarzam wynikowy plik audio, wygląda na to, że brakuje mu ostatniego dit 5.Python, 155
Używa wbudowanego modułu falowego Pythona.
Zapisuje do pliku o nazwie
n
.Dziękuję Sp3000 za sugestie dotyczące korzystania ze zrozumienia listy dla pętli (pomogło to usunąć nieco wcięcia).
Posłuchaj tego:
https://soundcloud.com/bitpwner/morse-the-new-year-2015
Oto link do SoundCloud, jeśli wbudowany odtwarzacz nie działa dla Ciebie.
Skomentowany kod:
źródło
w
jest to efekt uboczny, myślę, że możesz wymienić comp, aby zaoszczędzić dwa bajty:while h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
C #,
556552536535516506503491483 bajtówKorzysta z biblioteki Wav.Net .
Dane wyjściowe do pliku o nazwie
a
.Wynik hostowany na Dropbox
Nieskluczony kod:
źródło
Pyton
3)2,191188174171 (bez bibliotek)Pliki WAV są niezwykle proste. Chciałem wypróbować bez bibliotek. Z jakiegoś powodu moje pliki powodują awarię Windows Media Player. Szybki czas
Pracebłędy w połowie pliku. Rozwiązuje to konwersja na większą częstotliwość próbkowania za pomocą Audition.Aktualizacja : Wdrożono kilka optymalizacji z odpowiedzi Perla. Teraz wyświetla tylko nazwę
n
i próbkowanie 1000 Hz. Edytowane informacje powyżej odpowiednio.Stara wersja
źródło
C # ~ 485 bajtów
Korzystanie z biblioteki Wav.Net .
A oto wynik.
Wersja do odczytu,
źródło
C #
382333 bajtówNie używa żadnych niestandardowych bibliotek, zapisuje wav 8bits na próbkę 44100 próbek na sekundę wav, z czym mam nadzieję, że jest to prawidłowy nagłówek (wydaje się, że gra / ładuje się szczęśliwie w WMP / .NET / Audacity).
Nagłówek jest kodowany w standardzie base64, a Morse jest kodowany jako sygnał wł / wył, który jest przechowywany w jednym długim (64 bity), ponieważ ostatnie 5 bitów jest takich samych jak pierwszy.
Wynik można znaleźć tutaj
Kod do gry w golfa:
Z komentarzami:
źródło
.wav
, więc możesz zapisać tam 4 bajty.SuperCollider ,
625605 bajtówZgłoszenie języka programowania audio!
Dane wyjściowe są zapisywane w pliku
b
w formacie AIFF. Windows Media Player nie otwiera się, ale działa dobrze w odtwarzaczu VLC Media Player. Wygenerowany plika
to plik OSC .Stworzyłem kilka funkcji SuperCollider:
f
generuje krótki sygnał dźwiękowy,g
krótką przerwę,h
długi sygnał dźwiękowy ii
długą przerwę. SuperCollider potrzebuje pozycji początkowych dla każdej fali sinusoidalnej, a nie długości, więc musiałem stworzyć funkcje generujące falę z prawidłową pozycją początkową i muszę wywoływać funkcje za każdym razem, gdy potrzebuję fali sinusoidalnej. (Nie mogłem przechowywać fali o określonej długości w zmiennej do ponownego użycia). The\w
Definicja jest tworzona na końcu bloku kodu.Na moim komputerze z systemem Windows nie zapisał pliku audio w tym samym katalogu co mój kod, ale w tym katalogu:
Wynik hostowany na Dropbox
Kod z wcięciem:
źródło
ChucK -
1195217201147145144ChucK to język programowania audio. bitpwner pomógł mi obniżyć to z 201 bajtów do 147 bajtów.
Oto bezpośredni link do SoundCloud, jeśli wbudowany odtwarzacz nie działa dla Ciebie.
źródło
WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
j
aby ominąć tablicę?1016835
binarne to11111000010000000011
.j
ma po prostu śledzić przerwy między poszczególnymi cyframi2015
(każda cyfra ma 5 dźwięków).Csound, 140 + 40 = 180
Język programowania audio.
To jest plik orkiestry:
a to jest plik wyniku:
Rozmiary są obliczane przy założeniu, że nie ma dodatkowych białych znaków, terminatora jednowierszowego (UNIX) i żadnego terminatora po ostatniej linii.
Wywołujesz je za pomocą polecenia csound:
który utworzy plik wyjściowy w bieżącym katalogu, domyślnie o nazwie „test.aif”
https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq
Mógłbym ogolić dwa lub trzy bajty, wybierając brzydszy kształt fali, ale podoba mi się dźwięk tradycyjnej fali sinusoidalnej Morse'a.
PS: Jestem całkowitym nowicjuszem w Csound, wszelkie wskazówki dotyczące gry w golfa są mile widziane, szczególnie jeśli chodzi o plik z wynikami!
źródło
pieprzenie mózgu , 649 bajtów
Generuje to sekwencję 8-bitowych próbek bez znaku, które można odtwarzać z prędkością 8000 próbek na sekundę za pomocą narzędzia takiego jak
aplay
Linux. Kredyt do tabeli stałych BF .Wypróbuj online!
Nieco mniej golfa
źródło