O generowaniu grafiki kiedyś już pisałem – dostałem potem kilka listów, że spodziewaliście się po mnie więcej, że napisałem za mało i zbyt ogólnie. Być może kiedyś jeszcze wrócimy do tamtych zagadnień, zwłaszcza że są dwa tematy warte poruszenia (kość Virge, następczyni Trio, i biblioteka DirectDraw z Windows 95), przy okazji których można by moje wcześniejsze rozważania uszczegółowić. Na razie jednak przyjrzymy się (znowu po łebkach, niestety) technologii generowania dźwięku. O dziwo, po raz kolejny pojawi się przy tej okazji pewien sposób postępowania, o którym była mowa przy grafice…
Zacznijmy od samego początku – czyli od układów służących do syntezy dźwięku. Od nich się to wszystko zaczęło – już w czasach pre-komputerowych były używane w poważnych, elektronicznych (wtedy często nazywanych elektronowymi) instrumentach muzycznych. Synteza odbywała się w kilku układach, z których jeden zazwyczaj generował, jakiś sygnał o określonej formie (sinusoida, trapez, trójkąt, prostokąt) i częstotliwości, pozostałe zaś służyły do modyfikowania tego pierwotnego sygnału – zmieniania czasu wybrzmiewania, amplitudy, tudzież do mieszania ze sobą kilku sygnałów – w ten sposób można było na przykład modulować sinusoidę piłą (nie mam tu miejsca na rysowanie wykresów, ale jakbym je narysował, wszystko byłoby jasne). Tak był generowany dźwięk w C64 (układ SID), podobne możliwości miały Amstrady, na tej samej zasadzie działa też AdLib (teraz występujący wyłącznie jako fragment większych kart, głównie klonów Sound Blastera, ale kiedyś była to samodzielna karta). Syntezatory były zwykle wielokanałowe, czasem – jak w AdLibie – liczba kanałów zależała od tego, czy sygnały z jednych były używane do modulowania drugich, czy nie.
Odpowiednio manipulując parametrami opisującymi sygnały i sposób ich mieszania można było naśladować brzmienie wielu różnych instrumentów, czasem całkiem udatnie (na przykład w przypadku fletu, generującego zazwyczaj sygnał czysto sinusoidalny), czasem bardzo kiepsko (zwłaszcza w przypadku instrumentów bardziej skomplikowanych, w których duże znaczenie dla brzmienia ma spora liczba częstotliwości harmonicznych – np. skrzypce). Synteza nie była więc rozwiązaniem zadowalającym, ale przez długi czas jedynym, a – jak wiadomo – jak się nie ma co się lubi, to się lubi co się ma.
Sytuacja zmieniła się gwałtownie z pojawieniem się na rynku Amigi. Nie żeby zastosowane w niej rozwiązanie było zupełną nowością, pod różnymi nazwami występowało ono od jakiegoś czasu w sprzęcie studyjnym, jednak w Amidze pojawiło się po raz pierwszy w sprzęcie komputerowym (a może nie mam racji?). To nowe rozwiązanie, to przetwornik DA (Digital/Analog) – czyli kawałek elektroniki zamieniający daną liczbową (na przykład pojedynczy bajt) na napięcie. Wystarczyło teraz zsamplowany (czyli wcześniej zamieniony na wartości liczbowe w przetworniku AD) sygnał odtworzyć przez przetwornik DA, żeby usłyszeć z głośnika dokładnie to samo, co przedtem zarejestrował mikrofon.
Ta technologia pozwoliła na złapanie za jednym zamachem kilku srok za ogony.
Po pierwsze, dzięki jej użyciu można było pokusić się o odtwarzanie podczas gier (i nie tylko) prawdziwych dźwięków – strzał nie musiał już być zsyntezowanym dźwiękiem nieudolnie usiłującym naśladować rzeczywistość. Strzał zaczął być strzałem, a mowa mową.
Po drugie – choć nie jest to w pierwszej chwili takie oczywiste – można było wreszcie zacząć odtwarzać prawdziwe brzmienie instrumentów. To proste – powie w tym momencie niejeden czytelnik, ale mogę mu wybaczyć pochopność. Zastanów się człowieku, co zrobić z dźwiękami o innej niż zarejestrowana wysokości? Przy syntezie częstotliwość była jednym z parametrów, przy przetworniku jakoś jej nie widać. Jednak można się do niej dobrać, tylko trzeba się przyjrzeć tej technologii trochę dokładniej.
Próbkowanie sygnału (czyli jego rejestracja) musi się odbywać z jakąś określoną częstotliwością – czasem jest ona ograniczona przez możliwości przetwornika (jeżeli przetwornik potrzebuje na wykonanie konwersji 1 milisekundy, nie da się samplować z częstotliwością większą niż 1 kHz), czasem – znacznie częściej – naszymi potrzebami. Nie wnikając w szczegóły (bo jeszcze do nich wrócimy), nie ma sensu samplowanie z częstotliwościami większymi niż 44 kHz. Jeżeli odtwarzając sygnał będziemy próbki wysyłać do przetwornika DA z taką samą częstotliwością, z jaką były one z niego zbierane, uzyskamy taki sam dźwięk jak podczas rejestracji, jeśli zmienimy trochę tę prędkość – zmieni się wysokość dźwięku. Można więc zagrać jakąś melodię, mając zsamplowany instrument? Można.
Sytuacja trochę się komplikuje, jeśli wziąć pod uwagę konieczność równoczesnego odgrywania kilku sampli, każdego z inną częstotliwością – niestety, przetwornik może pracować w danej chwili z tylko jedną, więc albo trzeba mieć kilka przetworników, albo dokonać zmiksowania sygnałów w jakiś inny sposób – na przykład na drodze programowej, odpowiednio przeliczając częstotliwości i wielkości próbek.
Oba rozwiązania mają swoje zastosowania. Wieloma przetwornikami operują karty z rodziny Gravisa (choć nie jestem w tej chwili pewien, czy przypadkiem tam też nie ma jednego przetwornika, jednak z dodatkową elektroniką miksującą najpierw sample), jednym przetwornikiem – i koniecznością „ręcznego” miksowania sygnałów – wszystkie karty z rodziny Sound Blaster (klony oczywiście też). Żeby było śmiesznie, przy programowym miksowaniu sygnałów stosuje się wariant algorytmu, o którym wspominałem kilkakrotnie podczas pisania o technikach generowania grafiki. W zależności od efektywności zastosowanego algorytmu i jakości kodu, a także szybkości komputera można miksować nawet kilkadziesiąt kanałów. Zwykle 16 wystarcza w zupełności. (Znajdujące się na naszej dyskietce Shareware biblioteki do włączania dźwięku do gier, tudzież małe źródełko w Pascalu do odgrywania MOD-ów, korzystają właśnie z tej technologii; to źródełko można ściągnąć z naszego BBS-u).
Niestety, nie ma róży bez kolców. Podobnie jest i w tym wypadku – każde rozwiązanie oprócz zalet, ma zwykle jakieś wady. Tym razem doskwierać nam będzie brak pamięci. Samplingi są zwykle duże – co zresztą łatwo obliczyć. Jedna sekunda dźwięku stereo w najwyższej jakości (czyli 16-bitowy sygnał, dwa kanały, częstotliwość próbkowania 44 kHz) zajmuje 2*2*44000=176000 bajtów. Efekty dźwiękowe do sensownej gry mogą wymagać dziesiątek megabajtów na dysku, o zapotrzebowaniu na pamięć operacyjną (skądyś trzeba je odgrywać) nie wspominając. Zwykle szuka się pewnych kompromisów i ogranicza jakość dźwięku na różne sposoby, jednak w dalszym ciągu efekty dźwiękowe są najbardziej (oprócz grafiki) pamięciożerne. Stąd spore często rozmiary plików MOD czy STM, zawierających utwory muzyczne – sama informacja o tym, co i jak grać, zajmuje w nich nie więcej niż kilka procent, cała reszta to samplingi, samplingi i jeszcze raz samplingi.
Właściwie w tej chwili omówiliśmy już wszystkie technologie, jakie są stosowane do generowania dźwięku. Już widzę jak niektórzy się krzywią i myślą „to dziadyga, a MIDI to pies?”
Otóż moi kochani nie, MIDI to nie pies – ale też MIDI znakomicie mieści się w opisanych już technologiach. MIDI bowiem, to definicja sposobu komunikowania się między sobą instrumentów muzycznych, w szczególnym wypadku pozwalająca na wysyłanie z komputera informacji do instrumentu na temat tego, co ma być grane. Plik MIDI zawiera więc listę – czas jaki musi upłynąć, komenda jaką należy wysłać do instrumentu, czas jaki musi upłynąć, komenda… Komendy to zazwyczaj „zagraj na 3 kanale C dwukreślne”, albo „przypisz do szóstego kanału instrument numer piętnaście”. A jak ten dźwięk jest potem odgrywany? Nie zgadniecie. Za pomocą jednej z opisywanych już technologii. Najczęściej stosuje się odgrywanie sampli, zapisanych w pamięci instrumentu, często jest ich kilka dla jednego instrumentu, dzięki czemu lepiej można odtworzyć brzmienie, zmieniające się zazwyczaj trochę z wysokością dźwięku. Tak jest nawet w przypadku Gravisa i UltraMID-a!
Oczywiście życie byłoby zbyt proste, gdyby MIDI nie miało własnych problemów. Jednym z nich jest brak precyzyjnie zdefiniowanego standardu przypisania instrumentów do różnych numerów. Są dwa takie standardy, General MIDI (GM) i Roland – ale ich istnienie bynajmniej nie rozwiązuje sprawy, bo po pierwsze żaden z nich nie został formalnie zaakceptowany, po drugie – ich definicje nie są na tyle precyzyjne, żeby nie można było dokonać ich interpretacji, powodującej, że to co będzie odgrywane nie do końca będzie zgodne z zamierzeniami twórcy. Stąd w grach ciągle jeszcze chętnie korzysta się ze starych, dobrych standardów zapisu muzyki, w których muzyk sam wybiera sample i dobiera je pod kątem potrzebnego brzmienia, a nie opiera się na instrumencie jakim będzie dysponować gracz. Przyszłość należy do MIDI, głównie za sprawą Windows 95, co jest jednak zupełnie osobnym tematem.
Na koniec jeszcze jedna uwaga, obiecana wcześniej. Otóż, choć nie wszyscy zdają sobie z tego sprawę, doszliśmy już do miejsca, w którym nie da się nic zrobić z jakością dźwięku. Ludzkie ucho jest pod tym względem ograniczone – nie jest w stanie usłyszeć dźwięków o częstotliwościach wyższych, niż 20-22 kHz. Teoria mówi, że żeby być w stanie odtworzyć z zadowalającą jakością dźwięk (a właściwie dowolny przebieg zmiennego sygnału), wystarczy do próbkowania użyć częstotliwości dwa razy wyższej, niż najwyższa występująca w sygnale. Stąd 44 kHz, o których była mowa wcześniej, stąd – skoro już z taką właśnie częstotliwością odtwarzamy sygnały – maksymalna możliwa jakość dźwięku.
Borek
<- Uniwersytet Gracza 51 | Uniwersytet Gracza 53 -> |