Digitaalisen äänenkäsittelyn perusteet - kalvot 2010
-
Upload
jouni-smed -
Category
Technology
-
view
463 -
download
0
description
Transcript of Digitaalisen äänenkäsittelyn perusteet - kalvot 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ä