Dzisiaj, 11 listopada 2015 r., Jest Dzień Weteranów w Stanach Zjednoczonych. „ Taps ” to hejnał grany na amerykańskich pogrzebach wojskowych:
( „Taps” na SoundCloud z vtmiller )
Jest to prosta melodia, długa tylko na dwadzieścia cztery nuty i wykorzystująca tylko cztery różne nuty. Oto nuty:
( źródło )
Wyzwanie
Napisz program lub funkcję, która odtwarza „Taps” lub generuje plik audio „Taps” w dowolnym popularnym formacie pliku audio (np. MP3, WAV, MIDI). Można go odtwarzać dowolnym klawiszem, używając dowolnego rodzaju instrumentu lub sygnału dźwiękowego dostępnego w Twoim języku. Na przykład może to brzmieć jak fortepian zamiast trąbki. (Chociaż nadal należy stosować tylko jeden typ instrumentu.)
Wszystkie dwadzieścia cztery nuty muszą być odtwarzane z dokładną wysokością, czasem trwania i odstępami. Ktoś, kto zna „Taps”, powinien umieć uruchomić kod i łatwo rozpoznać odtwarzany utwór.
Czas trwania melodii (od początku pierwszej nuty do końca ostatniej nuty) musi wynosić od 30 do 70 sekund. Opcjonalnie możesz mieć do 5 sekund ciszy, wypełniając początek i / lub koniec pliku dźwiękowego, więc plik o długości 80 sekund jest najdłuższym dozwolonym.
Oczywiście nie możesz po prostu pobrać utworu w Internecie ani wyodrębnić go z biblioteki audio, która przypadkowo ma go jako próbkę. Możesz jednak korzystać z bibliotek audio, które mogą odtwarzać / komponować pojedyncze nuty i tworzyć pliki audio.
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach. Jednak w przypadku tego konkretnego wyzwania zachęcam do nie koncentrowania się na liczbie bajtów, szczególnie kosztem jakości dźwięku. Przeanalizuj swoje zgłoszenia, ale pozwól sobie na kreatywność w wyborze instrumentów lub metodologii wyjścia dźwięku. Wyzwanie to ma na celu uhonorowanie weteranów, a nie wykrzyczenie ledwo rozpoznawalnej wersji „Taps”.
Pamiętaj, że możesz osadzić pliki audio SoundCloud bezpośrednio w postach , wklejając link w pustym wierszu. Jeśli masz konto SoundCloud, byłby to świetny sposób na udostępnienie swoich wyników.
źródło
Odpowiedzi:
qb64,
10084 bajtówZaktualizowana wersja starego Qbasic, do pobrania pod adresem http://www.qb64.net/
Funkcja Count wyklucza spacje, które nie są wymagane, i tylko w celu podzielenia danych na trzynotowe frazy dla zachowania przejrzystości.
Polecenia w łańcuchu odtwarzania
Historia golfa:
Pierwszy post: od 4/4 do 4/2, co oznacza, że mam kilka całych nut, ale nie mam szesnastych nut.
Edycja 1: Zmieniono klucz z C (zakres GG) na F (zakres CC). Teraz muszę tylko raz zmienić oktawę, dla wysokiego C, które występuje tylko raz, zamiast wszystkich niskich G jak poprzednio.
Po wyeliminowaniu wszystkich tych zmian oktaw, nie sądzę, aby było więcej do golfa. Istnieje w sumie 20
L
, ale nie ma oczywistego sposobu na ich uniknięcie.Ostatnia fraza (11 znaków) jest taka sama jak pierwsza, ale nie ma możliwości dwukrotnego wstawienia jej poniżej 11 znaków. Powtarzane dane miałyby tylko 9 znaków, gdyby inicjał
L4
został wyeliminowany (Wydaje się to niepotrzebne, ponieważ domyślna długość nuty wydaje się ćwierćnuta, ale nie jest udokumentowana, więc zostawiłem ją.)źródło
JavaScript,
203198196195 bajtów5 bajtów zapisanych dzięki Dendrobium i 1 dzięki @PatrickRoberts.
Wyjaśnienie
Przetestuj to tutaj w przeglądarce! Działa w każdej przeglądarce obsługującej HTML5 Web Audio API .
źródło
Mathematica,
361287285 bajtówPoszedłem tutaj po dokładność. Wyjście jest dokładnie takie, jak opisano w partyturze, granej na trąbce. Plik można znaleźć tutaj .
Dzięki @ MartinBüttner za sugestie dotyczące gry w golfa.
źródło
%1
,%2
i%%
tak naprawdę nie zapisuj żadnych bajtów ponadx="E5"
-x
(w rzeczywistości, biorąc pod uwagę, jak często ich używasz, powinieneś sporo zaoszczędzić, używając zmiennych). Następnie możesz zaoszczędzić mnóstwo bajtów, używającEmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}
i przechowując najczęściej używaną notatkę w%
. Przy 24 notatkach dzielenie płaskiej listy może być jeszcze krótsze:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Sonic Pi, 899 bajtów
Czas jest trochę opóźniony, ale myślę, że jest w porządku.
Lekko golfa:
źródło
MATLAB,
338327262258230 bajtówźródło
SmileBASIC, 73 bajty
Wszystkie nuty i czasy są prawidłowe. Użyłem trąbki, ponieważ jest to najbliższa rzecz w MIDI
źródło
PowerShell,
183175159 bajtówNostalgia trip, kto nie lubi dźwięków ?!
Objaśnienie (sortof)
Gra rozpocznie się za około 45 sekund.
Po raz pierwszy korzystam z Windows PowerShell, wszelkie wskazówki dotyczące gry w golfa są mile widziane.
Stare wersje
175183źródło
BBC Basic, 111
Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Wynik wyklucza białe znaki i znaki nowej linii, które nie są niezbędne i zostały dodane do czytelności
Dość standardowa kompresja, 1 znak ASCII na nutę. Parametry
SOUND
są następujące:Zakres utworu wynosi 13 nut, mimo że używane są tylko 4. Aby wprowadzić ten zakres do 95-liczbowego zakresu drukowalnego ASCII, musiałem ścisnąć czas trwania do zakresu liczb całkowitych 7 i przyjąć go modulo 7. Zastosowano następujące czasy trwania (w szesnastych) (z wyjątkiem 6, które nigdy nie jest używane): 1,2,3,4,6,8,12. Aby uzyskać te liczby, wpadłem na pomysł podzielenia 12 przez potęgę
sqrt(2)
(przybliżoną przez 1,4) i obcięcia.SOUND1,0,1,1
Jest kłopot, kosztuje 12 bajtów. Konieczne jest zapewnienie przerwy między nutami o identycznej wysokości.źródło
Rubin + dźwięk, 178 bajtów
Chwilę mi to zajęło, myślę, że tęskniłem za łodzią, ale cokolwiek.
f
utrzymuje cztery używane częstotliwości.n
zawiera pięć używanych długości nut w wielokrotności 16 nut.a="00101...
przechowuje wszystkie wysokości nut, a następnie wszystkie długości nut, jako indeksy do odpowiednich tablic.l
jest następnie ustawiany na 24. wskaźnik i późnieja
. Następnie konstruuje się sygnał dźwiękowy poprzez iterację wszystkich powyższych elementów i wykonuje sięźródło
C - (Raw: 318 | WAV: 437)
8-bitowy (niepodpisany) mono PCM przy 44800 Hz, 33,60 sekundy.
Dynamika mezzo forte, fortissimo i forte została nieco artystycznie zaimplementowana. Fermaty mogłyby być lepsze.
Kod polega na tym,
unsigned long long
że ma 8 oktetów, a system jest małym endianem.Skompiluj i uruchom z czymś takim jak:
Dodaj
-DRAW
do linii kompilacji dla surowego wariantu.Surowe dane wyjściowe można odtwarzać np. W SoX
play
jako:źródło