Rozdział 9
DŹWIĘK
Wszystkie komputery domowe są wyposażone w lepsze lub
gorsze układy służące do tworzenia dźwięku. Komputery Atari
XL/XE nie są tu wyjątkiem i posiadają cztery niezależne
generatory dźwięku. Stanowią one integralną część
specjalizowanego układu scalonego POKEY (POtentiometr and
KEYboard chip). Do sterowania tymi generatorami POKEY posiada
dziewięć rejestrów (tylko do zapisu). Oprócz tego generatory
służą jako sprzętowe liczniki i mogą wywoływać przerwania IRQ.
9.1. Generowanie dźwięku
Ponieważ POKEY jest wykorzystywany przede wszystkim do
obsługi klawiatury i złącza szeregowego, to podczas każdej
operacji wejścia/wyjścia zmieniane są stany rejestrów
sterujących generatorami. Aby uzyskać prawidłowe efekty
dźwiękowe należy go więc ponownie zainicjować po takiej
operacji. Wykonuje się to przez wpisanie wartości zero do
rejestru AUDCTL ($D208) i wartości 3 do rejestru SKCTL ($D20F).
Każdy z czterech generatorów dźwięku posiada dwa odrębne
rejestry. Jeden z nich (AUDF1-4 - AUDio Frequency 1-4) służy do
ustalenia częstotliwości dźwięku, a drugi (AUDC1-4 - AUDio
Control 1-4) steruje głośnością i zniekształceniami. Ponadto
wszystkie generatory są sterowane poprzez wspólny rejestr
AUDCTL (AUDio ConTroL).
Rejestr częstotliwości AUDF jest wykorzystywany jako
dzielnik impulsów. POKEY zlicza impulsy sygnału wejściowego
doprowadzonego do generatora i przesyła impuls do wyjścia, gdy
stan licznika jest zgodny z zawartością rejestru AUDF
zwiększoną o jeden. Przy wartości zero w AUDF przepuszczany
jest każdy impuls wejściowy, a przy wartości, np. 3 - co
czwarty. Dzielnik ma więc zakres od 1 do 256. Ponieważ sygnał
wyjściowy składa się z pojedynczych impulsów, to na końcu jest
jeszcze dzielony przez dwa przy pomocy przerzutnika. Otrzymuje
się wtedy sygnał o wypełnieniu 1:1 (stosunek czasu trwania
impulsu do czasu trwania przerwy między impulsami). Ta ostatnia
operacja jest konieczna dla uzyskania właściwej barwy dźwięku.
Nieco bardziej skomplikowane jest działanie rejestrów
sterujących generatorami - AUDC. Poszczególne bity tych
rejestrów mają różne funkcje. Bity 0-3 określają natężenie
dźwięku. Ponieważ w czterech bitach można zapisać wartości od 0
do 15, to taka właśnie jest skala uzyskiwanej siły głosu. Bit 4
wyłącza dzielnik częstotliwości. Powoduje to pojawienie się na
wyjściu stałego napięcia o wartości określonej przez bity 0-3.
Efektem akustycznym jest stuk w głośniku. Szerszy opis
wykorzystania tego bitu znajduje się w dalszej części.
Pozostałe bity AUDC kontrolują zniekształcenia dźwięku.
Teraz trzeba przyjrzeć się nieco bliżej konstrukcji układu
POKEY. Zawiera on trzy rejestry przesuwające pracujące z
częstotliwością zegara systemu (1,79 MHz w systemie NTSC i
2,217 MHz w systemie PAL). Mają one długość 4, 5 i 17 bitów,
przy czym rejestr 17-bitowy można przełączyć na 9-bitowy.
Impulsy z generatora, po przejściu przez dzielnik
częstotliwości, lecz przed podziałem przez dwa, są doprowadzane
na wejście wybranego rejestru. Pojawiają się na wyjściu z
rejestru w tej samej kolejności (rejestr przesuwający działa
jak kolejka w sklepie). Nie byłoby w tym nic nadzwyczajnego,
gdyby nie dodatkowa operacja. Bity pobierane są nie tylko z
wyjścia, lecz także ze środka rejestru przesuwającego. Bity te
poddawane są operacji logicznej NOR i ponownie przesyłane do
wejścia rejestru. Powoduje to uzyskanie zakłóceń
pseudolosowych, których powtarzalność zależy od długości
rejestru.
Po tym wyjaśnieniu łatwo będzie zrozumieć działanie trzech
najstarszych bitów (5-7) rejestru AUDC. Służą one do wyboru
rejestru przesuwającego, który będzie użyty do zniekształcenia
dźwięku. Kolejne kombinacje tych bitów mają następujące
znaczenie:
bity 000 - rejestr 5-bitowy i 17-bitowy
bity 001 - rejestr 5-bitowy
bity 010 - rejestr 5-bitowy i 4-bitowy
bity 011 - rejestr 5-bitowy
bity 100 - rejestr 17-bitowy
bity 101 - bez rejestru przesuwającego
bity 110 - rejestr 4-bitowy
bity 111 - bez rejestru przesuwającego
Pomimo użycia trzech bitów kombinacji jest tylko sześć,
gdyż pary 001 i 011 oraz 101 i 111 są identyczne. Poniższa
tabela (zaczerpnięta z "De Re Atari") przedstawia rodzaje
dźwięku uzyskiwane przy różnych częstotliwościach i różnych
wartościach bitów 5-7 w AUDC.
kombinacja częstotliwości
bitów 5-7 niskie średnie wysokie
000 licznik Geigera pęd powietrza strumień
0x1 karabin maszyn. silnik elektr. transformator
010 ognisko samochód wizg silnika
100 walący się dom zakłócenia radiowe wodospad
1x1 c z y s t e d ź w i ę k i
110 samolot kosiarka golarka
Pozostało jeszcze do opisania znaczenie bitu 4. Ponieważ
steruje on wyłącznie siłą głosu, to można przede wszystkim
generować przy jego pomocy rytm. Częstotliwość tego rytmu jest
dowolna - od ułamków Hertza aż do kilkuset kHz. Jednak
zastosowanie tego bitu jest znacznie szersze. Po jego
ustawieniu głośnik otrzymuje stałe napięcie określone przez
bity 0-3. Można więc generować dowolny dźwięk przez zmianę
tylko i wyłącznie głośności. Wymaga to oczywiście precyzyjnego
odliczania czasu, lecz nie jest to żaden problem.
Na przykład instrumenty dęte blaszane emitują falę
dźwiękową o przebiegu trójkątnym. Normalnie dźwięk wytwarzany
przez komputer ma przebieg prostokątny, różnica barwy jest więc
bardzo wyraźna. Wygenerowanie przebiegu trójkątnego wymaga
jedynie ustawienia bitu 4 i cyklicznego wpisywania do bitów 0-3
wartości rosnących liniowo od 0 do 15, a następnie malejących
od 15 do 0 (razem 16-31 i 31-16). Jest to bardzo proste, lecz
Atari Basic jest zbyt wolny i trzeba to wykonać w języku
maszynowym (oczywiście procedurę maszynową można także dołączyć
do programu w Basicu).
Ostatni rejestr dźwięku POKEY-a - AUDCTL - steruje
jednocześnie wszystkimi generatorami. Jego użycie znacznie
zwiększa możliwości dźwiękowe Atari. Poszczególne bity tego
rejestru mają następujące znaczenie:
Bit 0 służy do wyboru zegara bazowego, czyli źródła
impulsów dla wszystkich generatorów. Normalnie zegar bazowy ma
częstotliwość 64 kHz, a po ustawieniu bitu 0 jest przełączany
na 15 kHz. Jeśli pozostałe parametry pozostaną niezmienione, to
spowoduje to czterokrotne zmniejszenie częstotliwości
wszystkich dźwięków.
Ustawienie bitu 1 włącza filtr górnoprzepustowy w
generatorze 2. Filtr ten jest sterowany generatorem 4 i
powoduje, że generator 2 emituje tylko dźwięki o
częstotliwościach wyższych od częstotliwości generatora 4.
Bit 2 włącza analogiczny filtr górnoprzepustowy dla
generatora 1 sterowany generatorem 3.
Bit 3, gdy jest ustawiony, łączy dzielniki generatorów 3 i
4 w jeden dzielnik 16-bitowy, który umożliwia bardziej
precyzyjną regulację częstotliwości. Poszerza to również zakres
uzyskiwanych częstotliwości ze 125 Hz - 32 kHz do 0,5 Hz - 32
kHz, a po zmianie zegara bazowego przy pomocy bitu 5 na 16 Hz -
1 MHz.
Bit 4 łączy dzielniki 1 i 2 w jeden dzielnik 16-bitowy
analogicznie jak bit 3.
Bit 5 przełącza (gdy jest ustawiony) zegar bazowy dla
generatora 3 na częstotliwość 2,217 MHz (wszystkie źródła
podają tu częstotliwość 1,79 MHZ - jest to częstotliwość
kwarcowego zegara systemu, ale w NTSC! - komputery w wersji PAL
mają zegar 2,217 MHz). Przełączenie to powoduje zwiększenie
częstotliwości ponad 30 razy. Tak wysokie dźwięki nie nadają
się do słuchania - wykorzystuje się tą możliwość prawie zawsze
jednocześnie z ustawieniem bitu 3.
Bit 6 przełącza zegar bazowy dla generatora 1 na
częstotliwość 2,217 MHz, podobnie jak bit 5 (wszystkie podane
tam uwagi odnoszą się także do tego bitu).
Bit 7 przełącza 17-bitowy rejestr przesuwający na rejestr
9-bitowy. Pozwala to na uzyskanie dwóch dodatkowych sposobów
zniekształcenia dźwięku (dla bitów 5-7 w AUDC równych 000 lub
100).
Ubocznym efektem działania generatorów dźwięku jest liczba
pseudolosowa znajdująca się w rejestrze RANDOM ($D20A).
Umieszczane jest tam osiem najstarszych bitów z 17-bitowego
rejestru przesuwającego. Przez odczyt tego rejestru można
otrzymać przypadkową wartość z zakresu od 0 do 255. Możliwość
ta jest często wykorzystywana, szczególnie przez programy
napisane w języku maszynowym.
9.2. Liczniki POKEY-a
Wspomniane wcześniej liczniki POKEY-a są jedną z
najrzadziej wykorzystywanych możliwości Atari, warto więc
opisać bliżej ich działanie, choć odbiega to od głównego tematu
rozdziału. Opis ten dotyczy liczników 1, 2 i 4 - licznik 3 nie
jest używany w systemie operacyjnym (w taki sposób).
Po ustawieniu i uruchomieniu liczniki zliczają wstecz, to
znaczy od wartości ustawionej do zera. W chwili wyzerowania
licznika POKEY generuje sygnał żądania przerwania maskowalnego
IRQ. Każdemu z liczników odpowiada jeden bit (0, 1 i 2) w
rejestrze zezwoleń przerwań IRQEN oraz w rejestrze sygnalizacji
przerwań IRQST. Po rozpoznaniu źródła przerwania CPU wywołuje
procedurę przerwania, której wektor jest umieszczony
odpowiednio w rejestrze VTIMR1 ($0210), VTIMR2 ($0212) lub
VTIMR4 ($0214). A oto kolejność postępowania, konieczna dla
wykorzystania tych przerwań.
Najpierw trzeba ustawić w rejestrze AUDCTL wymaganą
częstotliwość zegara bazowego. Następnie w rejestrze AUDC
odpowiadającym wykorzystywanemu licznikowi należy umieścić
zero. Początkowy stan licznika wpisuje się do rejestru AUDF.
Oczywiście w pamięci musi znajdować się procedura obsługi
przerwania, a odpowiedni wektor VTIMR (Vector TIMeR) musi
zawierać jej adres. Także właściwe bity w IRQEN i IRQENS muszą
zezwalać na przerwanie.
Teraz wpisanie dowolnej wartości do rejestru STIMER (Start
TIMERs - $D209) powoduje umieszczenie zawartości rejestrów AUDF
w licznikach i ich uruchomienie. Ponieważ liczniki POKEY-a
zliczają z częstotliwością znacznie większą niż pozostałe
zegary systemu, to w ten sposób można uzyskać odliczanie czasu
krótszego od 1/50 sekundy. Dla czasów dłuższych wykorzystywane
są przerwania synchronizacji pionowej VBLK oraz liczników
TIMCNT1-5.
|