Programując w assemblerze - zwłaszcza dema - czasem/często (zależnie od tego, co robimy
) potrzebna jest nam tablica "sinusów" (albo innych okresowych funkcji). Przydaje się do różnego rodzaju scrollerów, kulek kręcących się w kółko, podskoków itp. Dotychczas zwykle jak było mi potrzebne coś takiego dłubałem pętlę w BASICu Spectrum i dopasowywałem to co widzę do tego, co jest mi potrzebne. Działało to tak sobie - wolno, niewygodnie a do tego przy braku "wyobraźni matematycznej" dojście do właściwych kształtów zajmowało dużo czasu. Patrzyłem przez chwilę na różne dostępne w sieci narzędzia, ale żadne nie spełniało do końca moich wymagań (głównie chodziło o "przeglądarkowość" i "wizualność") więc w chwilach wolnego czasu przysiadłem i napisałem coś, co być może przyda się nie tylko mnie:
singen.
Pierwsze podstawowe zastrzeżenie - program pisałem dla siebie w związku z tym nie daję żadnej gwarancji że na innej niż Chrome przeglądarce na innym niż moje komputerze będzie działał/wyglądał poprawnie
Program pozwala "zwizualizować" dwie funkcje oraz ich złożenie. Każda z funkcji używa swojej zmiennej (nie da się zrobić funkcji dwóch zmiennych) i jest wyświetlana w panelu 320x200 lub 200x320 pikseli w który wpisywany jest jeden pełny okres sinusa (2*pi) oraz amplituda od -1 do 1. Jeśli wpisana funkcja wychodzi poza te wartości zostanie po prostu przycięta. Jeśli wpisana funkcja nie daje się "wyliczyć" zostanie podświetlona na czerwono. W funkcjach można używać standardowych funkcji matematycznych z Math Javascriptu (
Math object).
Trzeci panel wizualizuje złożenie obu funkcji - domyślnie w postaci krzywej Lissajous, po kliknięciu w formie "pseud-plazmy" (suma wartości funkcji dla danych współrzędnych zamieniona na poziom szarości). W polu "Animation" możemy kliknąć na "[off]" (co przełączy link na "[on]") i włączyć animację wizualizacji parametry "Start" pozwalają przesunąć początek okresu funkcji, "Diff" określają przeskok przy kolejnej klatce czyli prędkość animacji dla danej funkcji. Przycisk "[reset]" przywraca te wartości do stanu początkowego.
Cała wizualizacja nie jest jednak specjalnie przydatna jeśli nie da się jej wyniku użyć we własnym programie. Do tego służy panel "Output parameters" - ustalamy tam w jakiej formie chcemy dostać wygenerowane dane. Najpierw wybieramy którą funkcję chcemy wyeksportować, jej długość i amplitudę. Długość określa liczbę pozycji w wygenerowanej tablicy, amplituda maksymalną wartość jaką mogą - zwykle - osiągać wygenerowane dane. Zwykle, bo kolejny parametr może to trochę zmienić - "Mode" określa jak mają być generowane dane.
W trybie "Clip" to co widzimy w panelu funkcji zostanie "przeskalowane" tak, że wartość -1 będzie odpowiadała wartości 0, a wartość 1 podanej amplitudzie. Jeśli funkcja wykracza poza zakres od -1 do 1 wartości zostaną przycięte. W trybie "Normalize" funkcja zostanie przeliczona i ustalone minimum i maksimum wartości a następnie zostanie ona przeskalowana tak, że nimimum będzie odpowiadało wartości 0 a maksimum podanej amplitudzie. Tryb "As is" może zmienić maksymalną wygenerowaną wartość - ustala on również minimum i maksimum dla funkcji a następnie przesuwa ją "w górę" tak, że minimum odpowiada wartości 0 jednak nie skaluje do amplitudy wartości maksymalnej tylko zakres od -1 do 1 a jeśli znajdzie wartości poza ten zakres wykraczające to zwiększy amplitudę.
Parametr "Format" pozwala wybrać czy chcemy mieć dane szesnastkowe czy dziesiętne. Jeśli wybierzemy szesnastkowe w następnym parametrze możemy zdecydować jak mają być prezentowane (zależnie od używanego assemblera) a w kolejnym możemy wybrać czy chcemy dane ośmio czy szesnasto bitowe - jeśli amplituda jest większa niż 255 to musimy wybrać 16 bitów, jeśli w trybie "As is" wyliczona zostanie amplituda powyżej 255 to tryb zmieni się automatycznie. Ostatni parametr to nazwa pliku wynikowego. Po kliknięciu "Generate" sformatowane dane wynikowe pojawią się w panelu po prawej a dodatkowo pojawi się przycisk "Download", który pozwoli nam zapisać wygenerowany plik na dysk.
Program jest przeglądarkowy, ale działa bezpośrednio w przeglądarce - archiwum można ściągnąć tu:
singen.zip. Po rozpakowaniu otwieramy w przeglądarce index.html z katalogu singen i powinna nam się uruchomić wersja off-line (nie całkiem - doładowuje z sieci jakieś fonty itp.). I tak... archiwum ma prawie 8 mega - program był pisany w
Darcie, który kompiluje wynik do Javascriptu dodając do niego swój runtime