Digitaalisen äänenkäsittelyn perusteet - kalvot 2010

Post on 30-Oct-2014

463 views 0 download

Tags:

description

Slides (in Finnish) from the course "Fundamentals of Digital Audio Processing".

Transcript of Digitaalisen äänenkäsittelyn perusteet - kalvot 2010

Digitaalisen äänenkäsittelyn perusteet

Jouni Smedjouni.smed@utu.fi

syksy 2010

Yleistä

laajuus: 5 op. (3 ov.) esitiedot: Java-ohjelmoinnin perusteet luennot:

tiistaisin 10–12 salissa β torstaisin 10–12 salissa β

kurssin kotisivu: http://bit.ly/dap_10

Tentit 1(2)

tenttipäivät

1. joulukuussa 2010 (?)

2. tammikuussa 2011 (?)

3. helmikuussa 2011 (?) varmista tenttiaika ja -paikka

http://www.it.utu.fi/opiskelu/tentit/ muista ilmoittautua ajoissa!

Tentti 2(2)

kurssi on myös mahdollista suorittaa sähköisenä tenttinä tenttiluokka PharmaCityssä (1. krs) avoinna arkipäivisin klo 8–20 tenttiaika 4 h (kuten normaalissa tentissä) ajanvaraus max 30 vrk etukäteen verkoitse DÄP-tentti avoinna 29.11.2010–4.3.2011

lisätiedot ja varaukset: https://tenttis.utu.fi

Harjoitustyö 1(2)

vapaaehtoinen yksin tehtävä palautettava 8.12.2010 klo 14:00 mennessä

moodle-sivun kautta arvostelu

hylätty, 1–5 lineaarinen tenttibonus:

1 → ei korotusta…5 → yhden arvosanan korotus

Harjoitustyö 2(2)

tehtävissä Audacity-ohjelmistollasaatavana vapaasti http://audacity.sourceforge.net/

alustana Windows, Mac OS X tai Linux/Unix

tai muulla vastaavalla äänityökalullaesim. SoundForge, AdobeAudition…

Kurssin luentoaikatauluLuento Pvm. Aihe

1. 2.11 ti Johdanto 1(2)

2. 4.11 to Johdanto 2(2)

3. 9.11 ti Voimakkuuteen kohdistuvat operaatiot 1(2)

4. 11.11 to Voimakkuuteen kohdistuvat operaatiot 2(2)

5. 16.11 ti Taajuuteen kohdistuvat operaatiot

6. 18.11 to Aikaan ja aaltomuotoon kohdistuvat operaatiot

7. 23.11 ti Javan ääniohjelmointi 1(2)

8. 25.11 ti Javan ääniohjelmointi 2(2)

Tavoitteet

teoreettinen: ymmärtää äänenkäsittelyyn liittyviä käsitteitä mitä voidaan tehdä

käytännöllinen: ymmärtää operaatioiden vaikutus ääneen mitä pitää tehdä

Mitä ei käsitellä — ainakaan syvällisesti

äänentoistoa akustiikkaa äänittämistä musiikintekoa MIDIä signaaliprosessointia tiivistämistä tiedostoformaattien esitysmuotoa

Kurssin rajapinnat

DÄP

Sisällys 1(3)

1. Perusteita

1. Äänen fysiikkaa

2. Psykoakustiikka

3. Äänen syntetisointi

4. Samplaus ja kvantisointi

5. Tiedostoformaatit

Sisällys 2(3)

2. Äänenkäsittelyoperaatiot

1. Voimakkuus

2. Taajuus

3. Aika

4. Aaltomuoto

5. Operaatioiden ketjuttaminen

Sisällys 3(3)

3. Javan ääniohjelmointi

1. java.applet2. javax.sound.sampled

Lähde- ja lisämateriaalia

Curtis Roads: The Computer Music Tutorial, The MIT Press, 2000

Esa Blomberg & Ari Lepoluoto: Audiokirja, Tapiolan viestintäsuunnittelu, 1991

J. Pekka Mäkelä: Kotistudio, 2. painos, Like-kustannus, 2003

1.1. Äänen fysiikkaa

ääni = väliaineessa etenevä mekaaninen värähtely (aaltoliike), joka saa aikaan kuuloaistimuksen

äänilähde väliaine havaitsija

Ääniaalto

p0

tihentymä(ylipaine)

harventuma(alipaine)

p

Aaltomuoto

jaksollinenaaltomuoto

kohina

Taajuus (frequency)

taajuus, f: aaltojen lukumäärä aikayksikköä kohti

yksikkö: hertsi, Hz = 1/s

t

Aallonpituus ja amplitudi

aallonpituus, : vastaavien pisteiden etäisyys peräkkäisissä aalloissa

amplitudi, A: värähdysliikkeen laajuus

A

Äänen spektri

t

A A

f

A

f

t

A

Vaihe (phase)

Äänen nopeus

v = f riippuu:

väliaineesta lämpötilasta

ilmassa: −10ºC: 325 m/s +10ºC: 337 m/s +20ºC: 343 m/s

eri väliaineissa: vesi: 1480 m/s lasi: 5200 m/s teräs: 5000–5900 m/s puu: 3000–4000 m/s CO2: 259 m/s He: 965 m/s

Äänen mittayksiköitä

ääniteho, Pwatti, Wmittaetäisyys 1 m

äänen intensiteetti, I = P/A teho pinta-alayksikköä kohti

äänenpaine, p = F/A: pascal, Pa = N/m2

mittaetäisyys 1 m

Desibeli (dB)

ilmaisee: kahden suureen keskinäistä suuruutta suureen arvoa suhteessa johonkin

vertailutasoon kahden äänitehon tai intensiteetin suhde:

L = 10 log10(I1/I0) dB

missä I0 on viitetaso

huom! mitta-asteikko on logaritminen

Desibeli äänen mittana

usein viitetasona käytetään ihmisen

kuulokynnystä: I0 = 10−12 W/m2

ihmisen kuuloaistimus on logaritminen3 dB:n muutos on havaittavissa10 dB:n muutos kuulostaa

äänenvoimakkuuden kaksinkertaistumiselta tai puolittumiselta

1.2. Psykoakustiikka

äänihavaintoon vaikuttavatkuuloaistin fysiologiaaivojen tulkinta

Äänenvoimakkuuden aistinta

riippuu: äänenpaineesta taajuudesta

kuuloalue: 20 Hz–20 kHz herkimmillään 3–4 kHz:ssä

äänenvoimakkuus eli äänenpaineen taso (sound pressure level): dBSPL = 20 log10(p1/p0)

p0 = 20 Pa

Fletcher-Munson -käyrästö

taajuus (Hz)

ään

enpa

ine

taso

(d

B)

KUULO-KYNNYS

Dynamiikka-alue

-20

0

20

40

60

80

100

120

140

31,5 63 125 250 500 1 k 2 k 4 k 8 k 16 k

tuntoaistimuskipuraja

kuulokynnys

epämiellyttävyydenkynnys

ääne

npai

neta

so (

dB)

taajuus (Hz)

Äänenpainetasoja150140130120110100

9080706050403020100

dB

kuulokynnyskaiuton huonelehtien havina

kuiskaus (3 m)klassinen musiikki ppp

keskustelu (3 m)luento (3 m)

paineilmapora (15 m)

klassinen musiikki fff meluisa tehdas

meluisa katu

henkilöauton sisällätelevisio (3 m)

suihkukone (5 m)

hiljainen talo

myymälä

asumalähiö yöllä

kipuraja

Aivojen äänihavainto

tarkka äänimuisti on erittäin lyhyt: 1–2 s on helppo kuulla sitä mitä haluaa on helppo olla kuulematta epätärkeinä pidettyjä

ääniä Haasin ilmiö: useita yhtäläisiä äänilähteitä

kuunnellessa lähin määrää havaitun äänensuunnan kriittiset taajuuskaistat: ei havaita yksittäisiä

taajuuksia vaan taajuuskaistoja, joissa voimakas ääni voi peittää kaistan hiljaisemmat äänet

Sävelkorkeus (musical pitch)

nuotin sävelkorkeus: suhteessa taajuuteen voimakkuus voi vaikuttaa madaltavasti

standardi sävelkorkeus: 440 Hz = A oktaavi (octave) = taajuuden kaksinkertaistus

siis 220 Hz = A, 880 Hz = A jne. puolisävelaskeleen (semitone) taajuussuhde =

122:1 1,06:1

Nuottien taajuudetNuotti Taajuus (Hz)A 440

G# 415

G 392

F# 370

F 349

E 330

D# 311

D 294

C# 277

C (keski-C) 262

h 247

a# 233

a 220

Äänilähteiden taajuusalueita

Äänilähde Taajuusalue (Hz)

naislaulaja 250–1000

mieslaulaja 100–350

huilu 250–2500

fagotti 60–600

alttosaksofoni 125–650

trumpetti 200–1000

viulu 200–3500

sello 70–600

piano 30–4000

kirkkourut 15–8000

ksylofoni 700–4000

Sointiväri (timbre)

erottaa äänilähteet toisistaan syyt:

yläsävelet (harmonics) perustaajuuden harmonisia

monikertojaaluke (starting transients)

äänen alkaessa esiintyviä, ei-harmonisia taajuuksia

kestävät 0,01–0,2 s

1.3. Äänen syntetisointi

olemassa olevien äänten jäljittely keinotekoisten äänten luonti

Menetelmiä

aaltomuototaulukkosynteesi (wavetable) vähentävä (subtractive) synteesi lisäävä (additive) synteesi FM-synteesi (frequency modulation)

Aaltomuototaulukkosynteesi

samplataan äänilähdettä eri taajuuksilla aaltomuototaulukko

mikäli haluttua taajuutta ei löydy taulusta, interpoloidaan aaltomuoto

f1 f2 f3 f4 fn

f3.5

Vähentävä synteesi

lähtöaaltomuodossa paljon yläsäveliä lopullinen sointiväri saadaan suodattamalla

pois taajuuksia

f f

Lisäävä synteesi

summataan yhteen eritaajuisia, amplitudisia ja vaiheisia siniaaltoja

FM-synteesi

moduloidaan kantoaallon taajuutta toisella aallolla

muokataan lopullisen aaltomuodon amplitudia verhokäyrällä

f f

Ääniaaltoja

siniaalto (sine wave) kanttiaalto (square wave)

kolmioaalto (triangular wave) saha-aalto (saw wave)

valkoinen kohina (white noise)

1.4. Samplaus ja kvantisointi

AD-muunnos: analogisesta digitaaliseksi DA-muunnos: digitaalisesta analogiseksi digitaalisen esitysmuodon etuja:

kopioitavuuskohinan vähyysmuokattavuus

Analoginen ääniketju

Levysoitin

Urat levynpinnassa

Esivahvistin

Heikko sähköinensignaali

Vahvistin

Hiemanvahvistettusignaali

Kovaääninen

Vahvistettusignaali

Ilmanpaineenvaihtelu (ääni)

Digitaalinen ääniketju

Vahvistin

Analoginensignaali

Kovaääninen

Vahvistettusignaali

Ilmanpaineenvaihtelu (ääni)

DA-muunnin

Digitaalinensignaali

CD-soitin

Binääri-numerot

AD-muunnos

hetkellä t mikrofonin kalvon poikkeama on x(t)

kaksi ongelmaa: t:n diskretisointi: samplaus x(t):n diskretisointi: kvantisointi

kaksi approksimaatiota! x(t)

i0, i1, i2,..., im

Samplaus (sampling) eli näytteistys

Aliasointi eli liian matala samplaustaajuus

Nyquistin taajuus

samplausteoreema:

fs 2 · fmax

jos fmax = 20 kHz, niin fs 40 kHz

huom! taajuudet > fmax voivat silti aiheuttaa aliasointihäiriötä samplauksessaalipäästösuodatusantialiasointi

Kvantisointi (quantizing)

näytearvon pyöristys kokonaislukuun8 bittiä: [-128, +127] 16 bittiä: [-32768, +32767]

Kvantisointi ja dynamiikka

digitaalisen tallennuksen dynamiikka:

toistoalue dB:einä ≈ bittien määrä × 6,11

8-bittinen kvantisointi: 48 dB 16-bittinen kvantisointi: 96 dB 20-bittinen kvantisointi: 120 dB

1.5. Tiedostoformaatit

itsensä kuvaavat (self-describing) hierarkinen rakenne sisältää tietoa esim.

samplaustaajuudestakanavien lukumäärästäkäytetty koodauksestatekijänoikeuksista

raa’at (raw) laiteparametrit ja koodaus kiinnitetty sisältää pelkkää dataa

Tiivistys (compression)

häviötön (lossless) koodauksen vaihto ei hukkaa informaatiota

häviöllinen (lossy) saattaa hukata informaatiota

virh

e

bittien määrä

Yleisiä tiedostoformaatteja 1(2)Tiedostopääte Nimi Kehittäjä(t)

.aiff, .aif Audio Interchange File Format

Apple, Electronic Arts

.au, .snd Sun Audio Sun, NeXT

.mp2, .mp3 MPEG Audio Moving Picture Experts Group

.ogg Ogg Vorbis The Ogg Project

Yleisiä tiedostoformaatteja 2(2)

Tiedostopääte Nimi Kehittäjä(t)

.ra, .rm Real Audio, Real Media

Real Networks

.wav Windows WAVE, RIFF WAVE

Microsoft, IBM

.wma Windows Media Audio

Microsoft

2. Äänenkäsittely

1. Voimakkuus

2. Taajuus

3. Aika

4. Aaltomuoto

5. Operaatioiden ketjuttaminen

Operaatioesimerkkejä 1(2)

voimakkuus

taajuus

Operaatioesimerkkejä 2(2)

aika

aaltomuoto

Operaation osatekijät

operaatio

tulosignaali lähtösignaali

+

operoimaton eli ”kuiva”(dry) signaali

operoitu eli ”märkä” (wet) signaali

vahvistus (gain)

2.1. Voimakkuus

1. Säätö, nosto ja häivytys2. Normalisointi3. Panorointi4. Amplitudin modulointi5. Verhokäyrä6. Kompressointi eli dynamiikan supistaminen7. Limitointi eli tason rajoittaminen8. Särö9. Ekspandointi eli dynamiikan laajentaminen10. Kohinaportti

Äänenvoimakkuuden operaatiot

muokkaavat ääniaallon amplitudia dynamiikka = äänenvoimakkuuden vaihtelu

2.1.1. Säätö, nosto ja häivytys

nosto (fade in) häivytys (fade out)

säätö (control)

2.1.2. Normalisointi

engl. normalizing huippuarvo (maximum peak value) RMS (root mean square) eli tehollisarvo

2.1.3. Panorointi

engl. pan äänikanavien välisen voimakkuuden

säätäminen tasapainotus eli balanssointi (balance)

2.1.4. Amplitudin modulointi

0t

2.1.5. Verhokäyrä

engl. envelope ADSR-verhokäyrä:

kesto(decay)

päästö(release)

pito(sustain)

pitotaso

aluke(attack)

huippu-taso

Verhokäyräesimerkki

2.1.6. Kompressointi eli dynamiikan rajoittaminen

engl. compressing kun tulosignaalin voimakkuus ylittää

annetun kynnystason, tulosignaalin nousu aiheuttaa lähtösignaalissa pienemmän nousun

äänten keskinäinen voimakkusero pienenee huom! compressing ≠ compression

kyse ei ole siis äänidatan tiivistämisestä!

Perusparametreja

kompressiosuhde (compression ratio): tulosignaalin nousu:lähtösignaalin nousuesim. 3:1 = 3 dB:n nousu tulosignaalissa

nostaa 1 dB lähtösignaalia kynnystaso (threshold level): taso jonka

yläpuolella kompressointi alkaa vaikuttaa

Kompressointi

2

4

6

8

10

12

14

2 4 6 8 10 12 14

1:1

2:1

4:18:1:1

kynnystaso

tulo (dB)

lähtö (dB)

Lisäparametreja

tartunta-aika (attack time): aika joka kuluu kynnystason ylityksestä täyteen kompressointiin

päästöaika (release time): aika jossa kynnystason alitus palauttaa signaalin normaaliksi

Kompressointi ja aaltomuoto

alkuperäinen ääni kompressoitu ääni

kompressoitu ja vahvistettu ääni

Käyttötapoja

instrumentin (esim. basso) ”tukevoittaminen”, jolloin se saadaan helpommin esiin muiden äänten seasta

kompressoitu taustamusiikki voidaan miksata voimakkaammaksi ilman että se peittäisi puhetta

kohinan peitto (esim. radiolähetyksissä tai tallennuksessa)

2.1.7. Limitointi eli tason rajoittaminen

engl. limiting estää signaalin voimakkuuden nousun

annettua tasoa suuremmaksi kompressoinnin erikoistapaus:

kompressiosuhde :1

engl. distortion syntyy signaalin leikkautuessa:

muuttaa sointiväriä

2.1.8. Särö

leikkaustaso

alkuperäinen signaali

kova leikkaus pehmeä leikkaus

2.1.9. Ekspandointi eli dynamiikan laajentaminen

engl. expanding kun tulosignaalin voimakkuus alittaa

annetun kynnystason, tulosignaalin lasku aiheuttaa lähtösignaalissa suuremman laskun

Parametreja

ekspansiosuhde (expansion ratio): tulosignaalin lasku:lähtösignaalin lasku esim. 1:3 = 1 dB:n lasku tulosignaalissa laskee

3 dB lähtösignaalia kynnystaso (threshold level): taso jonka

alapuolella ekspandointi alkaa vaikuttaa tartunta-aika (attack time): aika jossa kynnystason

ylitys palauttaa signaalin normaaliksi päästöaika (release time): aika joka kuluu

kynnystason alituksesta täyteen ekspandointiin

Ekspandointi

2

4

6

8

10

12

14

2 4 6 8 10 12 14

1:1

1:21:3 1:

kynnystaso

tulo (dB)

lähtö (dB)

Ekspandointi ja aaltomuoto

alkuperäinen ääni ekspandoitu ääni

Kompandointi 1(2)

alkuperäinen ääni kompressoitu ja vahvistettu ääni

kohina tallennettu ääni

Kompandointi 2(2)

alkuperäinen ääni

ekspandoitu äänitallennettu ääni

2.1.10. Kohinaportti

engl. noise gate ekspandoinnin erikoistapaus:

ekspansiosuhde 1:

Kohinaportin toiminta

portti aukeaa portti sulkeutuu

kohinaa

kynnystaso

t

sign

aalit

aso

Parametreja

kynnystaso (threshold level): taso jonka alapuolella kohinaportti sulkeutuu

tartunta-aika (attack time): aika joka kuluu kynnystason ylityksestä kohinaportin avautumiseen

pitoaika (hold time): aika jonka kohinaportti pysyy auki kynnystason alituksen jälkeen

päästöaika (release time): aika jossa kohinaportti sulkeutuu

Parametrisoidun kohinaportin toiminta

kohinaa

kynnystaso

t

sign

aalit

aso

portti alkaa aueta

portti täysin auki

portti sulkeutuusignaali on allekynnystason

portti pysyy aukikunnes pitoaika onkulunut

pito

aika

2.2. Taajuus

1. Äänenkorkeuden muuttaminen

2. Vibraatto

3. Ekvalisointi eli taajuuskorjaus

4. Taajuussuodatus

2.2.1. Äänenkorkeuden muutos

engl. pitch shift, pitch transpose muutetaan alkuperäisen signaalin taajuutta menetelmät:

keston muuttavanosto nopeuttaa, lasku hidastaalaskennallisesti yksinkertainen

keston säilyttävälaskennallisesti monimutkainen

t

Esimerkki: keston muuttava äänenkorkeuden nosto

t

Esimerkki: keston muuttava äänenkorkeuden lasku

t

t

Esimerkki: keston säilyttävä äänenkorkeuden nosto

f

A

f

A

f

2.2.2. Vibraatto

taajuusmodulointia (FM, frequency modulation)

Modulointitaajuus

< 8 Hz vibraatto > 20 Hz äänenvärin muutos sivukaistat (sidebands), c = kantoaallon

taajuus, m = modulointitaajuus:

f

A

cc - 4m c - mc - 2mc - 3m c + m c + 2m c + 3m c + 4m

m m

2.2.3. Ekvalisointi eli taajuuskorjaus

engl. equalizing, EQ muokkaa taajuusjakaumaa ja siten

äänenväriä jakaa taajuskaistan osiin joita voidaan

korostaa tai vaimentaa

Yksinkertainen taajuuskorjain

f

A

basso(bass)

diskantti(treble)

korostus

vaimennus

Termejä

f

A

kaistanleveys(bandwidth)

keskitaajuus(center frequency)

3 dB

Q-arvo =keskitaajuuskaistanleveys

Taajuuskorjaintyyppejä

graafinen taajuuskorjain (graphic equalizer) parametrinen taajuuskorjain (parametric

equalizer) puoliparametrinen taajuuskorjain

(semiparametric equalizer, quasiparametric equalizer)

Graafinen taajuuskorjain

taajuuskaista jaettu kiinteisiin osiin, joita voidaan korostaa tai vaimentaa

korjainten tiheys:oktaavisuodatin (octave filter):

fn = 2 · fn-1

terssisuodatin (third octave filter): oktaavin kolmasosa

myös muita jakoja ja eri jakojen yhdistelmiä

Esimerkki: taajuuskaistajako

f

A

0

f1 f2 f3 f4 f5

Esimerkkisäätöjäcl

assi

cal

danc

e

rock

pop

larg

e ha

ll

live

f { 60 Hz, 170 Hz, 310 Hz, 600 Hz, 1 kHz, 3 kHz, 6 kHz, 12 kHz, 14 kHz, 16 kHz }

Parametrinen taajuuskorjain

mahdollistaa keskitaajuuden ja kaistanleveyden säädön

jompikumpi säätö on kiinnitetty puoliparametrinen taajuuskorjain

f

A

Parametrinen taajuuskorjain

f

A

keskitaajuus

kaistanleveys

korostus

vaimennus

Subjektiivisia luonnehdintojaHz Taajuusalue Positiivinen

korrelaatioNegatiivinen korrelaatio

20–200 bassotaajuudet jykevyys, potku puuroisuus, kumisevuus

200–500 alemmat keskitaajuudet

täyteläisyys epäselvyys

500–1 500 keskitaajuudet napakkuus peltilaatikkomaisuus

1 500–4 000 ylemmät keskitaajuudet

selkeys, läsnäolon tuntu

rasittavuus, hermostuttavuus

4 000–10 000 diskantti särmä, heleys, kirkkaus

sihinä

10 000–20 000

ylin diskantti erottelevuus, ilmavuus

ohuus

Vinkkejä

keskitaajuudet tärkein alue taustan keskitaajuuksia vaimentamalla

ihmisääni nousee paremmin esiin vaimentaminen on usein parempaa kuin

vahvistaminen ( särö) huminan poisto: vaimenna pois 50 Hz:n

taajuusalue ”päällekkäisten” instrumenttien erottelu:

yhtäsuuret mutta vastakkaiset vahvistukset

2.2.4. Taajuussuodatus

engl. band filtering vaimentaa osan tai osia taajuusalueesta suodatintyyppejä:

alipäästösuodatin (low pass filter) ylipäästösuodatin (high pass filter) kaistanestosuodatin (band rejection filter)

imusuodatin eli kapea kaistanestosuodatin (notch filter)

kaistanpäästösuodatin (band pass filter)

Parametreja

rajataajuus fc (cutoff frequency) jyrkkyys (slope) resonanssi (resonance)

rajataajuuden lähialueen korostaminen

f

A

fc

Taajuussuodattimia

f

A

alipäästö f

A

ylipäästö

f

A

kaistanpäästö f

A

kaistanesto

Wahwah-efekti

rajataajuuden modulointia

f

A

fcfc - m

m

fc + m

m

2.3. Aika

1. Kaiku

2. Kuoroefekti

3. Vaiheistus ja flanger-efekti

4. Kaiunta

5. Nopeutus ja hidastus

Viivästyttäminen (delay)

viiveaika0–20 ms: vaiheistus (phasing) ja flanger-

efekti (flanging)20–50 ms: kuoroefekti (chorus)>50 ms: aito kaiku (echo)

viiveajan modulointi takaisinsyöttö (feedback)

2.3.1. Kaiku

slapback-kaiku viive 25–50 ms

kahdennus (doubling) viive kymmeniä millisekunteja

stereoefektin laajentaminen alkuperäinen ja viivästetty signaali eri kanaviin

kaanon viive temmon mukaan

2.3.2. Kuoroefekti

moduloitu viive (>15 ms) peruskuoroefekti

viive 20 ms ei takaisinsyöttöä tasamäärä signaaleja hieman viiveajan modulointia

ADT-efekti (automatic double tracking) viive 30–40 ms vähän viiveajan modulaatiota

2.3.3. Vaiheistus ja flanger-efekti

vaiheistus (phasing) lyhyt viiveaika (<10 ms)vähän takaisinsyöttöäei viiveajan modulointia tasamäärä signaaleja

kampasuodatinilmiö (comb filter effect)

Kampasuodatinilmiö

A

f

Flanger-efekti

flanger-efekti (flanging) lyhyt viive (<50 ms)moduloidaan viivettä kampasuodatin liikkuu edestakaisin taajuusalueen yli

2.3.4. Kaiunta

engl. reverb(eration) jäljittelee tilan akustiikasta syntyvää

jälkikaiuntaa tekee äänestä luonnollisemman kuuloista

1000–3000 erillistä kaikua/s

Äänen ajallinen jaottelu

suora ääni ensiheijastumat

seinät, lattia, katto20–200 ms

jälkikaiunta: kaiut tihenevät vaimentuvatmataloituvat

Kaiunta tilassa

Kaiunnan osat

t

A

ensiheijastumat(early reflections)

jälkikaiunta(reverberation)

esiviive(predelay)

ensiheijastumienkesto

jälkikaiunnankesto (decay)

heräteääni(impulse)

Perusparametreja

tilan koko (volume) tilan tyyppi (type) äänilähteen sijainti havainnoijan sijainti

Kaiuntatilatyyppejä 1(2)

kirkas (bright)pinnat heijastavat ääntäesim. kylpyhuone, tyhjä luentosali

vaimentava (damping)pinnat absorboivat ääntäesim. vaatekomero, täysi luentosali

Kaiuntatilatyyppejä 2(2)

todelliset akustiset tilat, esim.huone (room)halli (hall)kammio (chamber)

mekaaniset kaiuntalaitteet jousikaiunta (spring reverb) levykaiunta (plate reverb)

Parametreja 1(2)

ensiheijastusten voimakkuus ja viivevoimakkuus: heijastuspinnan materiaaliviive: tilan koko

< 5 ms: pieni huone10–20 ms: konserttisali

ensiheijastusten määrä ja tiheys (diffusion)mitä enemmän heijastavia pintoja, sitä

enemmän diffuusiota

Parametreja 2(2)

korkeiden taajuuksien vaimeneminen riippuu heijastuspintojen materiaalista

jälkikaiunta-aika (reverberation time, RT)RT60: aika jossa jälkikaiunta on

vaimentunut 60 dBhuonetiloissa lyhyt (1–3 s) käytävissä ja luolissa pitkä (5–10 s)

Portitettu kaiunta (gated reverb)

t

A

kohinaportinkynnystaso

Käänteinen kaiunta (reverse reverb)

t

A

2.3.5. Nopeutus ja hidastus

engl. time scaling, time strecth menetelmät samoja kuin keston

säilyttävässä äänenkorkeuden muutoksessa eri algoritmeja erityyppisille äänille 75–115 %:n keston muutokset melko

häiriöttömiä suuret muutokset alttiita häiriöille (esim.

kaiku, pätkintä)

2.4. Aaltomuoto

1. Uudelleensamplaus

2. Uudelleenkvantisointi

3. Perustason korjaus

4. Aaltomuodon kääntäminen

5. Aaltomuoden invertointi

6. Aaltomuodon muokkaus

7. Miksaus

2.4.1. Uudelleensamplaus

engl. resampling näytearvojen interpolointi: poistettujen

arvojen paikkaus tai uusien mukauttaminen antialiasointi (anti-aliasing): estää

Nyquistin taajuuden ylittävien taajuuksien muuttumisen häiriöksi

Esimerkki: uudelleensamplaus alaspäin

t

A

Esimerkki: uudelleensamplaus ylöspäin

t

A

2.4.2. Uudelleenkvantisointi

engl. requantization dither-prosessointi (dithering): generoidaan

kohinaa, joka kompensoi kvantisoinnissa syntyvää informaatiohukkaakohina ”heittelee” bittejä

kvantisointirajan kummallekin puolelle

Esimerkki: uudelleenkvantisointi

A

t

2.4.3. Perustason korjaus

2.4.4. Aaltomuodon kääntäminen

2.4.5. Aaltomuodon invertointi

2.4.6. Häiriönpoisto

rapinanpoisto (click removal) tasataan signaalin äkkinäisiä piikkejä

kohinanpoisto (noise removal)otetaan näyte taustakohinastapoistetaan kohina signaalistasaattaa synnyttää uusia häiriöitä

2.4.7. Aaltomuodon muokkaus

leikepöytä leikkaa, kopioi, liitä

alueiden poistaminen trimmaus

hiljaisuuden lisääminen

2.4.7. Miksaus

miksaus (mixing)kahden äänilähteen yhdistäminen

ristivaihto (crossfade)yhden äänilähteen (lineaarinen) vaihto

toiseksi

2.5. Operaatioiden ketjuttaminen

operaatioiden suoritusjärjestys vaikuttaa lopputulokseen, esim. kompressointi saattaa nostaa esiin muiden

operaatioiden luomaa kohinaa kaiunta muuttaa sekä taajuusjakaumaa että

dynamiikkaa yleisohje: kompressointi taajuuskorjaus särö

taajuuskorjaus kuoroefekti kohinaportti kaiunta

parasta kuitenkin pitää korvat auki ja tehdä operaatiot siinä järjestyksessä mikä kuulostaa parhaalta

3. Javan ääniohjelmointi

1. java.applet2. javax.sound.sampled

3.1. java.applet

tarjoaa yleisen, yksinkertaisen ja laitteistoriippumattoman äänipalvelun

käytettävissä: appleteissa (JDK 1.0)sovelluksissa (JDK 1.2)

tukee ääniformaatteja AIFF, AU, WAV, MIDI, RMF

Applet-luokan äänimetodeja

void play(URL url) void play(URL url, String name) AudioClip getAudioClip(URL url) AudioClip getAudioClip(URL url,

String name) static AudioClip newAudioClip(URL

url)

Muita esille tulevia Applet-metodeja

void init() void start() void stop() URL getCodeBase() void showStatus(String msg) String getParameter(String name)

AudioClip-rajapinta

metodit yksittäistoistoon, silmukointiin ja pysäyttämiseen

interface AudioClip { public void play(); public void loop(); public void stop();}

URL-luokka

sijaitsee pakkauksessa java.net getCodeBase-metodilla saadaan appletin

perusosoite, johon lisätään äänitiedoston nimi

osoite luodaan URL-luokan konstruktorillapublic URL(String spec)

throws MalformedURLException poikkeus on käsiteltävä

SimpleAudioApplet.java 1(3)

import java.applet.*;import java.net.*;

public class SimpleAudioApplet extends Applet {

private AudioClip sound = null;

SimpleAudioApplet.java 2(3)

public void init() { try { URL sf = new URL(getCodeBase() + "sound.wav"); sound = getAudioClip(sf); } catch (MalformedURLException e) { showStatus("Cannot load the " + "audio file."); } // try } // init()

SimpleAudioApplet.java 3(3)

public void start() { if (sound != null) sound.play(); } // start()} // class

SimpleAudioApplet.html

... <appletcode="SimpleAudioApplet.class"width=300 height=300>Your browser doesn't support applets.</applet>...

Appletin elinkaari

applettiolio luodaan appletti alustetaan kutsumalla init-metodia appletin suoritus aloitetaan kutsumalla start-

metodia jos appletista poistutaan (esim. vaihdetaan sivua,

minimoidaan selain), kutsutaan stop-metodia kun applettiin palataan takaisin, kutsutaan start-

metodia appettioliota poistettaessa kutsutaan finalize-

metodia

BackgroundMusicApplet.java 1(2)

public void init() { String name = getParameter("BG_MUSIC"); try { String base = getCodeBase() + "snd/"; sound = getAudioClip(new URL(base + name)); } catch (MalformedURLException e) { showStatus("Cannot load audio file ” + name + "."); } // try} // init()

BackgroundMusicApplet.java 2(2)

public void start() { if (sound != null) sound.loop();} // start()

public void stop() { if (sound != null) sound.stop();} // stop()

BackgroundMusicApplet.html

...<appletcode="BackgroundMusicApplet.class"width=300 height=300><param name="BG_MUSIC" value="muzak.wav">Your browser doesn't support applets.</applet>...

Säikeistä

jos äänitiedostot ovat pitkiä, niiden lataaminen kannattaa siirtää taustalle omaan säikeeseen

appletti voi aloittaa suorituksensa heti, eikä sen tarvitse odottaa äänitiedostojen latautumista

säieolio periytyy joko Thread-luokasta tai se toteuttaa Runnable-rajapinnan

AudioApplet.java 1(6)

base = getCodeBase() + "sounds/";for (int i = 0; i < sounds.length; i++) { String fileName = getParameter("SOUND" + i); if (fileName != null) { AudioLoader audioLoader = new AudioLoader(fileName, i); audioLoader.start(); } // if

AudioApplet.java 2(6)

for (int i = 0; i < sounds.length; i++) { Button button = new Button("Sound " + i); button.addActionListener( new ButtonPress(i)); add(button);} // for

AudioApplet.java 3(6)

public void stop() { for (int i = 0; i < sounds.length; i++) if (sounds[i] != null) sounds[i].stop();} // stop() 

AudioApplet.java 4(6)

private class AudioLoader extends Thread { private String fileName; private int finger;

public AudioLoader(String n, int f) { setDaemon(true); fileName = n; finger = f; } // constructor

AudioApplet.java 5(6)

public void run() { try { sounds[finger] = getAudioClip( new URL(base + fileName)); } catch (MalformedURLException e) { showStatus("Cannot load file " + fileName + "."); } // try } // run()} // class

AudioApplet.java 6(6)

private class ButtonPress implements ActionListener { private int soundNumber;

public ButtonPress(int s) { soundNumber = s; } // constructor

public void actionPerformed(ActionEvent e) { AudioClip sound = sounds[soundNumber]; if (sound != null) sound.play(); } // actionPerformed() } // class

AudioApplet.html

...<applet code="AudioApplet.class"width=500 height=100><param name="SOUND0"

value="music0.wav"><param name="SOUND1"

value="music1.wav"><param name="SOUND2"

value="music2.wav">...<param name="SOUND5"

value="music5.wav">Your browser doesn't support applets.</applet>...

Jar-tiedostot

useista luokkatiedostoista koostuvat appletit on syytä koota yhdeksi jar-tiedostoksi

vältetään useiden pienten tiedostojen lataaminen

esim. jar cvf AudioApplet.jar *.class

JarredAudioApplet.html

...<applet code="AudioApplet.class" archive="AudioApplet.jar" width=500 height=100><param name="SOUND0"

value="music0.wav">...<param name="SOUND5"

value="music5.wav">Your browser doesn't support applets.</applet>...

Applet-metodien käyttö sovelluksissa

staattinen metodi newAudioClip palauttaa AudioClip-olionhuom. parametriksi annetaan URL-olio

eikä esim. tiedostokahvavinkki: sovelluksen oletushakemiston

polun saa metodikutsulla System.getProperty("user.dir")

saatua AudioClip-oliota voidaan käyttää normaalisti

AudioApplication.java 1(3)

public class AudioApplication { public static void main(String[] args) { AudioClip[] sounds = new AudioClip[args.length]; String base = "file:" + System.getProperty("user.dir") + "/"; 

AudioApplication.java 2(3)

for (int i = 0; i < args.length; i++) { try { sounds[i] = Applet.newAudioClip( new URL(base + args[i])); } catch (MalformedURLException e) { throw new RuntimeException( "Cannot load audio file " + args[i] + "."); } // try} // for 

AudioApplication.java 3(3)

for (int i = 0; i < sounds.length; i++) { sounds[i].loop(); } // for } // main()} // class

3.2. javax.sound.sampled

mukana JDK-versiosta 1.3 alkaen tarjoaa matalan tason liittymän alustan

äänilaitteistoon (myös havainnointi) pyrkii silti olemaan alustariippumaton ja

yleistettävissä oleva rakennelma mahdollistaa äänisignaalin

vastaanottamisen (esim. äänitys) käsittelyn (esim. vahvistus tai kaiunta) toistamisen

Pakkaukset

javax.sound.sampled rajapintoja ja luokkia samplatun äänisignaalin

tallennukseen, muokkaamiseen ja toistoon javax.sound.midi

rajapintoja ja luokkia MIDI-käyttöön javax.sound.sampled.spi javax.sound.midi.spi

ulkopuolisille palveluntarjoajille (service providers) tarkoitettuja apuluokkia

Piirteitä

pähkinänkuoressa: äänidataa sisältävien tavujen lukua, kirjoitusta ja operointia

liittymät syöttö- (esim. mikrofoni tai tiedosto) ja tuloslaitteisiin (esim. kaiutin tai tiedosto)

äänidatan puskurointi (esim. reaaliaikainen äänivirta)

äänisignaaleiden yhdistäminen käyttäjän komennot: aloita, pysäytä, jatka, lopeta

Äänidatan käsittelytavat

puskuroitu (buffered) virta (streaming): reaaliaikaisen äänidatan

käsittelyä operoitava (esim. äänitettävä tai käsiteltävä)

tavuja likimain samassa tahdissa kuin missä niitä lähetetään

puskuroimaton (unbuffered) äänidata sijaitsee (kokonaisuudessaan)

muistissa monipuolisempi toisto: silmukointi,

aloituspaikan valinta

Äänidatan formaatit 1(2)

dataformaattikertoo kuinka sarja tavuja eli ”raaka”

samplattu äänidata pitää tulkitaAudioFormat-luokka

tiedostoformaattimäärittelee äänitiedoston rakenteen AudioFileFormat-luokka

Äänidatan formaatit 2(2)

vaikka tarjolla on metodeja erilaisten ääniformaattien muuttamiseenyleisten tiedostoformaattien lukemiseen

ja tallentamiseen kyse ei silti ole kaikenkattavasta

äänityökalustapalveluntarjoajilta tukea ja täydennystä

valikoimaan

AudioFormat-luokka

koodaustekniikka (esim. PCM, a-law tai -law) kanavien määrä (1 = mono, 2 = stereo jne.) samplaustaajuus kvantisointitaso (so. käytettyjen bittien määrä) kehystaajuus (frame rate)

kehys (frame) = kaikki tiettyyn hetkeen kuuluva data; (esim. kanavien nykyiset näytearvot)

kehyksen koko tavuina tavujärjestys: big-endian tai little-endian

AudioFileFormat-luokka

tiedostotyyppi (esim. WAVE, AIFF) tiedoston pituus tavuina äänidatan pituus kehyksinä AudioFormat-olio, joka määrittelee

tiedoston sisältämän äänidatan muodon

Java Sound -perusosat

äänijärjestelmä: AudioSystem mikseri: Mixer linja: Line portti: Port

Perusrakenne

lähdelinjat

kohdelinjat

lähdelinjat

kohdelinjatmikserit

Line

AudioSystem

Mixer

Analogia: miksauspöytä

tulosignaalin säätö

taajuuskorjaus

kaiunnan lähtö

panorointi

vahvistus

tulosignaalit lähtösignaali

lähtösignaalinvahvistus

kaiunta-laite

kaiunnanpaluu

Äänijärjestelmä (audio system)

kokoaa yhteen kaikki laitteiston ja ohjelmiston tarjoamat äänipalvelut:mikserit linjatportitäänivirrat tiedostoformaatitääniformaatit

AudioSystem-luokan metodeita

static Mixer.Info[] getMixerInfo() static Mixer getMixer(Mixer.Info info) static Line getLine(Line.Info info) static AudioFileFormat

getAudioFileFormat(File file) static AudioInputStream

getAudioInputStream(File file)

Mikseri (mixer)

abstrahoi äänilaitetta (audio device), esim. äänikortti

saa syötteenä yhden tai useamman äänivirran ja antaa tulokseksi yhden tai useamman äänivirran esim. miksaa kaksi ääntä (syöte) yhdeksi

ääneksi (tulos) voi tukea äänten synkronointia

voi edustaa fyysistä laittetta tai sen ominaisuutta voi edustaa kokonaan ohjelmistolla toteutettua

ominaisuutta

Mixer-rajapinnan metodeita

Line.Info[] getSourceLines() Line.Info[] getTargetLines() Line getLine(Line.Info info) void synchronize(Line[] lines,

boolean maintainSync)

Linja (line)

johtaa joko sisään äänijärjestelmään (tai mikseriin) tai siitä ulos

voi sisältää rinnakkaisia kanavia (mono, stereo) tila: avoin tai suljettu tapahtumat

viestien välitys rekisteröityneille kuuntelijoille voi sisältää säätöjä, esim. vahvistus, panorointi,

kaiunta, toistotaajuus, mykistys mikserit ja portit ovat linjoja periytyminen

Line-rajapinnan metodeja

void open() void close() void addLineListener(LineListener

listener) Control[] getControls() Control getControl(Control.Type control)

Portti (port)

abstrahoi laitteistotason liittymiä äänijärjestelmään, esim. mikrofoni tai kaiutin

Rajapintojen periytymishierarkia

Line

Port Mixer DataLine

SourceDataLine TargetDataLine Clip

Datalinja

assosioi linjan tiettyyn ääniformaattiin puskuroitu: tavuvektori käynnistys ja pysäytys nykyinen sijainti (media position) taso (level): tämänhetkisen signaalin amplitudi tyhjennys (flush): poistaa prosessoimattoman

datan puskuri valutus (drain): odottaa kunnes kaikki

prosessoimaton data on saatu käsiteltyä aktiivisuus: onko linjassa signaalia

DataLine-rajapinnan metodeja

AudioFormat getFormat() int getBufferSize() void start() void stop() int getFramePosition() float getLevel() void flush() void drain() boolean isActive()

Kohdedatalinja

linja josta voidaan lukea dataa mikseri voi toimittaa linjaan dataa esim.

mikrofonista äänitys huom. linja on kohde (target) mikserin

näkökulmasta

Esimerkki: äänitys

TargetDataLine

Mixer

portteja

vahvistus panorointi

TargetDataLine-rajapinnan metodeja

void open(AudioFormat format) int read(byte[] b, int off, int len)

Lähdedatalinja

linja johon voidaan kirjoittaa dataa mikseri voi toimittaa kirjoitetun datan esim.

kaiuttimiin toisto huom. linja on lähde (source) mikserin

näkökulmasta

SourceDataLine-rajapinnan metodeja

void open(AudioFormat format) int write(byte[] b, int off, int len)

Pätkä (clip)

linja johon voidaan ladata dataa ennen toistoa

äänidatan pituus tunnetaan ennen toistoa aloituspaikka voidaan valita vapaasti

toistoa voidaan silmukoida

Esimerkki: toisto

Clip

SourceDataLine

SourceDataLine

Mixer

portteja

kaiunta vahvistus panorointi

Clip-rajapinnan metodeja

void open(AudioInputStream stream) int getFrameLength() long getMicrosecondLength() void setFramePosition(int frames) void setMicrosecondPosition(long

milliseconds) void loop(int count) void setLoopPoints(int start, int end)

Mikserin haku

Mixer.Info-olio sisältää mikserin kuvauksen

pyydetään äänijärjestelmältä lista mikserikuvauksia getMixerInfo-metodilla

valitaan listasta sopiva ja pyydetään sitä getMixer-metodilla

Linjan haku

Line.Info-olio sisältää linjan kuvauksen pyydetään äänijärjestelmältä tai mikserilta

annettua kuvausta vastaava linja getLine-metodilla

käsiteltävä poikkeus LineUnavailableException

porttia tai datalinjaa pyydetään vastaavalla tavalla Port.Info- ja DataLine.Info-olioilla

AudioSystemTest.java 1(2)

import javax.sound.sampled.*; public class AudioSystemTest {

public static void main(String[] args) { Mixer.Info[] mi = AudioSystem.getMixerInfo();

for (int i = 0; i < mi.length; i++) { System.out.println(mi[i]); Mixer m = AudioSystem.getMixer(mi[i]);

AudioSystemTest.java 2(2)

Line.Info[] sli = m.getSourceLineInfo(); for (int j = 0; j < sli.length; j++) System.out.println("source: " + sli[j]);  Line.Info[] tli = m.getTargetLineInfo(); for (int j = 0; j < tli.length; j++) System.out.println("target: " + tli[j]); System.out.println();} } }

Äänivirran haku

pyydetään äänijärjestelmältä AudioInputStream-olio kutsumalla getAudioInputStream-metodia

parametri voi olla File-, URL- tai InputStream-olio

käsiteltävä poikkeukset UnsupportedAudioFileException ja IOException

SimplePlayer.java 1(5)

import java.io.*;import javax.sound.sampled.*; public class SimplePlayer {

public static void main(String[] args) { if (args.length == 0) System.exit(0); File file = new File(args[0]); int loopCount = 0;

SimplePlayer.java 2(5)

if (args.length > 1 && args[1].equals("loop")) { if (args.length > 2) { try { loopCount = Integer.parseInt(args[2]) - 1; } catch (NumberFormatException e) { System.err.println("Ei kokonaisluku: ” + args[2]); System.exit(1); } } else loopCount = Clip.LOOP_CONTINUOUSLY;} // if

SimplePlayer.java 3(5)

try { AudioInputStream source = AudioSystem.getAudioInputStream(file); AudioFormat format = source.getFormat();

DataLine.Info info = new DataLine.Info(Clip.class, format);

if (!AudioSystem.isLineSupported(info)) { System.err.println("Ei sopivaa linjaa."); System.exit(1); }

SimplePlayer.java 4(5)

try { Clip clip = (Clip)AudioSystem.getLine(info); clip.open(source);

if (loopCount == 0) clip.start(); else clip.loop(loopCount);} catch (LineUnavailableException e) { System.err.println("Linjaa ei voi käyttää.");}

SimplePlayer.java 5(5)

} catch (IOException e) { System.err.println( "Virhe tiedoston luvussa."); } catch (UnsupportedAudioFileException e) { System.err.println( "Tuntematon tiedostoformaatti."); } // try } // main()} // class

Linjan kuuntelija

kuuntelija toteuttaa LineListener-rajapinnan

kuuntelija liitetään linjaan addLineListener-metodilla

rajapinnan update-metodi saa parametrina LineEvent-olion, jolta voi tiedustella tapahtuman tyyppiä

LineEvent.Type-tapahtumatyyppejä: OPEN, CLOSE, START, STOP

RandomSequencePlayer.java 1(5)

public class RandomSequencePlayer { private Random random = new Random(); private Clip[] clips; public RandomSequencePlayer(File[] files) { try { AudioInputStream[] sources = new AudioInputStream[files.length]; AudioFormat[] formats = new AudioFormat[files.length]; DataLine.Info[] infos = new DataLine.Info[files.length];

RandomSequencePlayer.java 2(5)

for (int i = 0; i < sources.length; i++) { sources[i] = AudioSystem.getAudioInputStream(files[i]); formats[i] = sources[i].getFormat(); infos[i] = new DataLine.Info(Clip.class, formats[i]); if (!AudioSystem.isLineSupported(infos[i])) { System.err.println("Ei sopivaa linjaa.");

System.exit(1); } // if} // for

RandomSequencePlayer.java 3(5)

try { clips = new Clip[sources.length]; for (int i = 0; i < clips.length; i++) { clips[i] = (Clip)AudioSystem.getLine(infos[i]); clips[i].addLineListener(new Changer()); clips[i].open(sources[i]); }} catch (LineUnavailableException e) { System.err.println("Linjaa ei voi käyttää.");}

RandomSequencePlayer.java 4(5)

public void startRandomClip() { int finger = random.nextInt(clips.length); clips[finger].setFramePosition(0); clips[finger].start();}

public static void main(String[] args) { File[] files = new File[args.length]; for (int i = 0; i < files.length; i++) files[i] = new File(args[i]); RandomSequencePlayer rsp = new RandomSequencePlayer(files); rsp.startRandomClip();}

RandomSequencePlayer.java 5(5)

private class Changer implements LineListener {

public void update(LineEvent e) { if (e.getType().equals(LineEvent.Type.START)) System.out.println("New clip started."); if (e.getType().equals(LineEvent.Type.STOP)) startRandomClip(); }}

Lähdedatalinjan käyttö

varataan puskuriksi byte-taulukko puskurin koko

lyhyt: nopeampi vaste, katkosten riski pitkä: hitaampi vaste, sietää katkoksia

write-metodin kutsu aloittaa toiston (mm. lähettää kuuntelijalle aloitusviestin)

drain-metodi odottaa, kunnes kaikki kirjoitettu data on toistettu

flush-metodi poistaa kirjoitetun datan

SynthPlayer.java 1(5)

import java.io.*;import java.util.*;import javax.sound.sampled.*; public class SynthPlayer { public static void main(String[] args) { float sampleFreq = 44100.0f; int bitsInQuantization = 8; int channels = 1; boolean signed = true; boolean bigEndian = true;  AudioFormat format = new AudioFormat( sampleFreq, bitsInQuantization, channels, signed, bigEndian);

SynthPlayer.java 2(5)

DataLine.Info info = new DataLine.Info( SourceDataLine.class, format); if (AudioSystem.isLineSupported(info)) { try { SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);

int bufferSize = 6 * (int)sampleFrequency; byte[] buffer = new byte[bufferSize]; int twoSecMarker = 2 * (int)sampleFrequency; int fourSecMarker = 4 * (int)sampleFrequency;

SynthPlayer.java 3(5)

Random random = new Random();for (int i = 0; i < twoSecMarker; i++) buffer[i] = (byte)random.nextInt(); int waveLength = (int)sampleFrequency / 440;for (int i = twoSecMarker; i <= (fourSecMarker - waveLength); i += waveLength) { for (int j = i; j < i + waveLength / 2; j++) buffer[j] = Byte.MAX_VALUE; for (int j = i + waveLength / 2; j < i + waveLength; j++) buffer[j] = Byte.MIN_VALUE;} // for

SynthPlayer.java 4(5)

for (int i = fourSecMarker; i <= (bufferSize - waveLength); i += waveLength) { for (int j = i; j < i + waveLength; j++) buffer[j] = (byte)(127.0 * Math.sin( (double)j / waveLength * 2 * Math.PI));} // for 

SynthPlayer.java 5(5)

// Avataan linja ja aloitetaan toisto.line.open(format);line.start();// Kirjoitetaan puskuri linjalle. line.write(buffer, 0, bufferSize);// Odotetaan linjan tyhjentymistä // ennen kuin lopetetaan. line.drain();line.stop();line.close();

Kohdedatalinjan käyttö

varataan puskuriksi byte-taulukko puskurin koon vaikutus kuten

lähdedatalinjassa read-metodin kutsu lukee puskuriin dataa

ja palauttaa sen määrän tavuina drain-metodi odottaa, kunnes mikserissä

oleva data tulee luetuksi flush-metodi poistaa lukemista odottavan

datan (muuten se jää odottamaan mikseriin)

Karaoke.java 1(2)

DataLine.Info infoTarget = new DataLine.Info(TargetDataLine.class, format);DataLine.Info infoSource = new DataLine.Info(SourceDataLine.class, format);if (AudioSystem.isLineSupported(infoTarget) & AudioSystem.isLineSupported(infoSource) { try { TargetDataLine lineTarget = (TargetDataLine) AudioSystem.getLine(infoTarget); SourceDataLine lineSource = (SourceDataLine) AudioSystem.getLine(infoSource);int bufferSize = (int)(bufferLength * format.getFrameSize() * format.getFrameRate());byte[] buffer = new byte[bufferSize];

Karaoke.java 2(2)

lineTarget.open(format, bufferSize);lineSource.open(format);lineTarget.start();lineSource.start(); while (true) { int dataSize = lineTarget.read(buffer, 0, bufferSize); // Tässä kohtaa puskurissa olevalle äänelle // voisi tehdä jotain jäynää... lineSource.write(buffer, 0, dataSize);}

Linjan säätimet (controls)

Control-luokasta periytyy neljä säädintyyppiä: BooleanControl: katkaisin

esim. mykistys (mute) FloatControl: säätökytkin

esim. vahvistus, panorointi EnumControl: valintakytkin

esim. kaiunnan esivalinnat CompoundControl: säädinkokoelma

esim. taajuuskorjain voi olla kokoelma FloatControl-tyyppisiä säätökytkimiä

Säädinten luokkahierarkia

Control

BooleanControl CompoundControlFloatControl EnumControl

Linjan säädinten haku

getControls-metodi palauttaa taulukon linjan tarjoamista säätimistä

isControlSupported-metodi palauttaa onko halutun tyyppistä säädintä tarjolla

getControl-metodi palauttaa pyydetyn tyyppisen säätimen

Säädintyyppejä

BooleanControl.Type.MUTE EnumControl.Type.REVERB FloatControl.Type.MASTER_GAIN FloatControl.Type.PAN FloatControl.Type.SAMPLE_RATE

FloatControl-luokan metodeja

float getValue() void setValue(float newValue) float getMaximum() float getMinimum() float getPrecision() String getMaxLabel() String getMidLabel() String getMinLabel() String getUnits()

ControlPlayer.java 1(3)

boolean gain = false, pan = false, rate = false, mute = false;if (args.length >= 1) { gain = args[1].equals("gain"); pan = args[1].equals("pan"); rate = args[1].equals("rate"); mute = args[1].equals("mute");}float parameter = 0.0f;if (args.length == 3) { try { parameter = Float.parseFloat(args[2]); } catch (NumberFormatException e) { ... }}

ControlPlayer.java 2(3)

clip.open(source);clip.start(); if (gain && clip.isControlSupported( FloatControl.Type.MASTER_GAIN)) { FloatControl gainCtrl = (FloatControl)clip.getControl( FloatControl.Type.MASTER_GAIN); gainCtrl.setValue(parameter);}

ControlPlayer.java 3(3)

if (mute && clip.isControlSupported( BooleanControl.Type.MUTE)) { BooleanControl muteCtrl = (BooleanControl)clip.getControl( BooleanControl.Type.MUTE); muteCtrl.setValue(true);} // if Control[] ctrl = clip.getControls();for (int i = 0; i < ctrl.length; i++) System.out.println(ctrl[i]);

Ääniominaisuuksien käyttöoikeudet

määritelty AudioPermission-luokassa: toistoäänitys

appletti: saa toistaa muttei äänittää sovellus: saa toistaa ja äänittää ohjelmien oikeuksia voidaan muuttaa

Policy Tool ohjelmalla

Mitä käsiteltiin? 1(3)

1. Perusteita

1. Äänen fysiikkaa

2. Psykoakustiikka

3. Äänen syntetisointi

4. Samplaus ja kvantisointi

5. Tiedostoformaatit

Mitä käsiteltiin? 2(3)

2. Äänenkäsittelyoperaatiot

1. Voimakkuus

2. Taajuus

3. Aika

4. Aaltomuoto

5. Operaatioiden ketjuttaminen

Mitä käsiteltiin? 3(3)

3. Javan ääniohjelmointi

1. java.applet2. javax.sound.sampled

Mitkä olivat tavoitteet?

teoreettinen: ymmärtää äänenkäsittelyyn liittyviä käsitteitä mitä voidaan tehdä

käytännöllinen: ymmärtää operaatioiden vaikutus ääneen mitä pitää tehdä

Tentit

varmista tenttiaika ja -paikka http://www.it.utu.fi/opiskelu/tentit/

muista ilmoittautua ajoissa! huomaa myös mahdollisuus sähköiseen

tenttimiseen https://tenttis.utu.fi

Tie tästä eteenpäin

DÄP

MIDI

sekvensserit

moniraitaohjelmat

äänittäminen

säveltäminen

signaaliprosessointi

FFTtiivistäminen

tiedostoformaatit

MPEG

akustiikka

kompleksiluvut

äänentoisto

AD-muunnos

DA-muunnos

olet tässä