W BASIC-u mamy do dyspozycji instrukcję SOUND. Posiada ona cztery parametry i jej działanie trwa tak długo, aż nie zostanie wykonana następna instrukcja SOUND (dla tego samego generatora), END, RUN, lub NEW. Postać tej instrukcji jest następująca:
SOUND c, p, d, v
gdzie:
- c — numer generatora (od 0 do 3)
- p — okres generowanego dźwięku (od 0 do 255)
- d — określa brzmienie (liczby parzyste od 0 do 14)
- v — jest głośnością (od 0 do 15) Atari ma cztery niezależne generatory dźwięku. Można jednocześnie uruchomić wszystkie generatory, lub tylko kilka z nich.
Okres generowanego dźwięku określa jego wysokość. Jak wiemy okres ten jest odwrotnie proporcjonalny od częstotliwości. Warto znać dokładną zależność pomiędzy tymi dwoma wartościami. Jest ona następująca:
częstotliwość=31960/(okres+1) [Hz]
Okazuje się jednak, że możliwości dźwiękowe Atari są znacznie większe, niż dawane przez instrukcję SOUND w języku BASIC. Aby je wykorzystać, musimy poznać bliżej sposób generowania dźwięku w Atari.
Generowaniem dźwięku zajmuje się specjalizowany układ scalony nazwany POKEY. Posiada on własne rejestry zawierające informacje o wytwarzanych dźwiękach. Wyróżnić możemy trzy obszary sterowania dźwiękiem. Nazwijmy je tak, jak stosuje to w swoich publikacjach sama firma Atari: AUDF, AUDC i AUDCTL
AUDF 1 do 4. Zlokalizowane są w komórkach o adresach 53760, 53762, 53764, 53766. Określają one wysokość generowanego tonu. Na przykład instrukcja POKE 53762,64 odpowiada instrukcji SOUND 1,64,x,x (wartość x jest tutaj nieistotna).
AUDC 1 do 4. Zlokalizowane w komórkach o adresach 53761, 53763, 53765, 53767. Ich znaczenie jest bardziej skomplikowane niż AUDF. Przyjrzyjmy się im dokładniej. Cztery najmniej znaczące bity każdej z tych komórek sterują głośnością odpowiedniego generatora. Cztery bity czyli w systemie dziesiętnym liczby z zakresu od 0 do 15, jest to tyle, ile stopni głośności można zapisać w instrukcji SOUND. Piąty bit jest to tzw. bit dwustanowej regulacji głośności. Pozostałe trzy bity określają zakłócenia. Jest to szerokie pole do eksperymentowania. Na trzech bitach można zakodować liczby dziesiętne od 0 do 7. Jak pamiętamy w instrukcji SOUND, parametrem określającym zniekształcenia może być liczba parzysta z zakresu od 0 do 14. Takich liczb jest właśnie osiem. Jeżeli wszystkie bity posiadają wartość jedynki logicznej, to otrzymujemy czysty dźwięk. Odpowiada to umieszczeniu w instrukcji SOUND parametru sterującego brzmieniem równego 14.
Zilustrujmy to przykładem: Instrukcji SOUND 1,64,10,10 odpowiada POKE 53762,64: POKE 64363,234. AUDCTL jest to komórka o adresie 53768. Zawartość tej komórki zmieniać możemy tylko instrukcją POKE. Wykonanie instrukcji SOUND nie powoduje zmiany zawartości tej komórki. Wykorzystując odpowiednio tę komórkę, możemy uzyskiwać efekty niemożliwe do osiągnięcia tylko przez instrukcję SOUND. Znaczenie poszczególnych bitów AUDCTL jest następujące:
- BIT 0 przełącza główny zegar bazowy z 64 kHz na 15 kHz
- BIT 1 włącza filtr górnoprzepustowy dla kanału 2 sterowany kanałem 1
- BIT 2 włącza filtr górnoprzepustowy dla kanału 1 sterowany kanałem 3
- BIT 3 powoduje połączenie kanałów 3 i 4 pozwalając używać 16-bitowej zmiennej sterującej
- BIT 4 powoduje połączenie kanałów 1 i 2 pozwalając używać 16-bitowej zmiennej sterującej
- BIT 5 powoduje przełączenie zegarów kanału 3 na 1.79 MHz
- BIT 6 powoduje przełączenie zegarów kanału 1 na 1.79 MHz
- BIT 7 przełącza licznik „poly” z 17 na 9 bitów
Znaczenie tych bitów wymaga dokładniejszego wyjaśnienia.
BIT 0. Nie zagłębiając się teraz w szczegóły można powiedzieć, że im wyższa jest częstotliwość zegara, tym wyższe dźwięki można uzyskać. Zegar bazowy ma normalnie częstotliwość 64 kHz. Przełączając go na częstotliwość 15 kHz można generować dźwięk o niższej częstotliwości.
BIT 1 i 2. Filtry generatora dźwięku Atari nie są filtrami analogowymi. Ich działanie polega na zmianie stopnia wypełnienia impulsów, dzięki czemu generowanych jest więcej harmonicznych o wysokich częstotliwościach. W uproszczony sposób można powiedzieć, że taki filtr nie przepuszcza częstotliwości mniejszych, niż częstotliwość kanału sterującego.
BIT 3 i 4. Konieczność łączenia dwóch generatorów występuje gdy chcemy uzyskać szerszy przedział generowanych dźwięków, lub gdy konieczne jest uzyskanie płynnej zmiany częstotliwości w zakresie częstotliwości wysokich. Łącząc dwa kanały razem uzyskujemy 16-bitową zmienną sterującą dzięki czemu zmniejszamy najmniejszy skok częstotliwości z 1/256 (jeden bajt) do 1/65536 (dwa bajty), ilustruje to poniższy przykład:
10 SOUND 0,0,0,0
20 FOR X=55 TO 0 STEP -1
30 SOUND 0,X,10,10
40 FOR F=1 T0 55:NEXT F
50 NEXT X
60 SOUND 0,0,0,0
Uruchamiając ten program, usłyszymy wyraźnie, że przy wysokich dźwiękach częstotliwość wzrasta skokowo. Teraz napiszmy program wykorzystujący AUDCTL dla połączenia dwóch kanałów razem i uzyskania płynnej zmiany.
10 SOUND 0,0,0,0
15 POKE 53768,80
20 POKE 53761,160
25 POKE 53763,234
30 FOR X=0 TO 255
35 POKE 53762,X
40 FOR Z=0 TO 255
45 POKE 53760,Z
50 NEXT Z
55 NEXT X
60 SOUND 0,0,0,0
W powyższym programie wykorzystaliśmy większość zdobytych dotąd wiadomości. Poszczególne jego linie realizują następujące zadania:
Linia 10 inicjuje POKEY.
Linia 15 ustawia w AUDCTL bit 2, 4 i 6.
Linia 20 nadaje wartość AUDC 1 i wyłącza pierwszy generator dźwiękowy.
Linia 25 ustawia AUDC 2, włącza generator drugi, włącza czyste tony oraz ustawia głośność 10.
Linie 30 do 55 dwie pętle FOR...NEXT służą do nadawania wartości zmiennym AUDF 1 i AUDF 2. Wartością zmiennej sterującej regulujemy wartość częstotliwości zgrubnie, natomiast pierwszym generatorem dokładnie.
Powróćmy teraz do opisu pozostałych bitów AUDCTL.
BITY 5 i 6. Działanie ich jest zbliżone do działania bitu O z tą różnicą, że zwiększają one częstotliwość generowanego tonu. Bit 5 zwiększa częstotliwość zegara do 1.79 MHz w kanale 3, natomiast bit 6 w kanale 1. Wykonanie poniższych instrukcji zobrazuje działanie tycn bitów.
SOUND 0,255,10,10 POKE 53758,64
BIT 7. Ustawia pojemność licznika używanego przez generator szumów. Im większa pojemność tego licznika, tym częściej powtarzane są zakłócenia generowanego dźwięku. Spróbujmy wykonać następujące instrukcje:
SOUND 0,90,8,10 POKE 53769,128
Mariusz J. Giergiel