SlideShare una empresa de Scribd logo
1 de 236
Digitaalisen äänenkäsittelyn
perusteet
Jouni Smed
jouni.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-ohjelmistolla
 saatavana vapaasti
http://audacity.sourceforge.net/
 alustana Windows, Mac OS X tai
Linux/Unix
 tai muulla vastaavalla äänityökalulla
 esim. SoundForge, AdobeAudition…

Kurssin luentoaikataulu
Luento 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.applet
2. 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
p

p0

tihentymä
(ylipaine)

harventuma
(alipaine)
Aaltomuoto

jaksollinen
aaltomuoto

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
A

A
t

f

A

A
t
f
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, P
 watti, W
 mittaetä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 logaritminen
 3 dB:n muutos on havaittavissa
 10 dB:n muutos kuulostaa
äänenvoimakkuuden
kaksinkertaistumiselta tai puolittumiselta
1.2. Psykoakustiikka


äänihavaintoon vaikuttavat
 kuuloaistin fysiologia
 aivojen 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
äänenpainetaso (dB)

Fletcher-Munson -käyrästö

KUULOKYNNYS

taajuus (Hz)
Dynamiikka-alue
140

äänenpainetaso (dB)

120

tuntoaistimus

kipuraja

100
80

epämiellyttävyyden
kynnys

60
40
20

0

kuulokynnys

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

taajuus (Hz)
Äänenpainetasoja
dB

suihkukone (5 m)

klassinen musiikki fff
paineilmapora (15 m)
televisio (3 m)
luento (3 m)
keskustelu (3 m)
klassinen musiikki ppp
kuiskaus (3 m)
lehtien havina

150
140
130
120
110
100
90
80
70
60
50
40
30
20
10
0

kipuraja
meluisa tehdas
meluisa katu
henkilöauton sisällä
myymälä
asumalähiö yöllä
hiljainen talo
kaiuton huone
kuulokynnys
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 =
12 2:1
1,06:1
Nuottien taajuudet
Nuotti

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
fagotti
alttosaksofoni

250–2500
60–600
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 monikertoja
 aluke (starting transients)
 äänen alkaessa esiintyviä, eiharmonisia 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



f1

samplataan äänilähdettä eri taajuuksilla
aaltomuototaulukko
mikäli haluttua taajuutta ei löydy
taulusta, interpoloidaan aaltomuoto
f2

f3

f4

f3.5

fn
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
valkoinen kohina (white noise)

siniaalto (sine wave)

kanttiaalto (square wave)

kolmioaalto (triangular wave)

saha-aalto (saw wave)
1.4. Samplaus ja kvantisointi
AD-muunnos: analogisesta digitaaliseksi
 DA-muunnos: digitaalisesta analogiseksi
 digitaalisen esitysmuodon etuja:
 kopioitavuus
 kohinan vähyys
 muokattavuus

Analoginen ääniketju
Levysoitin

Urat levyn
pinnassa

Esivahvistin

Heikko
sähköinen
signaali

Vahvistin

Hieman
vahvistettu
signaali

Vahvistettu
signaali

Kovaääninen

Ilmanpaineen
vaihtelu (ääni)
Digitaalinen ääniketju
CD-soitin

Binäärinumerot

DA-muunnin

Digitaalinen
signaali

Vahvistin

Analoginen
signaali

Vahvistettu
signaali

Kovaääninen

Ilmanpaineen
vaihtelu (ääni)
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ä samplauksessa
 alipäästösuodatus
 antialiasointi
Kvantisointi (quantizing)


näytearvon pyöristys kokonaislukuun
 8 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.
 samplaustaajuudesta
 kanavien lukumäärästä
 käytetty koodauksesta
 tekijä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

virhe



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.
2.

3.
4.
5.

Voimakkuus
Taajuus
Aika
Aaltomuoto
Operaatioiden ketjuttaminen
Operaatioesimerkkejä 1(2)
voimakkuus

taajuus
Operaatioesimerkkejä 2(2)
aika

aaltomuoto
Operaation osatekijät
operoitu
eli ”märkä”
vahvistus
(wet) signaali (gain)

operaatio

+

tulosignaali

lähtösignaali
operoimaton
eli ”kuiva”
(dry) signaali
2.1. Voimakkuus
1.
2.
3.
4.
5.
6.

7.
8.
9.

10.

Säätö, nosto ja häivytys
Normalisointi
Panorointi
Amplitudin modulointi
Verhokäyrä
Kompressointi eli dynamiikan supistaminen
Limitointi eli tason rajoittaminen
Särö
Ekspandointi eli dynamiikan laajentaminen
Kohinaportti
Äänenvoimakkuuden operaatiot
muokkaavat ääniaallon amplitudia
 dynamiikka = äänenvoimakkuuden vaihtelu

2.1.1. Säätö, nosto ja häivytys

säätö (control)

nosto (fade in)

häivytys (fade out)
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
2.1.5. Verhokäyrä
engl. envelope
 ADSR-verhokäyrä:


huipputaso

pitotaso

0

aluke kesto
(attack) (decay)

pito
(sustain)

päästö
(release)

t
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 nousu
 esim. 3:1 = 3 dB:n nousu tulosignaalissa
nostaa 1 dB lähtösignaalia
 kynnystaso (threshold level): taso jonka
yläpuolella kompressointi alkaa vaikuttaa

Kompressointi
lähtö (dB)
14

1:1
12

2:1

10

4:1
8:1
:1

8
6

kynnystaso

4
2

tulo (dB)
2

4

6

8

10

12

14
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

2.1.8. Särö



engl. distortion
syntyy signaalin leikkautuessa:
leikkaustaso

kova leikkaus
alkuperäinen signaali



muuttaa sointiväriä

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
lähtö (dB)
14
12
10
8

kynnystaso

6
4

1:1
2

1:2

1:3 1:
tulo (dB)

2

4

6

8

10

12

14
Ekspandointi ja aaltomuoto

alkuperäinen ääni

ekspandoitu ääni
Kompandointi 1(2)

alkuperäinen ääni

kompressoitu ja vahvistettu ääni

kohina

tallennettu ääni
Kompandointi 2(2)

tallennettu ääni

ekspandoitu ääni

alkuperäinen ääni
2.1.10. Kohinaportti
engl. noise gate
 ekspandoinnin erikoistapaus:
ekspansiosuhde 1:

signaalitaso

Kohinaportin toiminta
portti aukeaa

portti sulkeutuu

kynnystaso
kohinaa

t
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

portti täysin auki

portti pysyy auki
kunnes pitoaika on
kulunut

pitoaika

signaalitaso

Parametrisoidun kohinaportin
toiminta

kynnystaso
kohinaa

portti alkaa aueta

signaali on alle
portti sulkeutuu
kynnystason

t
2.2. Taajuus
1.
2.

3.
4.

Äänenkorkeuden muuttaminen
Vibraatto
Ekvalisointi eli taajuuskorjaus
Taajuussuodatus
2.2.1. Äänenkorkeuden muutos
engl. pitch shift, pitch transpose
 muutetaan alkuperäisen signaalin taajuutta
 menetelmät:
 keston muuttava
 nosto nopeuttaa, lasku hidastaa
 laskennallisesti yksinkertainen
 keston säilyttävä
 laskennallisesti monimutkainen

Esimerkki: keston muuttava
äänenkorkeuden nosto

t

t
Esimerkki: keston muuttava
äänenkorkeuden lasku

t

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

f
A

f

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:


A

m

c - 4m

c - 3m

c - 2m

c-m

m

c

c+m

c + 2m c + 3m c + 4m

f
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
A

korostus

vaimennus

f
basso
(bass)

diskantti
(treble)
Termejä
keskitaajuus
(center frequency)
A
3 dB
keskitaajuus
Q-arvo =
kaistanleveys

kaistanleveys
(bandwidth)

f
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
A

0

f1

f2

f3

f4

f5

f
pop
live

dance

rock
large hall

classical

Esimerkkisäätöjä

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
A
kaistanleveyden
säädön
jompikumpi säätö on
kiinnitetty
puoliparametrinen
taajuuskorjain

f
Parametrinen taajuuskorjain
A
korostus

vaimennus

keskitaajuus
kaistanleveys

f
Subjektiivisia luonnehdintoja
Hz

Taajuusalue

Positiivinen
korrelaatio

Negatiivinen
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ä

erottelevuus,
ilmavuus

ohuus

10 000–20 000 ylin diskantti
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

A

fc

f
Taajuussuodattimia
A

A

alipäästö

f

A

ylipäästö

f

A

kaistanpäästö

f

kaistanesto

f
Wahwah-efekti


rajataajuuden modulointia

m

A

fc - m

m

fc

fc + m

f
2.3. Aika
1.
2.

3.
4.
5.

Kaiku
Kuoroefekti
Vaiheistus ja flanger-efekti
Kaiunta
Nopeutus ja hidastus
Viivästyttäminen (delay)
viiveaika
 0–20 ms: vaiheistus (phasing) ja flangerefekti (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, katto
 20–200 ms
 jälkikaiunta: kaiut
 tihenevät
 vaimentuvat
 mataloituvat

Kaiunta tilassa
Kaiunnan osat
A

esiviive
(predelay)

ensiheijastumien
kesto

ensiheijastumat
heräteääni (early reflections)
(impulse)

jälkikaiunnan
kesto (decay)

jälkikaiunta
(reverberation)

t
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 viive
 voimakkuus: heijastuspinnan materiaali
 viive: tilan koko
 < 5 ms: pieni huone
 10–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 dB
 huonetiloissa lyhyt (1–3 s)
 käytävissä ja luolissa pitkä (5–10 s)

Portitettu kaiunta (gated reverb)
A

kohinaportin
kynnystaso

t
Käänteinen kaiunta (reverse
reverb)
A

t
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.
2.

3.
4.
5.
6.
7.

Uudelleensamplaus
Uudelleenkvantisointi
Perustason korjaus
Aaltomuodon kääntäminen
Aaltomuoden invertointi
Aaltomuodon muokkaus
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
A

t
Esimerkki: uudelleensamplaus
ylöspäin
A

t
2.4.2. Uudelleenkvantisointi
engl. requantization
 dither-prosessointi (dithering): generoidaan
kohinaa, joka kompensoi kvantisoinnissa
syntyvää informaatiohukkaa
 kohina ”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 taustakohinasta
 poistetaan kohina signaalista
 saattaa 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.
2.

java.applet
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 Appletmetodeja
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 konstruktorilla


public 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
...
<applet
code="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 startmetodia
jos appletista poistutaan (esim. vaihdetaan sivua,
minimoidaan selain), kutsutaan stop-metodia
kun applettiin palataan takaisin, kutsutaan startmetodia
appettioliota poistettaessa kutsutaan finalizemetodia
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
...
<applet
code="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-olion
 huom. parametriksi annetaan URL-olio
eikä esim. tiedostokahva
 vinkki: 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)
dataformaatti
 kertoo kuinka sarja tavuja eli ”raaka”
samplattu äänidata pitää tulkita
 AudioFormat-luokka
 tiedostoformaatti
 määrittelee äänitiedoston rakenteen
 AudioFileFormat-luokka

Äänidatan formaatit 2(2)
vaikka tarjolla on metodeja
 erilaisten ääniformaattien muuttamiseen
 yleisten tiedostoformaattien lukemiseen
ja tallentamiseen
 kyse ei silti ole kaikenkattavasta
äänityökalusta
 palveluntarjoajilta 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
kohdelinjat
mikserit

Mixer

lähdelinjat

AudioSystem
kohdelinjat
Line

lähdelinjat
Analogia: miksauspöytä
tulosignaalit

kaiuntalaite lähtösignaali

tulosignaalin säätö
taajuuskorjaus

kaiunnan lähtö
panorointi
vahvistus

kaiunnan
paluu
lähtösignaalin
vahvistus
Äänijärjestelmä (audio system)


kokoaa yhteen kaikki laitteiston ja
ohjelmiston tarjoamat äänipalvelut:
 mikserit
 linjat
 portit
 ää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, mykis
tys
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

SourceDataLine

DataLine

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

Mixer
vahvistus

panorointi

portteja

TargetDataLine
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

Mixer

SourceDataLine
SourceDataLine

portteja

Clip

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 getMixerInfometodilla
 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 getLinemetodilla
 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 LineListenerrajapinnan
 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

FloatControl

EnumControl

CompoundControl
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.applet
2. 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
MPEG
FFT

AD-muunnos

tiivistäminen
DA-muunnos

äänittäminen

tiedostoformaatit

signaaliprosessointi
kompleksiluvut

äänentoisto
MIDI

akustiikka

sekvensserit

moniraitaohjelmat
olet tässä

DÄP

säveltäminen

Más contenido relacionado

Destacado

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Destacado (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Digitaalisen äänenkäsittelyn perusteet - kalvot 2010