Eksperymenty z losem, czyli --------------------------- AUTOMAT POLITYCZNY Odpowiednio dobrane algorytmy i uūycie funkcji losowych -- RANDOM, pozwala komputerowi nie tylko walczyź z samym sobā, ale i konstruowaź powaūne modele zjawisk fizycznych, technicznych, chemicznych itd. Modeluje siė pewne rzeczy, których nie da siė zobaczyź w naturze. Na przykīad, co bėdzie, kiedy ulice A i B bėdā jednokierunkowe, a w miejsce ulicy C pojawi siė oōmiopasmowa autostrada? Czy wszyscy pojadā nowā trasā? Czy ulica B opustoszeje? Dobry program, który taki problem bėdzie rozwiāzywaī, jeūeli ma wykonaź symulacjė zbliūonā do ūycia, musi wykorzystywaź w pewnym stopniu generator liczb losowych. Nie wszystkie dziaīania kierowców bėdā logiczne i racjonalne. Stanisīaw Wėsīawski Spróbowaīem wykonaź najprostszy model z uūyciem funkcji losowej. Zaīoūenie jest takie. Przemawia polityk. Dīugo i nudno. Mogė mu zamknāź usta, ale interesuje mnie, jak i co bėdzie mówiī. Mimo filozoficznego wstėpu do tematu nie próbowaīem na razie komplikowaź modelu. Jedynym czynnikiem losowym jest przemówienie. Zaczāīem od Deluxe Painta. Narysowaīem salė z podwyūszeniem na trybunė i z mikrofonami. Wykonaīem fotel z parlamentarzystā i powieliīem go parė razy. Zajāīem siė gīowā kaūdego z nich i zróūnicowaīem owīosienie. Prezydium, siedzāce twarzami do widzów, zostaīo przysīoniėte siateczkā czarnych pikseli. W ten sposób postaź na mównicy jest wyraśniejsza, poprzez pewien rodzaj kontrastu oōwietlenia. Poniewaū czīowiek na mównicy przemawia, trzeba byīo wykonaź parė faz ruchu ust. Po kilku przymiarkach zdecydowaīem siė na trzy takie fazy, które wyciāīem i zapisaīem jako BRUSHE o nazwach p1, p2 i p3. Caīoōź -- "sala" i p1, p2, p3 powėdrowaīa do odpowiednich katalogów dyskietki roboczej "Kino", czyli powrót do programu Director -- patrz MA 2/92, 3/92 i 2/95. Skrypt wyglāda tak: load 4,"df1:obrazki/sala" for n=1 to 3 load n,"df1:obrazki/p";n next n DIM mowa[6] 1 c=?100+100 OPEN 1, "SPEAK:OPT/n/p";c;"/s";c*2 DO slowa DO usta1 write mowa$ DO usta2 goto 1 /usta1: for t=1 to 3 blitdest 4 blit t,0,0,312,232,25,17 display 4 next RETURN /usta2: for t=3 to 1 blitdest 4 blit t,0,0,312,232,25,17 display 4 next RETURN /slowa: for i=1 to 5: mowa[i]=?26+65: next r=?3+1 s=44+(?2*2) for j=r+3 to 6: mowa[j]=s: next RETURN Najpierw (przewidujāc zajėcie trzech buforów przez obraz ust) īadujemy do buforu nr 4 obrazek sali. Potem w pėtli od 1 do 3 īadujemy kolejne obrazki ust do odpowiadajācych ich numerom buforów. Teraz wyjaōnienie ogólne. Czīowiek ma otworzyź usta (3 klatki), coō powiedzieź i zamknāź usta (3 klatki). Poniewaū usta p1 sā przymkniėte, a p3 otwarte, raz bėdā wyōwietlane w kolejnoōci 1, 2, 3, a drugi raz -- 3, 2, 1. Ze wzglėdu na to, ūe model miaī byź najprostszy, a mowa "nieprzewidywalna", zrezygnowaīem z sampli na rzecz syntetycznej mowy Amigi poprzez kierowanie tekstu do SPEAK. Wzorujāc siė na programie profesora Bruszewskiego (MA 2/92, 3/92), postanowiīem pobieraź litery z tablicy ASCII. Gdyby ktoō miaī (w co wātpiė) kīopoty ze znalezieniem tablicy, to najproōciej siėgnāź do firmowego podrėcznika BASIC-a do systemu 1.3, dodatek A. Mówca bėdzie pobieraī losowo znaki z tablicy ASCII od 65 do 90, czyli od A do Z. W Directorze funkcjė RANDOM wywoīuje siė znakiem zapytania i liczbā, np. ?8. Znaczy to w tym wypadku, ūe program wybierze jednā z oōmiu cyfr, od zera do siedmiu. Siedmiu! Chcāc uzyskaź liczby od jeden do osiem, naleūy napisaź ?8+1. Najmniejsza moūliwa to 0+1=1, a najwiėksza 7+1=8, czyli ?26+65 da nam losowe liczby w przedziale od 65 do 90. Wartoōź ta figuruje w koļcowej czėōci skryptu w podprogramie "slowa". Eksperymentujāc na róūne sposoby, doszedīem do przekonania, ūe nie uda mi siė zsynchronizowaź ust z dświėkiem, poniewaū syntetyczna mowa dziaīa doōź wolno. Mamy wiėc schemat: usta -- mowa -- usta i z powrotem w kóīko. Ile liter powinien wymówiź polityk? Od trzech do piėciu. Przy trzech jest szansa na jakieō sīowo, a piėź to juū coō wyraśnie dīuūszego, ale nieprzesadnie. Znak kropki lub przecinka na koļcu sīowa zmienia jego intonacjė. To jest dodatkowy parametr, który moūe byź sterowany. Mamy wiėc maksymalnie piėź liter do odczytania i znak przestankowy. Teraz moūna na poczātku programu zadeklarowaź tablicė MOWA o wielkoōci 6 komórek. W komórki tablicy wprowadzamy numery kodów tablicy ASCII. Caīa tablica, odczytana ze znakiem dolara jako MOWA$, zostanie zrozumiana przez program jako sīowo o szeōciu znakach, których kody ASCII zapisane sā w kolejnych komórkach. Przecinek i kropka majā w tablicy ASCII kody 44 i 46, czyli musimy wprowadziź liczbė 44 lub 46. Moūna to zrobiź przez IF. Np. jeūeli A, to 44, a jeūeli B, to 46. Ja wykonaīem to inaczej: 44+?2*2. Losowanie dwóch liczb daje zero lub jeden. Zero razy dwa to zero, a jeden razy dwa to dwa. W efekcie mamy 44 plus zero lub 44 plus dwa, czyli 46. To jest zmienna "s" w podprogramie "slowa". Zmienna "r" sīuūy do innego celu. W kolejnej pėtli wprowadzamy znaki przestankowe (przecinek lub kropkė). Gdyby sīowo miaīo piėź liter, to znak pojawiīby siė w szóstej komórce. Inaczej mówiāc, īadujemy znak od komórki nr 6. Zmienna "r" losuje, od której komórki powinno to nastāpiź. Ustawiīem to tak, ūe īadowanie znaku moūe nastāpiź od 4., 5. lub 6. komórki tablicy MOWA. Oczywiōcie sā wypadki, gdy pojawi siė trzy razy kropka, ale intonacji to nie szkodzi, a sīowo skraca siė do trzech liter. W ten sposób zaīatwia siė dwie sprawy naraz -- wprowadzanie znaków i skracanie sīów. Syntetyczna mowa ma trzy zasadnicze opcje: rodzaj gīosu, wysokoōź i tempo. Ūeby uzyskaź zmiany losowe, moūna wybieraź róūne parametry wysokoōci gīosu i szybkoōci wymawiania. Zmienna "c" na poczātku programu, steruje parametrami "pitch" i "speed", otwieranego za kaūdym razem urzādzenia SPEAK. Nikt nie wie, poza Amigā, czy sīowo bėdzie wymawiane szybko czy wolno, wysokim gīosem czy niskim, bėdzie krótkie czy dīugie, zakoļczy je kropka czy przecinek. Tyle mam w programie elementów losowych, reszta to "sztywny" automat. W artykule "Silnik jako multimedia" pomieszaī mi siė opis kolejnoōci parametrów BLIT. Muszė wiėc podaź je jeszcze raz: BLIT -- numer banku, z którego pobieramy obraz, X -- numer górnego lewego naroūnika obrazu, Y -- górnego lewego naroūnika obrazu, X -- górnego lewego naroūnika miejsca wklejenia, Y -- górnego lewego naroūnika miejsca wklejenia, szerokoōź wklejanego wycinka, wysokoōź wklejanego wycinka. Parametry x i y podawane sā przy zaīoūeniu, ūe ukīad wspóīrzėdnych rozpoczyna siė zerem w górnym lewym naroūniku. W Deluxe Paint trzeba wīāczyź opcjė ORYGIN UL. Pozostaīe detale zostaīy opisane w artykule o silniku. Oczywiōcie wszystko, co jest potrzebne do uruchomienia SPEAK (Mount List, Narrator Device, Speak Handler), powinno byź wczeōniej zainstalowane w systemie, z którego uruchamiamy nasz program. Po uruchomieniu skryptu w programie Director polityk zaczyna beīkotaź w niezrozumiaīym jėzyku, przypominajācym angielski. Prawym klawiszem myszy moūna mu zamknāź usta i ponownie uaktywniź, a lewym zakoļczyź posiedzenie. Jeūeli jednak zostawimy go w spokoju, moūe mówiź tak dīugo, dopóki pīynie prād. Przy bardziej powaūnym podejōciu do tematu moūna wprowadziź rozgaīėzienia w pracy automatu -- jeūeli powie to, a to, to nastėpuje skok do podprogramu i inna akcja. Moūna na przykīad wprowadziź przerwy na oklaski, wiėcej ruchów na obrazie, np. zasypianie czėōci widowni itd. Taki prymitywny automat daje jednak pole do ciekawych obserwacji -- "mój" czīowiek powiedziaī w pewnym momencie "ajbiem". Oklasków nie byīo.