PC-AUDIO
Adlib és Adlib-Gold
II. rész
Ismét, immáron sokadszor vagyok itt, de remélem nem untatok meg engem! Az ADLIB-téma 2. fejezetéhez érkeztünk mely egyben az utolsó is, bár lenne még mirôl beszélni! Mint azt ahogy a múltkori részben megígértem most már hangot is ki fogunk adni!
Ugye mindenki emlékszik még a regiszterek fogalmára, használatára, úgyhogy ezt nem kell újra leírnom! Ezek után a dolog velôs, száraz, de rendkívül élvezetes része jön...tehát lássuk a regisztereket egyesével, szépen kitárgyalva, mint ahogy egy pletykás vénasszony csinálja. Remélem olvasóim között a vakokon kívül ilyenek sincsenek!
$01 regiszter - Tesztelés / Hullámforma torzításának engedélyezése
A kártya tesztelési céljait kielégítô regiszterrôl van itt szó, s számunkra csupán az 5. bit érdekes, mivel ennek bekapcsoltsága esetén minden egyes operátorra megadhatjuk a hullámforma torzítását. Részletesen errôl majd késôbb, most elég annyit tudni, hogy ezzel ki-be lehet kapcsolgatni a lehetôséget!
$02 regiszter - Az 1. idôzítô értéke
Ha ezt az idôzítôt engedélyeztük, akkor a regiszterbe írt érték 80 microsecundumonként növelôdik, majd ha eléri a túlcsordulási szintet, azaz a 256-ot (BYTE!), meghívja a 8-as interruptot (IRQ0), s ha mi ezt az interruptot átvettük, érzékelni tudjuk az idôt.
$03 regiszter - A 2. idôzítô értéke
Mûködését tekintve teljes egészében megegyezik az elôzô ($02-es) regiszterrel, csupán a növelési késedelem nem 80 microsecundum, hanem 320 microsecundum, ami az elôzô négyszerese, tehát negyed akkora tempóval növekszik a számláló. Itt jegyzem meg, hogy ezeket az idôzítôket nagyon ritkán használjuk (legalábbis én), hiszen ilyen finom idôzítésre nem igazán van szükség, elég a 18.2/sec-os $1C interrupt.
$04 regiszter - Idôzítô parancsbyte
Itt lehet meghatározni, hogy melyik idôzítô mûködjön. Fontos, hogy ha nem használunk idôzítôket, akkor kikapcsoljuk ôket, hisz ha nem tesszük meg akkor egy HDD motor leállást szabályozó, 8-as interrupton levô alprogram kapja meg a vezérlést, és ez káoszhoz vezet! A bitek jelentése:
0. bit : Beállítva elindul az elsô idôzítô.
1. bit : Beállítva elindul a második idôzítô.
2-4 bit: Nem használt
5. bit : Beállítva a 2. idôzítôt letiltja.
6. bit : Beállítva az 1. idôzítôt tiltja le.
7. bit : Minden más bit értékétôl függetlenül, az idôzítôk nem mûködnek.
$08 regiszter - Beszédgenerálás
Ezt a regisztert az emberi hang keltésére fejlesztették ki, s ha a 7. bitet bekapcsoljuk, minden operátor egy csatornához lesz rendelve, s így nagyon bonyolult hullámformák is elôállíthatóak. Elviekben mûködik, de a gyakorlatban egyáltalán nem használt, ugyanis a SB-k térhódítása kirekesztette az ADLIB ilyen irányú felhasználását, és különben is iszonyatosan nagy feladat a megfelelô hullámforma elôállítása az ember részérôl is. Hagyjuk!
$20-$35 regiszter - Operátorok adatai I.
Az operátorok összetett adathalmazának elsô darabját leíró regiszter. A 0. operátorhoz a $20-as regiszter tartozik, az 1. operátorhoz a $21-es, ... , a 21. operátorhoz pedig a $35-ös regiszter. Ez szerintem világos!
0-3 bit: Megadható, hogy az adott operátor a hang melyik felharmonikusát játssza hozzá a hanghoz.
4. bit : Beállítva arra utasítjuk a kártyát, hogy a frekvencia növelésével csökkenjen a hangerô.
5. bit : Az ASDR görbe kitartás fázisa addig szól, míg a bit beállított. Ha rögtön törölt, akkor nincs kitartás fázis. (pl.: 0-zongora, 1-fúvósok)
6. bit : A frekvencia vibráltatásának engedélyezése.
7. bit : Az amplitúdó vibráltatás engedélyezése.
A felharmónikusok: 0 - Egy oktávos csökkentés
1 - Frekvencia nem változik (alapharmónikus)
2 - Egy oktávos emelés
3 - Egy oktáv + 7 félhang emelés
4 - Két oktáv emelés
5 - Két oktáv + 4 félhang emelés
6 - Két oktáv + 7 félhang emelés
7 - Két oktáv + 10 félhang emelés
8 - Három oktávos emelés
9 - Három oktáv + 2 félhang emelés
A - Három oktáv + 4 félhang emelés
B - Három oktáv + 4 félhang emelés
C - Három oktáv + 7 félhang emelés
D - Három oktáv + 7 félhang emelés
E - Három oktáv + 11 félhang emelés
F - Három oktáv + 11 félhang emelés
$40-$55 regiszterek - Operátorok adatai II.
Az operátorok adatai közül ebbe a regiszterbe is jutott egy pár, sôt...
0-5 bit: Az adott operátor hangereje, tehát, hogy az adott szinuszgörbe módosítást milyen intenzitással, erôsséggel hajtsa végre. 0-ás érték a leghangosabb, míg a 63-as a leghalkabb! Érdekes megoldás!
6-7 bit: Ha be van kapcsolva az automatikus hangerôcsökkentés, akkor itt megadhatjuk a mértékét. A 0, 1, 2, 3 értékek rendre 0, 1.5, 3, 6 dB-el csökkentik a hang erôsségét.
$60-$75 regiszter - Operátorok adatai III.
Ez az operátor paramétereinek 3. csoportja, melyben az ASDR (burkoló-)görbe elsô és második szakaszának értékeit adhatjuk meg. Lássuk!:
0-3 bit: Lecsengés hossza (0-15)
4-7 bit: Felfutás hossza (0-15)
$80-$95 regiszter - Operátorok adatai IV.
Itt pedig az ASDR görbe maradék, harmadik és negyedik szakaszát definiálhatjuk minden egyes operátorra.
0-3 bit: Felengedés hossza (0-15)
4-7 bit: A kitartás szintje (0-15)
$A0-$A8 regiszter - Csatornák adatai I.
Most áttérünk a csatornák adatainak megbeszélésére, ahol csak minden csatornára, és nem minden operátorra adhatjuk meg a paramétereket. Itt is értelemszerûen a $A0 regiszter az elsô csatornához, míg a $A1 pedig a második csatornához kapcsolódik. Ki hinné? Szóval ebben a regiszterben a csatornák adatai közül is a frekvencia értéket kell megadni, de módosítanunk is kell egy kicsit. Mivel minden frekvenciához egy ADLIB által definiált érték tartozik, ezért ezt az értéket egy táblázatból ki kell keresni. De ezek az értékek még nem csak hogy különböznek a frekvencia értékétôl, de még 10 bitesek. Ezért ebbe a regiszterbe a táblázatból kikeresett érték alsó 8 bitjét kell írni, míg a felsô kettôt a következô regiszterbe. S a táblázatot is leírom, nehogy ezt hozzátok fel ellenem mentségnek, ha nem szólal meg az ADLIB! Tehát:
Érték Frekvencia Hangjegy
$157 261.6 C-4
$16B 277.2 C#4
$181 293.7 D-4
$198 311.1 D#4
$1B0 329.6 E-4
$1CA 349.2 F-4
$1E5 370.0 F#4
$202 392.0 G-4
$220 415.3 G#4
$241 440.0 A-4 (normál A hang)
$263 466.2 A#4
$287 493.9 B-4
$2AE 523.3 C-5
Talán annyit, érdekesség képen, hogy a frekvencia értékét megszorozva körülbelül 1.31-el, a táblázatból kiolvasható értéket kapjuk.
$B0-$B8 regiszter - Csatornák adatai II.
Na itt kell megadni a frekvencia felsô 2 bitjét és az alap oktávot. Ez mit is jelent? Ezen oktávhoz képest lesz a frekvenciában megadott értékkel ELTOLVA a hang. Tehát ha én az alapoktávot 3-ra állítom, akkor az A-4 hang az A-7 hangnak fog megfelelni. (Azt hiszem! - Biztos! - Programozó vagyok, nem zenész!) Nem tudom miért ez a keverés itt is, de ha a gyártóknak így esett jól, hát legyen! Ezen kívül a csatorna megszólaltatását is itt lehet engedélyezni. Ha kikapcsoljuk, akkor mindkét hozzárendelt operátor elkezdi a felengedés fázist, és lassan hallgat el, nem pedig levágás szerûen.
0-1 bit: A frekvencia táblázati értékének felsô két bitje.
2-4 bit: Alap oktáv meghatározása (0-7)
5. bit : Bekapcsolt állapotban a csatorna engedélyezett, különben letiltott.
6-7 bit: Nem használt, értékük határozatlan.
$BD regiszter - Globális paraméterek
Ezen regiszter néhány olyan paramétert tartalmaz, melyek a hangkeltés egészére vonatkoznak, nem pedig csupán egy-egy csatornára.
0-4 bit: Beállított állapotban a megfelelô beépített ritmushangszerek szólnak. Az egyes bitekhez rendelt hangszerek rendre: HI-HAT, CYMBALL, TOM-TOM, SNARE, BASSDRUM. Kezelésük kissé bonyolult. Alapkövetelmény, hogy ha ritmushangszert használunk, akkor a 7-9 csatornákat tiltsuk le. A beépítettség ellenére az ASDR görbét nekünk kell megadni a $10-$14-es operátorokon (ezek is rendre egy-egy hangszernek felelnek meg), és emellett olyanra szükségeltetik beállítani, hogy a cintányér ne orgonára hasonlítson. Kevéssé használt, így nem kívánok vele igazából foglalkozni. De hát, ha egyszer ilyen is van benne...!
5. bit : Beállításával engedélyezhetjük az 5 ritmushangszert, a 6 normál, melodikus hangszer mellett. És így összesen 11 hangszer szól, és ezért hirdetik az ADLIB-ot 11 csatornásnak. Természetesen, ha kikapcsoljuk akkor a 9 melodikus hangszer szól, illetve szólhat.
6. bit : A $20-$35-ös regiszterekkel bekapcsolható frekvencia-vibráció mértékét lehet beállítani. Ha a bit értéke 0, akkor a vibráció értéke 1/100-ad félhang, és ha az értéke 1, akkor az érték 1/50-ed félhang. Leírva nem sok a különbség, de hallva a két hatás közti differenciát meglepôdhet az ember. Test it folks!
7. bit : Hasonlóan a 6. bithez, ez is egy vibrációt, mégpedig az amplitúdó vibrációt definiálhatjuk, mégpedig oly módon, hogy megadhatjuk, milyen erôs legyen a hangerô vibrálás. Ha a bit 0, akkor a vibrálás mértéke 1 dB,ha pedig a bit be van állítva, a vibrálás mértéke 4.8 dB. Ez is nagyon látványos, illetve inkább hallványos, de nem halvány!
$C0-$C8 regiszter - Csatornák adatai III.
A csatornák adatainak tárgyalását ezzel a regiszter csoporttal fogjuk befejezni, mely amennyire utolsó annyira fontos. Ez a csatornához rendelt két operátor közti összhangot teremti meg, és kis módosításokkal is nagyot lehet változtatni. Érdemes próbálkozni!
0. bit : A két operátor kapcsolata. Ha a bit értéke 1, akkor a két csatorna sorba van kötve, tehát az 1.-bôl kijövô belemegy a 2.-ba, és a 2.-ból kijövô lesz a végleges hang. Ezzel ellentétben ha a bit értéke 1, tehát beállított állapotban van, akkor a két csatornának semmi köze egymáshoz, mert mindegyik a saját hangját készítgeti, és csak a végén találkoznak, mikor is a két hang összekeveredik, és egymás mellett szól. A második módszerrel gépiesebb hangot lehet kiadni!
1-3 bit: Visszacsatolás fázisa (0-7). Megadja, hogy az adott csatorna operátoraiból kijövô hanghullám milyen késéssel menjen vissza önmagába. Egy kicsit ez hasonlít a visszhanghoz, mert itt is, egy már kész hang, egy kis késéssel újra átmegy a szinuszgenerátoron. A 0-7-ig terjedô értékek rendre a következôknek felelnek meg: 0 (nincs visszacsatolás), PI/16, PI/8, PI/4, PI/2, PI, 2xPI, 4xPI. Itt PI egy fél periódust jelent, mint a matekban. Emlékeztek, ugye?
4-7 bit: Ezekrôl a bitekrôl kell a legkevesebbet beszélni, ugyanis ezeket a hangkártya nem használja semmire, és még az értékük is határozatlan.
$E0-$F5 regiszter - Operátorok adatai V.
Ha a $01 regiszter 5. bitje bekapcsolt állapotban van, akkor itt egy-egy operátor hullámformáját torzíthatjuk.
0-1 bit: Ha az ide írt érték 0, akkor torzítás nem lép fel. Ha a regiszter értéke 1, akkor a második félperiódus egyszerûen eltûnik, mintha csak a pozitív számok tartományán lenne értelme a SIN(...) függvénynek. Ha a regiszter értéke 2, akkor a hullámforma völgye is dombként jelenik meg. Ez megfelel az ABS(SIN(...)) függvénynek. S végül ha az érték 3-mal egyezik meg, akkor a második félperiódus is pozitív lesz, mint a 2-es esetben, és ráadásul a második és a negyedik NEGYED periódus (nem FÉL periódus!) eltûnik, azaz nulla lesz. Erre nem tudok példát mondani, de úgy hiszem mindenki el tudja képzelni!
Véget ért a száraz anyag tárgyalása. A fent említett dolgokat természetesen nem kell kívülrôl fújni, csupán elég annyit megjegyezni, hogy a hardware melyik része számára, milyen paramétereket lehet beállítani. Például csak csatornákra adható meg a frekvencia-viszonyszám, de az ASDR görbe minden egyes operátorra definiálható. Ha ezt fejben tartjuk, tudjuk milyen elvárásaink lehetnek hangkártyánkkal kapcsolatban, és nem fogunk csalódni benne! A cikk fenti részét, mint referenciát használhatjátok, és használjátok is, azaz a tényleges regiszter-, és bitszámokat nem kell megjegyezni, hiszen itt az összefoglaló táblázat, ebben utána tudtok nézni.
És most ismét, immár negyedszer vagy talán már ötödször is, rátérek a hangkeltés megvalósítására, hisz most már minden ismeretünk megvan hozzá, csak éppen össze kell fogni, formába kell önteni a gondolatainkat. Elôször csupán csak egyetlen hangot szólaltatunk meg, de így legalább mindenki látja, hogy mirôl is szól az ADLIB!
Az elsô példaprogram pont errôl szól, csupán egyetlen hangot szólaltat meg, úgyhogy a forráskód áttanulmányozása mindenki számára elsôdlegesen fontos.
Mindenek elôtt a regisztereket törölnünk kell, oly módon, hogy mindegyiket lenullázzuk. Elég 0-tól 234-ig lenullázni ôket, ugyanis nincs több regisztere a kártyának. Ezek után jöhet a paraméterek beállítása (frekvencia, ASDR, hangerô, stb...). A végén pedig a $B0 regiszterrel (5.bit) bekapcsoljuk a hangot, majd egy gombnyomásra, a bit törlésével kikapcsoljuk. Fontos még megemlíteni az ADLIBREG eljárást, mely a regiszterekbe való írást, és az utánuk való késleltetést végzi, a programot áttekinthetôvé teszi, sôt még a program hosszát is csökkenti. Egy szó, mint száz, az alapokhoz ajánlatos az elsô példaprogramot áttanulmányozni, és teljes egészében megérteni. Ne ijedjetek meg, egyszerûbb, mint a PC-SPEAKER-é!
Gondolom mindenki áttekintette az ADLIB_1.PAS fájlt, és teljes egészében megértette(!?!?!?!). Szememre vethetitek, hogy ez egy elég sovány hang volt! Ezzel én is egyetértek, de valahol el kell kezdeni! A hangszerek és az idôzítô programozására nem is írtam példaprogramot, hiszen azért nem szenvedek, hogy rájöjjetek, mennyire nincs ilyenekre szükség...! Ezt komolyan gondolom!
A 2. példaprogram (ADLIB_2.PAS) viszont magyarázatra szorul. Tehát, mirôl is van szó?
Itt egy konkrét hangsort játszottunk le és aki ügyes, arra is rájöhetett, hogy pont ez a dallam volt a SPEAKER 1. mintaprogramjában. De érdekes, nem!? Az is feltûnhet bárkinek, hogy a program felépítése is szinte megegyezik, csupán a hangkeltô rutin, és kisebb dolgok különböznek. Mivel ennek a rovatnak a feladata a programozási trükkök elmagyarázása, egy kis hangkártyától különbözô programozás is került a példába. Nem kell megijedni, nem bonyolult, csak nem egyezik meg szóról-szóra a SPEAKER-essel! Ja, és nem akarom más kenyerét sem elvenni!
Szóval: A frekvenciákat egy táblázatban tároltuk, és a 1/18-ad másodpercre idôzített hang-rutin ezt olvassa. A hang lejátszásának két állapota van. A HANG állapot és a SZÜNET állapot. Ezek között tesz különbséget a SZÜNET nevû BOOLEAN változó. Mindkét "üzemmódnak" van külön belsô változója, melyek ha elérik a maximális értéküket (ld. a Const szó után) váltják az üzemmódot. Az egész program addig tart, míg az utolsó utáni (nem viccelek) hangot kezdené el játszani.
A program egyetlen aprócska kis hibája, hogy az elsô hangot nekünk, "manuálisan" kell megszólaltatni, mert a rutin a már megszólaltatott hangot tudja csak felügyelni, és ez annyira elenyészô hiba, hogy bárki ki tudja javítani!
Itt újra felhívnám mindenki figyelmét arra, hogy a kártya regisztereit célszerû használat elôtt és után RESET-elni, hogy nehogy az elôzô/következô (nem követkôzô) program galibát (G.A. liba) csináljon.
Véleményem szerint mindenki, aki akarta, megérthette az ADLIB mibenlétét. A példaprogram(ok) nagyon szegényesek voltak, de ez az érettségim rovására írható. Lévén, hogy most már túl vagyok minden érettségin, csak Veletek fogok foglalkozni (no meg persze a VIKI barátnômmel) és ígérem, hogy az SoundBlaster-es cikk(ek) jobb(ak) lesz(nek), s aki eddig nem vette az újságot ezek után, csupán csak az én írásomért, megveszi. Ne rémüldözzetek, nem vagyok beképzelt, csupán látom az elégedett fejeket, akik a saját hangukat tudják majd variálni az SB-vel. Ennyi volt a móka mára, zárul TSCHiby mókatára...
...Hogy milyen részletesen lesz az SB jellemzése, Azt Majd Meglátjuk...a vak is ezt mondta...és ment tovább...
A cikk Winword DOC formátumban
Mr.TSCHuby
eMail:PC-XUser@IDG.HU, Subject: "Audio rovat"
TSCHSOFT@TTK.JPTE.HU