Syntezatory dźwięku używają generatorów obwiedni do kontrolowania, w jaki sposób niektóre parametry dźwięku (takie jak ogólna głośność) zmieniają się z czasem. W wielu syntezatorach obwiednia jest zdefiniowana przez cztery parametry, jak pokazano na poniższym rysunku z Wikipedii :
- Czas ataku (A) : czas potrzebny na osiągnięcie przez kopertę maksymalnego poziomu, zaczynając od zera, gdy klawisz zostanie naciśnięty po raz pierwszy.
- Czas rozpadu (D) : czas potrzebny do osiągnięcia przez kopertę określonego poziomu podtrzymania.
- Poziom podtrzymania (S) : poziom, który jest utrzymywany po pierwszym ataku i rozpadzie, dopóki wciśnięty jest klawisz.
- Czas zwolnienia (R) : czas potrzebny do osiągnięcia przez kopertę zera po zwolnieniu klucza.
Wyzwanie
Wprowadź cztery parametry A, D, S, R i wykreśl obwiednię .
Parametry będą liczbami całkowitymi od 0 do 127 .
Maksymalny poziom (osiągnął na koniec fazy ataku) będą traktowane jako 127 .
Odcinka poziomego na poziomie utrzymania będą zakłada się, że czas trwania 64 (w rzeczywisty czas trwania dźwięku to nie jest stała, lecz zależy od ilości czasu, że klucz jest utrzymywany).
Format i dalsze szczegóły
Wyjście powinno być obrazem w formacie rastrowym lub wektorowym. Jeśli jest to raster, linia wielokątna powinna zajmować co najmniej 50 pikseli w pionie i poziomie.
Obraz może być wyświetlany lub wytwarzany jako plik w standardowym formacie obrazu. Plik może być zapisany na dysku lub jego dokładna zawartość może być wyprowadzona do STDERR lub jako argument powrotu funkcji.
Wykres musi zawierać tylko wielokątną linię, która określa obwiednię. Skalę każdej osi można dowolnie wybierać. Inne elementy, takie jak linie osi, etykiety numeryczne lub kolory linii są opcjonalne.
Środki wprowadzania i format są jak zwykle elastyczne . Na przykład możesz wziąć cztery liczby w dowolnej kolejności lub tablicę je zawierającą. Można zapewnić program lub funkcję . Standardowe luki są zabronione.
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Dane wejściowe są w formacie [A D S R]
. Należy pamiętać, że skala jest różna na każdej figurze (zgodnie z zasadą, że skala może być dowolnie wybierana)
[15 30 70 40]
[64 64 64 64]
[0 10 50 80]
[0 0 90 80]
[5 50 0 0]
[5 50 0 80]
[24 32 127 48]
źródło
Odpowiedzi:
MATL,
3122 bajtówAkceptuje cztery oddzielne wejścia zamawiać
A
,D
,R
,S
Wypróbuj to w MATL Online
Wyjaśnienie
źródło
TikZ,
195193181177172167163160159 bajtówPodziękowania dla Davida Carlisle'a za pomocną odpowiedź tutaj
Tak, dobrze słyszałeś TikZ .
Wyjaśnienie
Wykorzystuje kilka technik, aby osiągnąć swój cel. Pierwszą rzeczą jest wejście. Większość ludzi może nie wiedzieć, że L A T E X może przyjmować dane wejściowe. Cóż, może. Osiąga się to za pomocą polecenia
\typein
. Spowoduje to zatrzymanie kompilatora i zażądanie danych wejściowych od użytkownika, ponieważ przypisze je do zmiennej.Inną główną techniką jest użycie
\def
.\def
w Tikz jest absurdalnie potężny. Zasadniczo definiuje fragment kodu i wkleja go wszędzie tam, gdzie wywoływana jest zmienna. W tym kodzie definiujemy dwie rzeczy\typein[#1]{}
, abyśmy mogli przypisywać nasze zmienne w sposób golfowy i)--(\a+\d
ponieważ ten kod pojawia się wiele razy w wersji bez golfa.Oto dwie wersje kodu (bez opakowania):
Gra w golfa:
Nie golfowany:
Wizerunek:
Ponieważ nie mogę przesłać obrazu pdf bezpośrednio, a przekonwertowanie go na inny format wydaje się powodować całkowite zniknięcie linii, oto jak może wyglądać obraz po otwarciu w podglądzie (dane wejściowe dla tego obrazu to
[64 64 64 64]
:)Jak widać jest bardzo cienki. Ponieważ jednak jest to obraz PDF, a nie obraz rastrowy, nie musi spełniać wymagań dotyczących grubości.
źródło
input tikz\begin{document}
działa?pdflatex adsr.tex
wydaje się nie działać. - Och, czekaj, to działa, po prostu nie spodziewałem się, że poprosi o interaktywne wejście!Python 2,
838079 bajtówWypróbuj online (wersja 83-bajtowa, ponieważ działa online)
Zwróć uwagę, że niektóre wyniki mogą nie być całkowicie widoczne przy użyciu Talizmanu, ze względu na sposób działania płótna. Musisz pobrać i zainstalować Python, jeśli chcesz, aby działał lepiej.
Nie golfowany:
Ta wersja nie działa w Trinket, ponieważ Trinket nie obsługuje rozpakowywania wartości danych wejściowych.
źródło
map
w Pythonie 2:lambda A,D,S,R:map(goto,[A,A+D,A+D+64,A+D+R+64],[127,S,S,0])
SuspensionError: Cannot call a function that blocks or suspends here on line undefined in main.py
on Trinket. Czy potwierdziłeś, że to działa? Nie jestem pewien, czy błąd jest unikalny dla Talizmanu, czy nie.Mathematica,
6158 bajtów
jest operatoremTranspose
i jest renderowany jako indeks górnyT
przez Mathematica.Pobiera argumenty w kolejności
S, R, A, D
i zwraca obiekt grafiki wektorowej.Wyniki dla wszystkich siedmiu przypadków testowych:
Kliknij, aby zobaczyć większą wersję.
źródło
ListLinePlot
:) I jest też jedenListStepPlot
- bardzo przydatny!R
66 66bajtówWyświetla obraz z laboratorium osi
cumsum(c(0,A,D,64,R))
ic(0,127,S,S,0)
, a także liniami osi i etykietami numerycznymi.Dzięki @Zahiro Mor za golenie 3 bajtów !
Poprzednia odpowiedź:
źródło
cumsum(c(0,A,D,64,R))
aby zastąpić pierwszy termin w fabule. z sumą nie będziesz potrzebować sztuczki b i nadal golisz 3 bajty :)function(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Matlab, 50 bajtów
Daje to anonimową funkcję „ans”, którą należy wywołać jako ans (A, D, S, R).
źródło
JavaScript (ES6) + HTML, 126 + 23 = 149
Pobiera dane wejściowe pojedynczo w kolejności
A, S, D, R
.źródło
JavaScript (ES6),
114111 bajtówZwraca odpowiedni obraz SVG
innerHTML
. Dodaj 18 bajtów dla poprawnego XML.źródło
<input>
s?64,64,64,64
. Normalnie kodowałbym poprawne wyjście dla domyślnego wejścia, ale widzę, jak byłoby to tutaj trudne ...Haskell,
112110 bajtówPrzykład użycia:
(0#10) 50 80
.To korzysta z
Gloss
biblioteki. Tadisplay
funkcja oczekuje, że okno zostanie wydrukowane (tutaj: okno bez tytułu (""
), rozmiar 600 x 300, pozycja(0,0)
na pulpicie), kolor tła (red
) i obraz, który jest linią wzdłuż ścieżki utworzonej przez skompresowanie skumulowanej sumy[0,a,d,64,r]
=[0,a,a+d,a+d+64,a+d+64+r]
jako współrzędne x i[0,127,s,s,0]
jako współrzędne y.Edycja: Dzięki @xnor za 2 bajty!
źródło
scanl(+)0[a,d,64,r]
Przetwarzanie,
134108 + 14 (wywołanie dosize
) =148122 bajtówNajpierw potrzebujemy wywołania
size
gdzieś w programie, aby wyjście zmieściło się w oknie (domyślnie 100 x 100).A oto faktyczna funkcja:
Nazwij to jak
f(15,20,70,40);
Zrzut ekranu
Moja nowsza odpowiedź jest prostsza niż starsza, ale bardziej podoba mi się starsza (nawet jeśli jest większa).
Stara odpowiedź (148 bajtów)
i dwie funkcje
Nazwij to tak,
f(int_array_containing_values);
a wynik będzie wyglądał mniej więcej tak:f(new int[]{15,20,70,40});
źródło
SmileBASIC, 90 bajtów
źródło
PHP,
149130 bajtówpobiera dane z argumentów wiersza poleceń, zapisuje obraz (PNG z niebieskim kolorem na czarnym) na standardowe wyjście. Wymaga PHP 7.1 lub nowszego.
użycie np
+4 bajtów dla starszych PHP: Wymień
[,$a,$d,$s,$r]
sięlist(,$a,$d,$s,$r)
.Jest tam mały hack: zamiast
imageopenpolygon
ukrywać linię bazową, końcowa linia wielokąta jest rysowana poza płótnem. (y = 127 będzie wyświetlane tylko na obrazie o wysokości> = 128.)Mógłbym zaoszczędzić więcej dzięki kolorowi 99 lub 9 zamiast 999; ale trudno je zobaczyć na czarno. :)
źródło
Bash + łaska , 70 bajtów
Skrypt zapisuje do pliku
f
współrzędne każdego punktu, a xmgrace (wersja GUI) odczytuje plik i domyślnie wyświetla wykres za pomocą linii.Uruchom :
Wyjście: (ekran drukowania)
Myślę, że można to zrobić bezpośrednio za pomocą skryptu łaski, jeśli akceptuje on dane wejściowe, ale nie znam jego składni. Przyjrzę się temu.
Wyjaśnienie:
źródło
Idź,
947915506 bajtówJest to daleki od zoptymalizowanego, próbując nauczyć się języka, biorąc udział w tych pytaniach. Wskaż, co mogę zrobić.
Skondensowany:
Bez zastrzeżeń:
źródło
dc, 120 bajtów
Początkowo myślałem, że nie mogę odpowiedzieć w DC, ale widzę, że drukowanie składni obrazu wektorowego jest dozwolone.
Kod oblicza przetłumaczone współrzędne każdego punktu i generuje składnię SVG dla wykresu. Ponieważ edytor obrazów ma początek w lewym górnym rogu, musiałem odjąć
y
wartości odheight
127 w tym przypadku, aby obraz był wyświetlany tak, jakby początek znajdował się w lewym dolnym rogu.Uruchom przykład: lub Wypróbuj online!
Wynik:
Aby wyświetlić wykres obrazu, zapisz dokładne dane wyjściowe w pliku i otwórz je na przykład za pomocą Gimp, lub wprowadź tekst na stronie HTML tak jak powyżej.
Opis:
dc
Jest to odwrotnego polskiego d ESK C alculator język stosSkrypt jest długim połączeniem łańcucha składniowego SVG. Słowo kluczowe
M
oznacza ruch do współrzędnych iL
oznacza linię rysowania od bieżącej pozycji do podanej współrzędnej .źródło