Java 3D-audiorajapinnan toteutus 3D-äänen renderöinnin näkökulmasta Markus Kolsi HUT, Tietoliikenneohjelmistojen ja multimedian laboratorio Markus.Kolsi@hut.fi Tiivistelmä Luonnolliselta kuulostavan audiovisuaalisen ympäristön luomiseen tarvitaan äänilähteen, ympäristön tilan sekä kuulijan mallinnusta. Java 3D:n sovellusrajapinta tarjoaa tähän korkean tason menetelmiä. Tarkastelun kohteena ovat äänimaiseman luomisen kannalta keskeisimmät käsitteet sekä Java 3D:n luokat ja metodit. Konkreettisena esimerkkinä on Dopplerin ilmiön mallintaminen Java 3D:llä. Tästä mallinnuksesta saatu tulos oli se, että 3D-ääniympäristön mallintaminen soveltuvasti Java 3D:llä vaatii tarkkuutta ja työtä sekä parametrien asettamista käsin. Dopplerin ilmiön lopputuloksen toimivuudesta on kuulijan vaikea saada täyttä varmuutta. 1 JOHDANTO Äänen fysikaaliset ominaisuudet, ääniympäristön ominaisuudet sekä kuulijan ominaisuudet tulee huomioida audiovisuaalisen ääniympäristön mallintamisessa eli auralisaatiossa. Avaruudessa oleva äänilähde voi olla pistemäinen, suunnattu tai kaikkialla samanlaisena kuuluva taustaääni. Ääniympäristö voi koostua osista, jotka ovat kaikuisia, eri tavoin ääntä heijastavia tai ääntä suodattavia. Kuulijan pään ominaisuudet vaikuttavat esimerkiksi siihen, miten suuntakuulolla havaitaan äänilähteen etäisyys. Java 3D:n audiorajapinta tarjoaa äänilähteen, ääniympäristön ja käyttäjän pään mallintamiseen korkean tason välineitä. Näillä välineillä on mahdollista simuloida muun muassa erilaisia fysikaalisia äänitapahtumia, kuten Dopplerin ilmiötä. Tässä paperissa perehdytään 3D-äänenkäsittelyn perusteiden jälkeen Java 3D:n äänenkäsittelyominaisuuksiin ensin yleisellä tasolla, sitten luokka- ja metoditasolla ja lopuksi läpikäydään Dopplerin ilmiön toteuttamisesta Java 3D:llä saatuja kokemuksia. 2 ÄÄNEN FYSIKAALISET OMINAISUUDET Ääni on pitkittäisinä aaltoliikkeinä eli ääniaaltoina väliaineessa etenevää kuultavissa olevaa painevärähtelyä (Rossing, 1981; Hypermedialaboratorio, 1998). Väliaine voi 1
olla kiinteää, nestemäistä tai kaasua. Ilmassa ääni etenee noin 340 m/s. Syntypisteestään aaltoliikkeenä etenevä ääni otetaan vastaan kuuloaistin avulla, joka aistii äänenpaineen vaihtelua. Painevärähdysten lukumäärä sekunnissa eli äänen taajuus, yksikkönä hertzi (Hz), määrää äänen korkeuden. Ihmisen kuultavissa oleva taajuusalue on 20-20000 Hz (Rossing, 1981). Taajuuden lisäksi äänellä on väri ja voimakkuus. Äänen värin määräävät ääniaaltojen muodot, jotka voivat sisältää yhden tai useampia taajuuskomponentteja (Hypermedialaboratorio, 1998). Äänen voimakkuus määräytyy staattisen ilmanpaineen ja äänenpaineen eron perusteella. Mitä suurempi ero, sitä voimakkaampi ääni. Ihmisen kuulon ominaisuuksista johtuen äänenpaine on logaritminen suure, jota kutsutaan desibeliksi (db). Kuuloaistimuksessa äänekkyyden kaksinkertaistuminen vastaa kymmenen desibelin lisäystä äänen voimakkuuteen. Ihmisen korva erottaa hiljaisimmillaan noin 1 db äänenvoimakkuuden ja voimakkaimmillaan noin 130 db äänen (Hypermedialaboratorio, 1998). 3 3D-ÄÄNENKÄSITTELYN PERUSTEITA Tässä 3D-äänenkäsittelyllä tarkoitetaan 3D-ääniympäristön keinotekoista synnyttämistä ja tämän ympäristön käsittelyä. 3D-ääniympäristön luomiseksi tarvitaan määritellä äänilähde, väliaine sekä äänen havainnoija (Savioja, 1999; Manninen, 2002). Äänen käyttöä datan esitystekniikkana kutsutaan auralisaatioksi. 3.1 Äänilähteen mallinnus Äänilähteen mallintamisella tarkoitetaan äänen liittämistä ympäristöön sekä antamalla sille ominaisuuksia kuten äänen suuntaavuus. Äänilähteen mallinnukseen kuuluu esimerkiksi akustisten soitinten fysikaalisten äänentoistoperiaatteiden mallinnusta. Itse ääni voi olla luonnollista tai synteettistä (Manninen, 2002). 3.2 Väliaineen eli akustisen tilan määrittely Konkreettisesti akustisen tilan määrittelyllä voidaan tarkoittaa sen huoneen mallintamista, jossa äänilähde on. Tällöin tulee mallintaa huoneen vaimennusominaisuudet, ilman absorptio ja kaikuominaisuudet. Äänen käyttäytyminen rajapinnoilla, kuten heijastukset ja diffraktio tulee myös huomioida. Akustisen tilan mallintamiseen on erilaisia laskennallisia malleja, joista eräs hyödyntää säteenseurantamenetelmää. Tässä mallissa tutkitaan huoneen impulssivastetta, josta näkyy suoran äänen, varhaisten heijastusten sekä jälkikaiunnan amplitudit (Savioja, 1999; Manninen, 2002). 2
3.3 Äänen havainnoijan mallintaminen Äänen havainnoijan eli äänen kuulijan mallintaminen tarkoittaa kuulijan fyysisten ominaisuuksien mallintamista. Käytännössä tämä tarkoittaa lähinnä pään kuulemiseen liittyvien ominaisuuksien mallintamista. Tätä tekniikkaa kutsutaan suuntakuuloksi (binaural hearing) ja siihen kuuluu korvien välisen etäisyyden, pään muodon ja materiaalin, aika- ja voimakkuuserojen sekä muiden kuulemiseen liittyvien asioiden mallintaminen (Manninen, 2002). Ihminen havaitsee korvaan saapuvien äänien aikaeron ja voi siitä päätellä äänilähteen sijainnin. Ääni vaimenee esteissä. Pää vaimentaa ääntä, joten voimakkuuseroista voidaan myös päätellä sijainti. Pää ja korvalehdet aiheuttavat suuntariippuvaa suodatusta ja muun kehon osalta etenkin olkapäät vaikuttavat äänen havainnointiin (Manninen, 2002). Usein suuntakuuloäänitykset tehdään niinsanotulla keinopäällä, joka on tehty täysikasvuisen aikuisen pään mittojen mukaan. Pään materiaalit ja muut ominaisuudet pyrkivät jäljittelemään ihmisen pään ominaisuuksia. Suuntaamattomat mikrofonit on sijoitettu korvakäytävän suulle (Maijala, 1999). 4 JAVA 3D:N AUDIORAJAPINTA Tässä luvussa käsitellään ensin yleisellä tasolla Javaa ja Java 3D:tä, sitten perehdytään tarkemmin Java 3D:n 3D-äänenkäsittelyominaisuuksiin ja äänimaiseman luomiseen Java 3D:llä liittyviin seikkoihin. Lopuksi tarkastelu siirretään Java 3D:n niihin luokkiin ja metodeihin, jotka ovat kaikkein oleellisimpia auralisoinnin kannalta. 4.1 Java ja Java 3D pähkinänkuoressa Java on Sun Microsystemsin 1990-luvun puolivälissä julkaisema olio-ohjelmointikieli. Javassa pakkaukset koostuvat luokista, joista alustetaan olioita. Kaikki toiminta Javassa on tarkoitettu oliokeskeiseksi. Olion toiminnallisuuksia suoritetaan metodeilla. Java 3D on kaksi pakkausta sisältävä lisäosa J2SE:iin (Java 2 Standard Edition) eli nykyisin käytössä olevaan Javan versioon. Java 3D sisältää luokkia, jotka soveltuvat 3D-grafiikan ja 3D-äänen käsittelyyn korkealla tasolla. 4.2 3D-äänen toteuttaminen Java 3D:n luokilla Java 3D:n pakkaus nimeltä javax.media.j3d sisältää noin kymmenkunta luokkaa tai rajapintaa, jotka soveltuvat äänen käsittelyyn. Osaa luokista ja niiden metodeista käytetään 3D-ääniympäristön alustamiseen, osa on laitteistokohtaisten toimintojen suorittamiseen ja osa yleisiä äänenkäsittelyyn liittyviä tominnallisuuksia sisältäviä luokkia tai rajapintoja. 3
4.2.1 3D-ääniympäristön alustaminen On mahdollista, että Java 3D -sovelluksella on käytettävinään useampia audiolaiteajureita äänen tuottamiseen. Tällöin sovelluksen tulee valita, mitä audiolaiteajuria käytetään äänen renderöintiin. Kun laiteajuri on valittu, sovellus voi lisäksi valita äänitoiston tyypin, josta renderöity ääni tuotetaan ulos. Toistolaite voi olla joko stereokuulokkeet, kaiutin tai kaiutinpari. Toistolaite on fyysisesti liitetty siihen porttiin, johon valittu laiteajuri tuottaa ääntä. Äänitoiston tyypin valinta vaikuttaa siihen, minkälainen äänikuva luodaan. Kun laite on alustettu, selaimen tai sovelluksen tulee rekisteröidä laite. Laiteajurin alustaminen vaaditaan siitä syystä, että Java 3D:n äänenkäsittelyyn liittyvät metodit saattavat olla laiteajuririippuvaisia. Näitä metodikutsuja voidaan siis suorittaa vasta laiteajurin alustamisen jälkeen (Sun, 2002). 4.2.2 Äänityypin määrittely Java 3D mahdollistaa kolmen eri äänityypin määrittelyn, joille kullekin on omat luokkansa. Nämä äänityypit ovat pisteääni (PointSound), taustaääni (BackgroundSound) sekä kartioääni (ConeSound). Pisteäänellä tarkoitetaan pistemäistä äänilähdettä, joka sijaitsee avaruudessa ja josta ääniaallot kulkevat samalla tavoin kaikkiin suuntiin tästä avaruudessa sijaitsevasta pisteestä. Äänen amplitudi vaimenee sen mukaan, mikä on kuulijan ja äänilähteen välinen etäisyys. Taustaäänellä tarkoitetaan vaimenematonta ääntä, jolla ei ole avaruudellista sijaintia eikä suuntaa. Kartioäänellä tarkoitetaan sellaista äänilähdettä, joka on suunnattu tietyn avaruudessa olevan vektorin suuntaisesti. Kartioäänilähde vaimenee voimakkuuskertoimien ja suodattimien mukaisesti, siten, että vaimennus perustuu etäisyyden lisäksi äänilähteestä kuulijaan suunnatun vektorin ja kartioäänen suuntavektorien väliseen kulmaan (Sun, 2002). 4.2.3 Fyysisen ympäristön määrittely Fyysisen ympäristön määrittelyyn kuuluvat erilaiset audiolaiteajurien ja sensoreiden alustukset ja niiden liittäminen määriteltävänä olevaan fyysiseen ympäristöön. Sensoreiden tarkoitus on kerätä informaatiota keinopäähän ja kehoon liittyen. Sensorit on indeksoitu nollasta eteenpäin ja ne liittyvät pään lisäksi molempiin käsiin (Sun, 2002). 4.2.4 Käyttäjän pään määrittely Käyttäjän pään koordinaatiston origo sijaitsee vasemman ja oikean silmän puolivälissä. X-akseli lähtee origosta oikealle (takaraivon takaa katsottaessa), y-akseli lähtee ylöspäin ja z-akseli menee takaraivon taakse. Käyttäjän pään ominaisuuksien määrittelemiseen kuuluu silmien sijainnin ja korvien sijainnin koordinaattien määrittelemisen 4
lisäksi silmien korkeuden asettaminen maasta sekä käyttäjän pään origon ja näyttöruudun välisen etäisyyden määrittäminen (Sun, 2002). 4.3 Oleellisimmat luokat ja metodit javax.media.j3d-pakkauksessa Tässä kappaleessa kuvataan niitä Java 3D:n luokkia, jotka ovat oleellisimpia 3D-äänen renderöinnissä ja auralisoinnissa. Kun kappaleessa 4.2 kerrottiin Java 3D -auralisointiin liittyvät asiat yleisellä tasolla, mennään tässä kappaleessa luokka kerrallaan keskittyen luokkien metodeihin ja metodien argumentteihin. Erityisesti pyritään keskittymään niihin luokkiin ja niihin metodeihin, joita välttämättä tarvitaan audiolaiteajurien alustamiseen sekä ääniympäristön mallintamisen ja äänilähteen valintaan. Ehkä tärkeimpänä luokkana auralisoinnissa voidaan pitää AuralAttributes-luokkaa, josta muodostettua oliota tarvitaan Java 3D:ssä ääniympäristön ominaisuuksia mallinnettaessa. AurallAttributes määrittelee ympäristöllisiä ääni parametrejä, kuten kaikuja ja heijastuksia, joita käytetään äänen renderöinnissä. 4.3.1 AudioDevice3D ja AudioDevice -luokat Sekä AudioDevice3D että AudioDevice ovat niin sanottuja rajapintaluokkia (interface). AudioDevice3D:n metodit eivät ole tarkoitettu sovelluksen kutsuttaviksi, vaan niitä kutsuu Java 3D Sound Scheduler sen jälkeen, kun sovellus on valinnut Audio- Device3D:n, jossa Java 3D ääni renderöidään (Sun, 2002). AudioDevice3D sisältää kolmattakymmentä metodia, joilla voidaan mm. alustaa, käynnistää, lopettaa, tauottaa sekä mykistää ääni ns. sample:na laitteella. Samoin sample:n auraalisia parametreja voidaan asettaa. Esimerkiksi metodi setangularattenuation(int index, int filtertype, double[] angle, float [] attenuationscalefactor, float [] filtercutoff) asettaa äänen kulmallisen voimakkuusvaimennuksen määrittelemällä taulukot, jotka sisältävät kulma-arvot sekä vaimennuskertoimet ja suodattimen määrättyyn tyyppiin liittyvät taulukkoarvot. Vastaavasti metodi setposition(int index, Point3d position) asettaa määrätyn äänilähteen sijainnin. Metodit setreverbdelay(float reverbdelay) ja setvelocityscalefactor(float velocityscalefactor) puolestaan määrittävät kaikuun kuluvaa odotusaikaa sekä Dopplerin ilmiön soveltamiseen käytettävää nopeusskaalauskerrointa (Sun, 2002). AudioDevice-rajapintaluokka määrittelee auidolaitteen ja kapseloi sisäänsä audiolaitteen perusominaisuudet. Audiolaiteajurin valinta tapahtuu PhysicalEnvironmentluokan oliosta, jota kohti voi olla vain yksi audiolaite. Jokainen audiolaiteajuri täytyy 5
alustaa ennen kuin Java 3D Sound -metodeja kutsutaan, koska Sound-metodien toteutus on yleisessä tapauksessa laiteajuririippuvainen. Esimerkkejä AudioDevice-luokan metodeista ovat muun muassa void setangleoffsettospeaker(float angle), jolla asetetaan pään Z-akselin ja korvien välisestä keskipisteestä kuulijalle suunnatun vektorin välinen kulma radiaaneina sekä void setcentereartospeaker(float distance), jolla asetetaan kaiuttimen ja korvien välisen keskipisteen etäisyys (Sun, 2002). 4.3.2 Soundscape -luokka Soundscape-luokka määrittelee ominaisuuksia ja arvoja, joilla voidaan kuvailla kuulijan ympäristön äänen käyttäytymistä. Näitä ominaisuuksia ovat maiseman kaikuvuus ja muut ympäristölliset ominaisuudet, jotka vaikuttavat äänen renderöintiin äänimaisemassa. Yhteen maisemaan voi liittyä useita erilaisia Soundscape-alueita. Esimerkiksi maiseman yhdessä osassa voi olla laaja avoin alue ja toisessa osassa esim. sankkaa metsää, jossa kaikuu vähemmän. Näin ollen ääni renderöidään eri lailla riippuen siitä, missä osassa maisemaa kuulija itse on. Se, minkä alueen sisällä ympäristössä oleva havainnoija on, määräytyy Java 3D API:n ViewPlatform-luokan oliolla. Luokka sisältää yhdeksän metodia, joilla mm. asetetaan äänimaiseman alueen rajoja sekä Soundscape:een liittyviä auraalisia ominaisuuksia. Esimerkiksi metodilla void setauralattributes(auralattributes attributes) asetetaan Soundscape-oliolle ne auraaliset ominaisuudet, jotka välittyvät tälle metodille argumenttina annettavassa oliossa (Sun, 2002). 4.3.3 Sound-luokka Sound-luokka on ns. abstrakti luokka, joka määrittelee kaikille äänilähteille tyypillisiä ominaisuuksia. Luokan suoria alaluokkia ovat luokat BackgroundSound ja Point- Sound. Jokaiseen äänilähteeseen liittyvät viite äänidataan, aplitudin skaalauskerroin sekä muita äänen kuulumiseen ja toistettavuuteen liittyviä tietoja (Sun, 2002). 4.3.4 Äänityyppiluokat: BackgroundSound, PointSound sekä ConeSound BackgroundSound ja PointSound luokat ovat abstraktin Sound-luokan suoria aliluokkia. Vastaavasti ConeSound on PointSound-luokan aliluokka. BackgroundSound-luokka ei sisällä äänen käsittelyyn liittyviä metodeja. PointSound-luokan kymmenellä metodilla mm. sijoitetaan äänilähde koordinaatistoon sekä asetetaan äänen vaimenemisominaisuuksia. Konstruktoreja on seitsemän, joista alla esimerkkinä konstruktoreista toinen: 6
Kuva 1: Kuvassa aproksimaatio kartioäänilähteen kulmavaimenemisesta. (Sun, 1999) public PointSound(MediaContainer sounddata, float initialgain, float posx, float posy, float posz). ConeSound-luokka määrittelee PointSound-olion, jonka äänilähde on suunnattu tiettyä avaruusvektoria pitkin. ConeSound-luokka sisältää vajaat 20 metodia, joilla käsitellään äänen vaimenemiseen liittyviä ominaisuuksia sekä asetetaan äänilähteen suunnan koordinaatit. Esimerkiksi metodi void setangularattenuation(float [] distance, float [] gain, float [] filter) asettaa kulmavaimennuksen, joka sisältää kulmaetäisyydet, kulmavaimenemisen ja alipäästösuodattimen taajuudet liukulukuarvoina eri taulukoissa, jotka ovat saman kokoisia (Sun, 2002). 4.3.5 AuralAttributes-luokka AuralAttributes-luokka sisältää metodeja ja kenttiä, joilla määritellään auraaliset ominaisuudet, jotka välitetään Soundscape-oliolle. Ominaisuudet käsittävät ympäristöllisiä audio parametreja, jotka vaikuttavat äänen renderöintiin. Näihin ominaisuuksiin kuuluvat mm. voimakkuuskertoimet, äänen nopeuteen ilmassa vaikuttavat asiat ja parametrit, jotka kontrolloivat kaikua, etäisyyden taajuussuodatusta sekä nopeuteen perustuvaa Doppler-ilmiötä. Esimerkiksi kaikutyyppejä voidaan mallintaa esimerkiksi määrittelemällä äänen kaiun paluuaika kuulijalle sekä rajoittamalla jälkikaikujen lukumäärää. 7
Auralisaatiolla tarkoitetaan ääniympäristön mallintamista, jossa ääni on iteratiivisesti heijastuvaa siltä suljetun alueen pinnoilta, jossa kuulija on. Auralisaation komponentteihin kuuluu eriasteisia heijastuksia sekä kaikuja. Java 3D:n (J3D 1.3) yksinkertaisessa auralisaatio-mallissa on neljä parametriä, jotka aproksimoivat äänen heijastusta ja kaikuja tietyssä kuuntelutilassa (Sun, 2002). Nämä neljä parametriä ovat: 1. heijastuskerroin, joka kertoo heijastusten voimakkuusvaimenemisen kaikilla taajuuksilla 2. kaiun odotusaika, joka ilmaisee kuinka kauan äänen kaiulta kestää saavuttaa kuulija 3. kaikutilan rajat, joka aproksimoi sen alueen tilavuuden, jolla kuuntelija on 4. kaikujärjestys, jolla voidaan tarvittaessa rajoittaa äänen rekursiivisten heijastusten lukumäärää kaikutilassa kaikulaskujen aikana (Sun, 2002). AuralAttributes-luokka sisältää parisenkymmentä metodia, joilla hallitaan yllä mainittuja asioita. Esimerkkinä metodista on Doppler-ilmiön laskennassa käytettävä void setvelocityscalefactor(float velocityscalefactor), jolla voidaan myös liioitella Dopplerin ilmiötä (Sun, 2002). 4.3.6 PhysicalEnvironment ja PhysicalBody -luokat PhysicalEnvironment-luokka sisältää metodeja fyysisen ympäristön määrittelyyn. Luokassa on reilu parikymmentä metodia, joilla mm. lisätään ja alustetaan audiolaiteajureita sekä asetetaan sensoreita päähän ja käsiin. Esimerkiksi metodi void setaudiodevice(audiodevice device) asettaa määritetyn AudioDevice-olion siksi laitteeksi, jonka kautta äänen renderöinti tälle PhysicalEnvironment-oliolle tapahtuu. Metodi void setheadindex(int index) puolestaan asettaa pään järjestysnumeron vastaamaan sensorin järjestysnumeroa. PhysicalBody-luokka sisältää käyttäjän pään määritelmät. Luokalla on kolme konstruktoria, joista oletuskonstruktori on argumentiton sisältäen ikään kuin tehdasparametrit käyttäjän päästä. Toinen konstruktoreista antaa mahdollisuudet määritellä koordinaatit vasemmalle ja oikealle silmälle. Kolmas konstruktori antaa silmien sijainnin lisäksi määritellä vasemman ja oikean korvan sijainnin: Physicalbody(Point3d lefteyeposition, Point3D righteyeposition, Point 3D leftearposition, Point3D rightearposition). Luokassa on 15 metodia, jotka kaikki liittyvät silmien ja korvien sijaintiin liittyvien tietojen käsittelyyn sekä käyttäjän pää -koordinaatiston muunnoksiin (Sun, 2002). 8
5 DOPPLERIN ILMIÖN TOTEUTTAMINEN JAVA 3D:N AU- DIORAJAPINTAA HYÖDYNTÄEN Dopplerin ilmiöllä äänen yhteydessä tarkoitetaan sitä, kun äänilähteen tai äänen havainnoijan ollessa liikkeessä, havaittu äänen taajuus muuttuu. Mikäli äänilähde ja havainnoija liikkuvat toisiaan kohti, havaittu taajuus kasvaa. Mikäli lähde ja havainnoija etääntyvät toisistaan, taajuus laskee. Asia voidaan ilmaista seuraavalla kaavalla: v±v f =f h l v±v l, jossa f on havaittu taajuus, f l on äänilähteen taajuus, v on äänen nopeus, v h on havaitsijan nopeus ja v l on lähteen nopeus. Java 3D:n audiorajapinta tarjoaa korkean tason menetelmiä Dopplerin ilmiön esittämiseen (Rossing, 1981). 5.1 Doppler-esimerkin tapahtumien kuvailu Doppler-esimerkissä pistemäinen äänilähde liikkuu suoraa pitkin XYZ-koordinaatistossa XY-tasossa äänen havainnoijan ollessa paikallaan. Käytettävä ääninäyte muistuttaa urkupillin ääntä. Liikkuessaan koordinaatistossa pistemäinen äänilähde soittaa ääninäytteen, jolloin äänen havainnoija huomaa hienoisen muutoksen äänen taajuudessa. Lisäksi havaitaan etäisyysvaimeneminen sekä äänen suunta, kun äänilähdettä liikutetaan syvyyssuunnassa. 5.2 Esimerkin toimintaympäristö ja muut vaatimukset Esimerkki vaatii toimiakseen J2SE:n sekä siihen liittyvän Java 3D:n asennettuna. Samoin 3D-äänen kuulemiseen tarvitaan sopivat kuulokkeet tai kaiuttimet ja koneeseen toimiva äänikortti. Esimerkkiä on testattu muun muassa Niksulan O2:lla, joilla on toimiva Java 3D -ympäristö. Käännös tapahtuu komennolla javac Doppler.java ja sovelluksen ajaminen komennolla java -green Doppler Ehdottoman tärkeää Niksulan O2:lla testattaessa on käyttää parametriä -green, koska ilman ns. green threadien käyttöä ohjelma kaatuu välittömästi ajon aikana. 5.3 Java 3D:n Dopplerin ilmiöön liittyvät metodit ja alustukset Tärkeimmät metodit Dopplerin ilmiön toteuttamisen kannalta Java 3D:ssä ovat AuralAttributes-luokan metodit setfrequencyscalefactor(float frequencyscalefactor) ja setvelocityscalefactor(float velocityscalefactor). frequencyscalefactor joka painottaa tai vaimentaa Doppler-ilmiötä VelocityScaleFactor on oltava muu kuin 0, koska 9
0 poistaa Doppler ilmiön käytöstä. Sopivia arvoja lienee 3 ja 3, jolloin molemmat ovat kolminkertaiset normaaliin fysikaaliseen Dopplerin-ilmiöön nähden, joten vaikutus on selvästi havaittavissa. Seuraavat auralisaatioon liittyvät alustukset tulee vähintään tehdä Java 3D:ssä Dopplerin ilmiön esittämiseksi. auraalisten ominaisuuksien asettaminen AuralAttributes dattributes = new AuralAttributes( ); /** * Asetetaan äänen taajuudesta johtuvan * Dopplerin ilmiön vaikutus kaksinkertaiseksi. * Nopeusskaalauskerroin 1 vastaa reaalimaailman * tilanneta. */ dattributes.setfrequencyscalefactor(2.0f); dattributes.setvelocityscalefactor(1.0f); SoundScape:n luominen Soundscape dscape = new Soundscape( ); dscape.setauralattributes(dattributes); sovelluksen tilarajojen asettaminen BoundingSphere dbounds = new BoundingSphere(new Point3d( ),500.0); dscape.setapplicationbounds( dbounds ); 6 Yhteenveto Java 3D tarjoaa monipuoliset välineet 3D-äänenkäsittelyyn. Äänenkäsittelyyn liittyvät luokat ja metodit ovat hyvin dokumentoituja, joskin niiden ymmärtämiseen ja soveltamiseen täytyy varata runsaasti aikaa. Äänilähteen, ääniympäristön ja kuulijan päähän liittyvät ominaisuudet ovat pitkälti parametrisoitu, joten halutut auraaliset ominaisuudet voidaan valita joiltain osin hyvinkin tarkkaan. Erityisesti erilaiset vaimenemiset, kaiut ja äänen suuntaavuuteen liittyvät arvot ovat tarkkaan valittavissa. Java 3D tarjoaa myös erikoisesti Dopplerin ilmiön esittämiseen liittyviä korkean tason metodeja. Ääniympäristön kaiku-, vaimenemis- ja suodatusominaisuuksien testaaminen onnistuu suhteellisen helposti ja yksinkertaisella koodilla. Erilaisia konkreettisia ääniympäristöjä, kuten kylpyhuonetta, autotallia ja vankityrmää kyetään mallintamaan äänen heijastus- ja kaikuparametrejä muuttamalla. Korvakuulokkeilla ääninäytteitä kuulemalla havaitaan selvät taajuusmuutokset sekä kaikuja. Dopplerin ilmiön simuloiminen osoittautui astetta vaikeammaksi kuin erilaisten akustisten tilojen yksinkertainen mallinnus. Huomioon tuli ottaa äänilähteen liikkuminen ja fyysisen tilan mallintaminen siten, että äänilähde liikkui järkevästi tilan sisällä. Samoin ongelmaksi muodostui erottaa itse akustisesta tilasta johtuvat heijastukset, 10
vaimenemiset ja suodatukset siitä äänen taajuuden muutoksesta, joka johtui puhtaasti Dopplerin-ilmiöstä. Dopplerin ilmiötä liioiteltaessa saatiin lopulta kuitenkin vakuuttavaa näyttöä siitä, että se toimii; äänessä kuitenkin esiintyi ajoittain säröjä, joiden syitä ei pystytty selvittämään. Teorian ymmärtämisen lisäksi 3D-äänimaiseman luominen Java 3D:llä vaatii riittävää ohjelmointitaitoa ja perinpohjaista tutustumista Java 3D API:iin 3D-ääniluokkien osalta. Helposti joku monista huomioon otettavista asioista ääniympäristön alustuksessa unohtuu, joten seurauksena on se, että mitään ääntä ei kuulu, vaikka koodi muuten näyttää toimivan moitteetta. Erityisesti Dopplerin ilmiötä testattaessa on varmistuttava siitä, että velocityscalefactor ei ole 0. Parametrien säätämistä joutuu kuitenkin tekemään käsin sekä yrityksen ja erehdyksen kautta, joten riittävää kärsivällisyyttä ja aikaa tarvitaan hiemankin monimutkaisemman 3D-ääniympäristön auralisointiin. Akustiikan perusteiden hallitsemisesta on apua. VIITTEET Hypermedialaboratorio Tampereen yliopisto. 1998. Musiikkiteoriaa. Musiikkitutkimuksen laitos. http://www.uta.fi/mute/aai01.htm [viitattu 19.12.02]. Maijala Panu. 1999. Tulevaisuuden audiovisuaalinen viihdepalvelu koteihin. Sähkö- ja tietoliikennetekniikan osasto, TKK. http://www.hut.fi/~pantse/papers/tvt/indextitle.html [viitattu 19.12.02]. Manninen Tony. 2002. Luentorunko osa 4: Kuuloaisti, äänenkäsittelytekniikat. Tony Manninen. http://www.tol.oulu.fi/~tmannine/vrt/vrtluennotk02osa4.pdf [viitattu 19.12.02]. Rossing Thomas D. 1981. The Science Of Sound. Addison-Wesley. Savioja Lauri; Huopaniemi Jyri; Lokki Tapio; Väänänen Riitta. 1999. Creating Interactive Virtual Acoustic Environments. Audio Engineering Society, Inc. Sun Microsystems (ed). 1999. Java 3D API Specification. Sun Microsystems. http://java.sun.com/products/javamedia/3d/fordevelopers/j3dguide/j3dtoc.doc.html [viitattu 27.1.2003]. Sun Microsystems (ed). 2002. Java 3D API <http://java.sun.com/products/javamedia/3d/fordevelopers/j3d12api/jdapi/> [viitattu 19.12.02]. Sun Microsystems. Java 3D API. 11