4 csatornás zenelejátszó TVC-re | 1. rés ...

4 csatornás zenelejátszó TVC-re | 1. rész

Jul 22, 2024

Ki ne szeretne egy szépen szóló zenét a játékába, vagy a demójába. Viszont, a lehetőségek korlátozottak. Ahány mikroszámítógép, annyi hangkeltési lehetőség. Jó, ez nem teljesen így igaz, de legalábbis elég széles a paletta. A szinte néma géptől a sztereó, 4 csatornás, 8 bites hangzásig sok variáció fordul elő. Ebben a projektben egy 4 csatornás zenelejátszót próbálok meg elkészíteni, ami elsősorban a TVC gyári hangrendszerére készül.

image

ELŐZMÉNY

Az ismert több csatornás zenelejátszók mind az adott többcsatornás hangchippel rendelkező gépekre íródtak, és azon chipek tudását maximálisan kihasználják. Vannak ilyen-olyan konvertálási lehetőségek, amik több kevesebb sikerrel járnak. Illetve, a produktumuk minél jobban hasonlítanak az eredetiekhez, annál nagyobb CPU / RAM igényük van. Jellemzően, ilyenkor a zene mellett szinte semmilyen más tevékenységet nem tud végezni a CPU. Ez egy főcímzenének még elmegy, bár ha a zene ráadásul még nagy méretű is, akkor nem sok hely marad a játéknak, vagy a demónak.

A cél, egy olyan lejátszó megalkotása, ami kis CPU igénnyel, és viszonylag kis RAM foglaltsággal rendelkezik.

LEHETŐSÉGEK

A TVC vagy egy négyszög-jelet tud kiadni 16 különböző hangerővel, vagy az ismert módon, a hangerő szabályozót felhasználva egy 4 bites digitális hangkimenetet kapunk.

Ez az egy csatorna van, amin létre kellene hozni a polifonikus hangzást, legalább 4 különböző hangból.
A sima négyszögjel generálás, akár polifonikusan, nem hoz jobb eredményt, mint egy quacz játék "prüntyögő" zenéje.
Marad a digitális megoldás. De abból is csak egy csatornánk van.

A SINCLAIR ZX81 Sound Digitizer cikkemben írtam már az analóg és digitális hangok közti különbségekről, minőségükről. Nézzük át újra a lényegesebb dolgokat.

Az alábbi ábrákon a kék vonal szimbolizálja az analóg hangot.
image

  • Az 1 bites (piros), azaz LO/HI állapot nagyon durva eredményt ad.

  • A 2 bitesnél (sárga) már 4 jelszintet tudunk megkülönböztetni. Látható, hogy némileg finomodott az eredmény, kezd hasonlítani az eredetihez.

  • Tovább duplázva a bitek számát, a 4 bit (zöld) 16 jelszintet produkál, ami egész jól leköveti az analóg jelet.

  • 8 bitnél már nem látnánk különbséget, mer ott már 256 szint van.

Értelem szerűen, a 2 és 8 bitessel nem foglalkozunk. Noha, első ránézésre az 1 bites nagyon távol áll az "egész jól leköveti az analóg jelet" megállapítástól, mégis vannak olyan technikák, amik csúcs minőségű hangzás tesznek lehetővé ezzel az 1 bites kapcsolgatós ( 0 / 1 ) megoldással. Ezt nevezzük PWM-nek. Magyarul: impulzus szélesség moduláció. Ez annyit tesz, hogy egy fix vivőfrekvencián, ami minimum a hallási küszöb felett van, kapcsolgatjuk a bitet, a jelszintnek megfelelő kitöltési tényezővel. Ezt a technikát sajnos nem tudjuk alkalmazni, mert nem elég gyors hozzá a gépünk, és a RAM is kicsi.
20 kHz-es vivőfrekvencián, és 4 bitesnek megfelelő hangminőséghez 160000 lehetséges kapcsolási pont kellene (minimum 16 MHz-es CPU), és majd 10 kB-ot foglalna egyetlen másodpercnyi hang.
Az is járható, ha csak ki be kapcsolgatjuk nagy sebességgel. Ehhez némileg elég a CPU, és RAM-ot sem emészt fel annyit. Ennél a technikánál a magas hangok aránylag jól hallhatók, a mélyek is egész jók, de nincs egyáltalán dinamika. Ilyen zenét az EIKO MEGADEMO-m 1:03-tól kezdődő részétől hallani. A nagy sebességű hanggenerálás mellett még egy nagyméretű text scroll-ra van ideje a CPU-nak. A hang recsegős a változó dinamika miatt, a szöveg, ének úgy ahogy felismerhető. De vannak egyes hangszerek, amik azért jobbak, mint egy quarcz játék 1 bites zenéje, de ez egyáltalán nem mondható kielégítőnek.

Marad a 4 bites digitális formátum. A 4 bitre generált hanghullámok már elegendő dinamikával rendelkeznek ahhoz, hogy jóval kisebb legyen a recsegés.

ELVI MEGVALÓSÍTÁS

A TVC hangrendszere egy csatornás, de hogy lesz belőle 4 csatorna? Sehogy!
A 4 csatorna jelét kell összekeverni egy csatornává. Ahhoz, hogy a lejátszó program "látson" 4 virtuális csatornát, először létre kell hozni egy szoftveres hangkeverőt, szebb nevén: audio mixer-t.

A matematikai képlet egyszerű: Z=A+B+C+D

Igen, egy analóg rendszernél ez jó is, ám a digitálisnál ez nem járható út, mert az eredmény magasabb is lehet, mint az, ami leírható a 4 biten, és ronda CLIP, azaz túlvezérlés, hangja hallható.

Már a csend hangja, ami középértéken 8-as, az is a 4 csatornán összegezve több mint a maximális megengedett 15-ös érték, a maximum jelszinttel, még ennél is több.

Z=8+8+8+8=32
Z=15+15+15+15=60

Módosítsunk a képleten. Mivel 4 értéket adunk össze, osszuk el 4-el.
Így a képlet: Z=(A+B+C+D)/4 Teszteljük a fenti példákkal.

Z=(8+8+8+8)/4=8
Z=(15+15+15+15)/4=15

Igen ám, de mi van, ha csak egy csatorna szól a többin nincs hang. Nézzünk erre is példákat.

Z=(8+8+8+10)/4=8 - D csatornán kis méretű pozitív jelszínt.
Z=(8+8+8+15)/4=9 - D csatornán maximális méretű pozitív jelszínt.
Z=(8+8+8+0)/4=6 - D csatornán maximális méretű negatív jelszínt.

Nos, ezek a kerekített eredmények nagyon nem jók. A hangerő drasztikusan leesett, olyan lett, mintha 2 bites lenne. Valójában, az átlag jelszintet kaptuk meg. Némi fejtörés és keresgélés után találtam képleteket a digitális jelek olyan módú keverésére, hogy ez ne történjen meg. Viszont, ezek a képletek vagy nagyon bonyolultak voltak, vagy nem a kellő eredményt hozták.

A GYAKOLLATI MEGVALÓSÍTÁS TERVE

A keresési találatokból az világos lett, hogy egyfajta limiteres dinamika kompresszió történik. A limiter segítségével maximalizálják a hangerőt egy beállított értékre, és a jeltartományt egy logaritmikus dinamikakompresszorral ebbe a tartományba préselik.

Hát... ezek voltak a bonyolult függvények. :)

Sebaj, ilyenkor jön a jól ismert mondat: "Fogd meg a söröm!"
Két napi agyalás és számtalan excel grafikonon való tesztelés után, megszületett a 4 bitre optimalizált, 2 csatornás, limiteres dinamikakompresszorral ellátott digitális mixer képlete.
Nem mondom, hogy ez nem lett bonyolult, hisz az adott két változó (csatornák) alapján létrehozunk egy harmadikat, amivel logaritmikusan módosítjuk az öt létrehozó két változóval végzett alap számítás eredményét (dinamika kompenzáció), amit egy negyedik változóval a kívánt értéken belül tartunk (limiter).

A teszteredmény az alábbi grafikonon látható. Az A csatornán (sötétkék szaggatott vonal) 0-1 Hz sweep látható, míg a B csatornán (világoskék szaggatott vonal) konstans 16 Hz látható.
A piros vonal az egyszerű (A+B)/2 képlettel számolt értékeket mutatja, egész értékre kerekítve.
És a kielégítő eredményt (Z) a fekete vonal mutatja. Látható, hogy azokon a helyeken, ahol egyszerűen lefeleződött volna az összegzett jelszint, ott milyen szépen kompenzál a kompresszor, és a maximális helyeken sincs egyenes levágás, hanem szépen lekerekíti a limiter a jelet.
image

A négy csatornát pedig könnyen össze lehet úgy keverni, hogy (A+B)+(C+D).
Azaz külön összekeverjük az A és B csatornát, illetve a C és D csatornát, majd összekeverjük a kapott két eredményt.
Azért ezt a megoldást választottam, mert mind a négy csatorna összekeverése szolgáló függvény bonyolultságából adódóan, nagyon hosszú lenne a kód és tizedes számokkal is kellene számolni. Ismételten a furfangosság, azaz, matek helyett mátrix. :)
Az előre legenerált összes lehetséges variációt egy kis 16*16-os, 2 dimenziós adatmátrixban letárolom, és onnan a két csatorna értéke alapján, nagyon kevés utasításból álló rutinnal kiolvasom a kevert értéket. Lehetne rögtön mind a 4 csatorna keverési variációit letárolni, de gondolj csak bele, hogy az hányszorosa lenne a 2 csatornásnak? Igen, pont 256 szorosa, azaz, 65536 bájt lenne. A teljes memória kellene neki, a 256 bájt helyett.
Ennél jobban optimalizált (gyors, kicsi) megoldás már nincs.

HOGYAN TOVÁBB?

A következő lépés a mátrix legenerálása, és a kód megírása. Erről a cikkem következő részében olvashatsz majd.

Köszönöm a figyelmet!

Ha tetszett a cikkem, és meghívsz egy kávéra, bátorítasz, hogy írjak még hasonló érdekességeket számodra.

Enjoy this post?

Buy NICKMANN Studio a coffee

More from NICKMANN Studio

PrivacyTermsReport