ZVUK NA ATARI XL/XE

ÚVOD

Snad každý, kdo píše programy alespoň o trochu zábavnější než je třeba účetnictví, se už setkal s problematikou programování zvuku. Někdy je řešení jednoduché, jindy není. Starosti s přehráváním doprovodné hudby ochotně převezme některý z mnoha hudebních editorů, různá cinknutí a výbuchy snadno strefíme i odhadem. Tady problémy nebývají.

Horší to bývá s různými melodickými sekvencemi, které mají reagovat třeba na situaci ve hře, a nedají se proto předem nadefinovat v hudebním editoru. Tady nám nezbývá nic jiného, než do programu vložit tabulku kmitočtů hudebních tónů a pracovat přímo se zvukovými registry obvodu POKEY. Tabulku pro čisté tóny najdeme v každé příručce (pozor, bývá určena pro počítače americké verze NTSC - u nás je posunutá asi o 16 centů dolů), jakmile se ale rozhodneme použít i jiná zabarvení zvuku, narazíme na něco jako informační embargo.

Dosud jsem neviděl ani jeden důvěryhodný a hlavně kompletní popis zvukového výstupu počítačů Atari. V literatuře se obvykle setkáváme jen s mlhavými zmínkami o polynomických čítačích, filtrech apod., závislost výsledného zvuku na nastavení registrů je pak popsána formulacemi typu "zvuk podobný výkonovému transformátoru", nebo třeba "vodopád". To je pro exaktní výpočet kmitočtu (potřebný k sestavení tabulky hudebních tónů) žalostně málo. Mnohdy dostupné texty budí dojem, že autor čerpal z nějakého opravdu solidního cizojazyčného materiálu, který ovšem nepochopil úplně a navíc i zkrátil, takže z původní informace mnoho nezbylo. Neutěšený stav dostupné literatury snad nejlépe dokumentuje příklad: Z různých pramenů lze posbírat nejméně pět různých hodnot základního hodinového kmitočtu. Babo raď...

Dalším problémem mohou být hudebníky používané jednotky jako např. půltón či cent, jejichž převod na technické veličiny (kmitočet) bývá pro nezasvěcené mnohdy neřešitelným rébusem.

Před časem jsem se rozhodl, že si ve výše uvedené problematice udělám jednou provždy jasno. Posbíral jsem maximum informací z dostupné literatury, na několik dnů se pohroužil do experimentů pod ATMASem - a výsledek se dostavil: Už mám jasno!

Rád bych se nyní o výsledky svého bádání podělil i se čtenáři FLOPu. Soudě podle hudebních skladeb v dostupného softwaru, mnozí už asi tuto problematiku zvládli. Neutěšený stav literatury však napovídá, že většina Ataristů dosud tápe. Právě pro ně je určen následující pokud možno podrobný popis.

"HUDEBNÍ" JEDNOTKY

Jak známo, hudebníci rozdělují slyšitelný rozsah kmitočtů na oktávy (subkontra, kontra, velká, malá a jedno- až čtyřčárkovaná), z nichž každá se skládá z 12 půltónů pojmenovaných C(=H#), C#=Db, D, D#=Eb, E(=Fb), F(=E#), F#=Gb, G, G#=Ab, A, A#=Hb, H(=Cb).

Při ladění hudebních nástrojů, kdy potřebují pojmenovat daleko menší rozdíly kmitočtů než je půltón, používají hudebníci jednotku nazvanou cent. Jeden cent je definován jako jedna setina půltónu; odtud snadno odvodíme že půltón = 100 centů a oktáva = 1200 centů.

Základem ladění je jednočárkované A (tzv. komorní A), které má kmitočet 440Hz. Oktáva, půltón a cent jsou jednotky logaritmické, což znamená že je nepřičítáme a neodečítáme, nýbrž jimi násobíme a dělíme. Rozdíl jedné oktávy znamená dvojnásobný kmitočet. Z toho už snadno odvodíme:

       1 oktáva = *2
       1 půltón = *2^(1/12)
       1 cent   = *2^(1/1200)

Podle výše uvedených vztahů lze snadno vypočítat konkrétní kmitočty všech tónů, tuto práci však přenecháme raději počítači (bude to rychlejší).

ZVUKOVÝ VÝSTUP ATARI XL/XE

Když známe kmitočty, které od počítače požadujeme, zbývá stanovit odpovídající nastavení zvukových registrů. K tomu potřebujeme znát závislost výstupního signálu na nastavení registrů, nebo ještě lépe přímo strukturu zvukových generátorů.

Blokové schéma, které popisuje zvukové generátory (a jejich vazby na systém sériového přenosu, přerušení IRQ aj.), je na obrázku - viz. soubor ZVUK.PIC (DESIGN MASTER). Tady by vlastně mohl článek končit - ze zmíněného obrázku lze odvodit vše další :-)

ČASOVÁ ZÁKLADNA A ČÍTAČE

Obvod POKEY je taktován stejným hodinovým kmitočtem, jako mikroprocesor. V systému PAL se jedná o kmitočet 1773447 Hz, pro americkou verzi NTSC je to 1789772.5 Hz.

Všechny zvukové kanály je možno taktovat kmitočtem cca. 64kHz (hodinový kmitočet dělený 28), cca. 15kHz (hodinový kmitočet dělený 114), kanály 0 a 2 pak také přímo základním hodinovým kmitočtem.

Každý ze čtyř zvukových generátorů obsahuje osmibitový čítač, který po nastavení na hodnotu uloženou v registru AUDFn počítá dolů a po přetečení (přechodu z 0 na 255) generuje na výstupu impuls. Tento impuls je dále zpožděn o 3 hodinové cykly. V základním režimu (osmibitové čítače) způsobí tento impuls opětovné nastavení čítače na hodnotu AUDFn. Při taktování kmitočtem 64kHz nebo 15kHz tedy čítač dělí vstupní kmitočet v poměru AUDFn+1 (čítač počítá "včetně nuly", zpoždění o 3 cykly je zde nepodstatné), při taktování 1.79MHz pak v poměru AUDFn+4.

Dvojice kanálů 0+1 nebo 2+3 lze propojit na jeden šestnáctibitový čítač. Druhý z obou kanálů je pak taktován výstupem prvního; výstup druhého slouží jako výstup celého čítače a nastavuje oba kanály na výchozí hodnotu. (Impulsy na výstupu prvního kanálu jsou nepravidelné, první z nich přichází po době určené jeho registrem AUDFn, další pak vždy po 256 cyklech až do doběhnutí celé periody.) Nižší polovinu šestnáctibitového dělicího poměru zapisujeme do registru AUDFn prvního čítače, vyšší polovinu pak do druhého. Při taktování kmitočtem 1.79MHz se projeví třícyklové zpoždění výstupu obou čítačů, takže dělicí poměr bude AUDFn+7.

Všechny čítače lze kdykoliv inicializovat na výchozí hodnotu zápisem libovolné hodnoty do registru STIMER.

ÚPRAVA SIGNÁLU PRO ZVUK

Pro vytváření zkreslených (šumových) signálů jsou k dispozici tři polynomické čítače - 4-bitový, 5-bitový a 17-bitový, z nichž posledně jmenovaný lze přepnout na 9-bitový. Tyto čítače se skládají z posuvného registru příslušné délky - taktovaného základním hodinovým kmitočtem - a hradla EX-OR, které dodává na vstup posuvného registru kombinaci dvou jeho stupňů. Tyto čítače dávají nepravidelný signál, jehož opakovací perioda je (2^n)-1 cyklů, kde "n" je počet bitů poly-čítače. (Například 4-bitový poly-čítač generuje opakující se sekvenci 100010011010111; přesnou funkci všech poly-čítačů lze odvodit z obrázku.)

Každý zvukový kanál obsahuje svůj obvod zkreslení, který různými způsoby (v závislosti na horních třech bitech registru AUDCn) vzorkuje výstupy poly-čítačů v rytmu daném příslušným čítačem; pro čisté tóny tento obvod funguje jen jako dělička dvěma. Kanály 0 a 1 mají dále zařazeny filtry taktované kanály 2 resp. 3. Přesnou funkci těchto obvodů nejlépe vysvětlí schéma (viz. obrázek), slovní popis by byl asi nepřehledný.

Výstup z výše popsaných obvodů v každém kanálu spíná 4-bitový D/A převodník, což umožňuje ovládání hlasitosti v 16 stupních. Možné je i trvalé sepnutí, nezbytné pro využití převodníku k přehrávání samplů.

DALŠÍ FUNKCE A VZTAHY

Obvody zvukového výstupu jsou na několika místech provázány s dalšími funkčními celky obvodu POKEY - Sériový přenos, přerušení IRQ, a A/D převodníky pro potenciometry (PADDLE). To je dobré znát, neboť z toho pramení další možnosti, ale i některá omezení.

Výstupy čítačů 0, 1, nebo 3 mohou být zdrojem přerušení IRQ (pokud je povoleno). V tomto režimu slouží čítače jako časovače, což ovšem nijak neomezuje jejich zvukové možnosti. K přesnému startu čítačů se používá registr STIMER.

Obvody sériového přenosu dat mohou být taktovány výstupem čítače 1 nebo 3. Pokud je nastaven režim asynchronního příjmu (který lze taktovat pouze čítačem 3), budou čítače 2 a 3 blokovány na své výchozí hodnotě až do příchodu START-bitu. Tím se provádí synchronizace čtecích obvodů s přicházejícím signálem - impulsy se na výstupu čítače 3 objevují pouze v okamžiku snímání datových bitů ze sériové linky.

Z toho pramení omezení pro vytváření zvuku: Pokud je registrem SKCTL nastaven režim asynchronního sériového příjmu, zvukové kanály 2 a 3 buď nefungují (klid na vstupní datové lince), nebo dávají nepravidelné impulsy synchronizované s přicházejícím sériovým signálem. Kanál 2 je bohužel blokován i při taktování sériové komunikace pouze osmibitovým děličem 3 - zde se zjevně počítalo pouze s použitím přesnějšího šestnáctibitového čítače.

Při použití dvojtónového režimu vysílání se na sériovém výstupu objevují kmitočty zvukových kanálů 0 a 1. Na tento výstup nemají registry AUDCn žádný vliv, jedná se vždy o čistý tón (výstup čítače dělený dvěma).

Čítače A/D převodníků pro potenciometry (PADDLE) mohou být taktovány buď kmitočtem 15kHz, nebo 1.79MHz. Tyto kmitočty pocházejí z téhož zdroje, jako taktování zvukových čítačů, a jsou s nimi tedy synchronní.

Registr RANDOM, určený k získávání náhodných čísel, snímá prvních osm bitů 17-bitového (resp. 9-bitového) poly-čítače. Hodnota zde roluje v rytmu hodinových cyklů od vyšších bitů k nižším. Perioda opakování je ovlivněna přepínáním mezi 17-bitovým a 9-bitovým poly-čítačem.

Obvod POKEY nemá hardwarovou inicializaci (RESET), výchozí nastavení se provádí zápisem nul do spodních dvou bitů registru SKCTL. Tento stav nijak nemění nastavení zvukových registrů, blokuje však přísun hodinových impulsů pro zvukové čítače (a tím i pro čítače PADDLE), takže se výstupy čítačů zpožďují. To však neplatí pro přímé taktování kmitočtem 1.79MHz - v tomto případě čítače blokovány nejsou.

Další funkcí inicializačního stavu je nastavení počátečního obsahu poly-čítačů. Inicializační stav vnutí na vstupy jejich posuvných registrů jedničky, které pak v rytmu hodinových cyklů postupně zaplní všechny jejich bity. Tím je v inicializačním stavu paralyzována i funkce registru RANDOM, který se po zrušení inicializace rozběhne vždy od stejného místa svého funkčního cyklu.

ÚVOD K VÝPOČTŮM

Pro hudební využití přicházejí mimo čistých tónů v úvahu režimy (AUDCn) $Cx (4-bitový poly-čítač), $6x nebo $2x (5-bitový poly-čítač) a $8x (po přepnutí 9-bitový poly-čítač). 4-bitový a 9-bitový poly-čítač poskytují "promíchaně" tři různé barvy zvuku, 5-bitový jen jednu.

Další možnosti nabízí použití filtrů. Obvykle používáme čisté tóny, přičemž zapisujeme do "taktovacího" kanálu hodnotu "základního" kanálu zvýšenou o 1. Dvě různé barvy zvuku získáme aktivací pouze filtrovaného kanálu (druhý má nulovou hlasitost), nebo obou. Jinou možností je filtr vůbec nepoužít, a zajímavé zabarvení zvuku získat prostým souzvukem obou blízkých kmitočtů. Všechny tři možnosti jsou vzhledem ke vznikající interferenci použitelné pouze pro nejnižší tóny (malý rozdíl sousedních kmitočtů).

Tím nejsou zvukové možnosti ani zdaleka vyčerpány, použití dalších režimů (ostatní kombinace poly-čítačů, jejich kombinace s filtry) však dává natolik nepravidelné zvuky, že o hudebním využití nemůže být vůbec řeč.

V dalším textu se budeme zabývat výpočtem výsledného kmitočtu z hodnoty registru AUDFn v různých režimech. V případě použití poly-čítačů je prakticky jedinou možností, jak získat optimální hodnotu, postupné přibližování - o klasickém zaokrouhlování nemůže být ani řeč, protože průběh kmitočtu v závislosti na hodnotě AUDFn není spojitý.

Při použití poly-čítačů musíme sledovat vzájemný vztah periody zvukového čítače, kterým vzorkujeme, a opakovací periody poly-čítače. Od periody zvukového čítače nejprve odečteme celé násobky periody poly-čítače, zbytek pak s touto periodou porovnáme.

Nejsou-li tato čísla soudělná, získáme na výstupu kmitočet vydělený délkou periody poly-čítače. (Výstupní signál obsahuje v každé periodě plný počet vzorků z poly-čítače.)

Jsou-li obě čísla soudělná, získáme kmitočet dělený poměrem: perioda poly-čítače / zbytek periody zvukového čítače. To je také počet vybraných vzorků ze signálu poly-čítače, které tvoří periodu výstupního signálu (některé fáze poly-čítače se při vzorkování pravidelně přeskakují). Výsledný zvuk je méně zkreslený, jaksi "měkký".

Poslední možnost nastane, je-li perioda zvukového čítače násobkem opakovací periody poly-čítače. V tom případě se na výstupu neobjeví žádný signál (vzorkujeme stále stejný bod periodického výstupního signálu poly-čítače).

VÝPOČTY

Abychom snadno postihli všechna použitelná zabarvení zvuku, rozdělíme si výpočet kmitočtu na dvě části. Nejprve určíme periodu na výstupu zvukového čítače, pak výstupní kmitočet pro konkrétní zabarvení.

Perioda zvukového čítače je pro 8- a 16-bitové čítače taktované různými kmitočty následující:

  8-/16-bit. čítač, 64kHz: T=(N+1)*28
  8-/16-bit. čítač, 15kHz: T=(N+1)*114
    8-bit. čítač, 1.79MHz: T=N+4
   16-bit. čítač, 1.79MHz: T=N+7

"T" je výsledná perioda (v hodinových cyklech), "N" je hodnota uložená do registru AUDFn (případně jejich dvojice - pro 16-bitový čítač). Používáme-li zvukové čítače jako časovače, bude doba mezi dvěma přerušeními IRQ rovna právě této periodě.

Bude-li "F" hodinový kmitočet, pro čisté tóny (režimy $Ax nebo $Ex) vyjde výstupní kmitočet následující:

        X=F/(T*2)  

4-bitový poly-čítač (režim $Cx) má opakovací periodu 15 cyklů a poskytuje celkem tři různá zabarvení zvuku. Pro periodu, která je násobkem pěti, vychází výsledný kmitočet:

        X=F/(T*3) 

Pro periodu, která je násobkem tří to bude:

        X=F/(T*5) 

A konečně pro periodu, která není násobkem tří ani pěti:

        X=F/(T*15) 

Perioda nesmí být násobkem patnácti. Každá ze tří uvedených možností dává jinou barvu zvuku - "nejtvrdší" je poslední z nich.

První z uvedených možností je poněkud problematická. Počet vzorků odebíraných z poly-čítače v každé periodě je tak malý (tři) že při určitém fázovém posunu mezi oběma čítači (zvukovým a poly-) může být výstup nulový (tři odebírané vzorky jsou shodné). Pravděpodobnost tohoto stavu bohužel není zrovna zanedbatelná (spíš naopak), což použití této varianty prakticky vylučuje. Navíc při taktování zvukového čítače kmitočtem 15kHz tato varianta nefunguje vůbec, neboť předřazený dělicí poměr 114 je násobkem tří a nepřipouští tedy periody, které by byly násobky pěti a současně nebyly násobky patnácti.

5-bitový poly-čítač (režim $6x nebo $2x) má periodu 31 cyklů. Protože se jedná o prvočíslo, dává 5-bitový poly-čítač pouze jedno zabarvení, průběh kmitočtu v závislosti na AUDFn je téměř spojitý. Signál z tohoto poly-čítače prochází navíc ve vzorkovacím obvodu děličkou dvěma, takže konečný kmitočet je:

        X=F/(T*31*2) 

Perioda samozřejmě nesmí být násobkem 31.

9-bitový poly-čítač (režim $8x při nastavení bitu 7 v AUDCTL) má periodu 511 cyklů - z toho vychází opět tři možnosti. Pro periodu, která je násobkem 73 je kmitočet:

        X=F/(T*7)

Pro násobek sedmi je to:

        X=F/(T*73) 

A konečně pro periodu, která není násobkem žádného z uvedených čísel:

        X=F/(T*511) 

Perioda nesmí být násobkem 511. První z výše uvedených možností s sebou přináší podobná úskalí jako první varianta u 4-bitového poly-čítače: V závislosti na fázovém posuvu mezi zvukovým a poly-čítačem může být někdy výstup nulový. Zmíněná první možnost navíc nefunguje při taktování zvukového kanálu ze 64kHz - předřazený dělicí poměr 28 je násobkem sedmi, proto jsou všechny dostupné násobky 73 současně i násobky 511.

Použití 9-bitového poly-čítače nelze obvykle v hudbě kombinovat s "bubnováním" (mimo samplovaného), neboť žádný režim mimo 17-bitového poly-čítače (nyní změněného na 9-bitový) nedává dostatečně náhodný signál - bicí bez něj různě "skřípou" nebo "hučí".

Zbývá ještě 17-bitový poly-čítač, jeho výstup však není pro hudbu vhodný kvůli velice dlouhé periodě. Ta činí 131071 cyklů (prvočíslo), takže nejvyšší dosažitelný opakovací kmitočet na výstupu je asi 3Hz...

PROGRAM V BASICU

Přílohou tohoto článku je kromě již dříve zmiňovaného obrázku také program v ATARI BASICu nazvaný FREQ.BAS, který vytváří tabulky hudebních kmitočtů podle dříve popsaných zákonitostí. Po spuštění tento program nejprve provede výpočty všech tónů pro všechna hudebně použitelná zabarvení zvuku (to chvíli trvá). Poté si můžeme z menu zvolit poslechovou zkoušku, výtisk tabulky kmitočtů nebo odchylek na tiskárnu, uložení tabulek na disketu, nebo ukončení programu.

Při poslechové zkoušce se pomocí šipek (bez CONTROL) pohybujeme po tabulce (nahoru/dolů měníme výšku tónu, vlevo/vpravo pak zabarvení zvuku), použitím šipek nahoru/dolů s CONTROLem se posuneme o celou oktávu. Při tom se právě zvolený tón ozývá z reproduktoru. Mezerníkem ho dočasně umlčíme (ach ty nervy!), pomocí ESC se vracíme do menu.

Další dvě možnosti v menu vyžadují, aby byla připojena tiskárna se šířkou stránky nejméně 80 znaků. Vytiskne se kompletní tabulka, kde sloupce odpovídají zabarvení zvuku, řádky jednotlivým tónům, a uvedená čísla jsou hodnoty určené pro registry AUDFn. Tabulka odchylek je velice podobná, jen uvedená čísla jsou zde jiná - jedná se o odchylky skutečných kmitočtů od optimálních (v centech, zaokrouhlené nahoru). Podle toho lze pro konkrétní účel posoudit použitelnost jednotlivých zabarvení.

Uložení tabulek na disk vytvoří 11 krátkých souborů, které obsahují v textové podobě čísla z příslušných sloupců tabulky (oddělená jen čárkami - vhodné pro další úpravu a poté začlenění do zdrojových textů).

Základem ladění je v tomto programu konstanta Z0 definovaná na začátku - jedná se polovinu periody tónu C Subkontra v hodinových cyklech (hodnota o 7 vyšší, než odpovídající nastavení AUDFn pro 16-bitovou děličku z 1.79MHz a čistý tón).

ZÁVĚREM

Protože nechci dále zvyšovat chaos v naší literatuře, zmíním se alespoň v krátkosti o spolehlivosti informací uvedených v tomto článku.

Obsah kapitoly "HUDEBNÍ JEDNOTKY" je v podstatě převzat ze [4], základní hodinový kmitočet jsem se slušnou přesností přeměřil - samozřejmě pouze pro verzi PAL. Tyto údaje považuji za spolehlivé.

Zbytek článku je mozaikou poskládanou z nejrůznějších zmínek a náznaků v literatuře, a dále z mých vlastních zkušeností, experimentů a úvah. Nemusí se do detailu shodovat se skutečnou vnitřní strukturou obvodu POKEY, jeho funkci však popisuje uspokojivě. Zkoušel jsem prakticky všechno, co bez osciloskopu vyzkoušet lze, a nenašel jsem žádné odchylky od své teorie.

Jiří Bernášek (BEWESOFT)

POUŽITÁ LITERATURA

  1. MEGA MAGAZINE #5 (disk, A.N.G. Software, Holandsko) - článek "PAL and NTSC"
  2. V.Tavač, M.Korčák: Atari - Popis technického vybavenia (Klub elektroniky Tlmače, 1988)
  3. Dočekal: ABC o počítačích Atari (Tuto příručku mi bohužel před dopsáním článku kdosi odcizil, takže nemohu uvést přesnější údaje.)
  4. Ročenka Sdělovací techniky 1985 - Hudební akustika (str. 259 až 265)