Digitaalisen äänenkäsittelyn perusteet - kalvot 2010

785 views
650 views

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
785
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Digitaalisen äänenkäsittelyn perusteet - kalvot 2010

  1. 1. Digitaalisen äänenkäsittelyn perusteet Jouni Smed jouni.smed@utu.fi syksy 2010
  2. 2. 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
  3. 3. 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!
  4. 4. 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
  5. 5. 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
  6. 6. 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… 
  7. 7. 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)
  8. 8. Tavoitteet teoreettinen: ymmärtää äänenkäsittelyyn liittyviä käsitteitä mitä voidaan tehdä  käytännöllinen: ymmärtää operaatioiden vaikutus ääneen mitä pitää tehdä 
  9. 9. Mitä ei käsitellä — ainakaan syvällisesti äänentoistoa  akustiikkaa  äänittämistä  musiikintekoa  MIDIä  signaaliprosessointia  tiivistämistä  tiedostoformaattien esitysmuotoa 
  10. 10. Kurssin rajapinnat DÄP
  11. 11. Sisällys 1(3) 1. Perusteita 1. Äänen fysiikkaa 2. Psykoakustiikka 3. Äänen syntetisointi 4. Samplaus ja kvantisointi 5. Tiedostoformaatit
  12. 12. Sisällys 2(3) 2. Äänenkäsittelyoperaatiot 1. Voimakkuus 2. Taajuus 3. Aika 4. Aaltomuoto 5. Operaatioiden ketjuttaminen
  13. 13. Sisällys 3(3) 3. Javan ääniohjelmointi 1. java.applet 2. javax.sound.sampled
  14. 14. 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 
  15. 15. 1.1. Äänen fysiikkaa  ääni = väliaineessa etenevä mekaaninen värähtely (aaltoliike), joka saa aikaan kuuloaistimuksen äänilähde väliaine havaitsija
  16. 16. Ääniaalto p p0 tihentymä (ylipaine) harventuma (alipaine)
  17. 17. Aaltomuoto jaksollinen aaltomuoto kohina
  18. 18. Taajuus (frequency)   taajuus, f: aaltojen lukumäärä aikayksikköä kohti yksikkö: hertsi, Hz = 1/s t
  19. 19. Aallonpituus ja amplitudi   aallonpituus, : vastaavien pisteiden etäisyys peräkkäisissä aalloissa amplitudi, A: värähdysliikkeen laajuus A
  20. 20. Äänen spektri A A t f A A t f
  21. 21. Vaihe (phase)
  22. 22. Ää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
  23. 23. Ää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 
  24. 24. 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
  25. 25. 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
  26. 26. 1.2. Psykoakustiikka  äänihavaintoon vaikuttavat  kuuloaistin fysiologia  aivojen tulkinta
  27. 27. Ää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
  28. 28. äänenpainetaso (dB) Fletcher-Munson -käyrästö KUULOKYNNYS taajuus (Hz)
  29. 29. 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)
  30. 30. Ää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
  31. 31. 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
  32. 32. 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
  33. 33. 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
  34. 34. Ää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
  35. 35. 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 
  36. 36. 1.3. Äänen syntetisointi  olemassa olevien äänten jäljittely  keinotekoisten äänten luonti
  37. 37. Menetelmiä aaltomuototaulukkosynteesi (wavetable)  vähentävä (subtractive) synteesi  lisäävä (additive) synteesi  FM-synteesi (frequency modulation) 
  38. 38. Aaltomuototaulukkosynteesi   f1 samplataan äänilähdettä eri taajuuksilla aaltomuototaulukko mikäli haluttua taajuutta ei löydy taulusta, interpoloidaan aaltomuoto f2 f3 f4 f3.5 fn
  39. 39. Vähentävä synteesi lähtöaaltomuodossa paljon yläsäveliä  lopullinen sointiväri saadaan suodattamalla pois taajuuksia  f f
  40. 40. Lisäävä synteesi  summataan yhteen eritaajuisia, -amplitudisia ja -vaiheisia siniaaltoja
  41. 41. FM-synteesi moduloidaan kantoaallon taajuutta toisella aallolla  muokataan lopullisen aaltomuodon amplitudia verhokäyrällä  f f
  42. 42. Ääniaaltoja valkoinen kohina (white noise) siniaalto (sine wave) kanttiaalto (square wave) kolmioaalto (triangular wave) saha-aalto (saw wave)
  43. 43. 1.4. Samplaus ja kvantisointi AD-muunnos: analogisesta digitaaliseksi  DA-muunnos: digitaalisesta analogiseksi  digitaalisen esitysmuodon etuja:  kopioitavuus  kohinan vähyys  muokattavuus 
  44. 44. Analoginen ääniketju Levysoitin Urat levyn pinnassa Esivahvistin Heikko sähköinen signaali Vahvistin Hieman vahvistettu signaali Vahvistettu signaali Kovaääninen Ilmanpaineen vaihtelu (ääni)
  45. 45. Digitaalinen ääniketju CD-soitin Binäärinumerot DA-muunnin Digitaalinen signaali Vahvistin Analoginen signaali Vahvistettu signaali Kovaääninen Ilmanpaineen vaihtelu (ääni)
  46. 46. 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
  47. 47. Samplaus (sampling) eli näytteistys
  48. 48. Aliasointi eli liian matala samplaustaajuus
  49. 49. 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
  50. 50. Kvantisointi (quantizing)  näytearvon pyöristys kokonaislukuun  8 bittiä: [-128, +127]  16 bittiä: [-32768, +32767]
  51. 51. 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 
  52. 52. 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
  53. 53. Tiivistys (compression) häviötön (lossless)  koodauksen vaihto  ei hukkaa informaatiota  häviöllinen (lossy)  saattaa hukata informaatiota virhe  bittien määrä
  54. 54. 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
  55. 55. 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
  56. 56. 2. Äänenkäsittely 1. 2. 3. 4. 5. Voimakkuus Taajuus Aika Aaltomuoto Operaatioiden ketjuttaminen
  57. 57. Operaatioesimerkkejä 1(2) voimakkuus taajuus
  58. 58. Operaatioesimerkkejä 2(2) aika aaltomuoto
  59. 59. Operaation osatekijät operoitu eli ”märkä” vahvistus (wet) signaali (gain) operaatio + tulosignaali lähtösignaali operoimaton eli ”kuiva” (dry) signaali
  60. 60. 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
  61. 61. Äänenvoimakkuuden operaatiot muokkaavat ääniaallon amplitudia  dynamiikka = äänenvoimakkuuden vaihtelu 
  62. 62. 2.1.1. Säätö, nosto ja häivytys säätö (control) nosto (fade in) häivytys (fade out)
  63. 63. 2.1.2. Normalisointi engl. normalizing  huippuarvo (maximum peak value)  RMS (root mean square) eli tehollisarvo 
  64. 64. 2.1.3. Panorointi engl. pan  äänikanavien välisen voimakkuuden säätäminen  tasapainotus eli balanssointi (balance) 
  65. 65. 2.1.4. Amplitudin modulointi
  66. 66. 2.1.5. Verhokäyrä engl. envelope  ADSR-verhokäyrä:  huipputaso pitotaso 0 aluke kesto (attack) (decay) pito (sustain) päästö (release) t
  67. 67. Verhokäyräesimerkki
  68. 68. 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ä! 
  69. 69. 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 
  70. 70. 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
  71. 71. 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 
  72. 72. Kompressointi ja aaltomuoto alkuperäinen ääni kompressoitu ääni kompressoitu ja vahvistettu ääni
  73. 73. 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) 
  74. 74. 2.1.7. Limitointi eli tason rajoittaminen engl. limiting  estää signaalin voimakkuuden nousun annettua tasoa suuremmaksi  kompressoinnin erikoistapaus: kompressiosuhde :1 
  75. 75. 2.1.8. Särö   engl. distortion syntyy signaalin leikkautuessa: leikkaustaso kova leikkaus alkuperäinen signaali  muuttaa sointiväriä pehmeä leikkaus
  76. 76. 2.1.9. Ekspandointi eli dynamiikan laajentaminen engl. expanding  kun tulosignaalin voimakkuus alittaa annetun kynnystason, tulosignaalin lasku aiheuttaa lähtösignaalissa suuremman laskun 
  77. 77. 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
  78. 78. 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
  79. 79. Ekspandointi ja aaltomuoto alkuperäinen ääni ekspandoitu ääni
  80. 80. Kompandointi 1(2) alkuperäinen ääni kompressoitu ja vahvistettu ääni kohina tallennettu ääni
  81. 81. Kompandointi 2(2) tallennettu ääni ekspandoitu ääni alkuperäinen ääni
  82. 82. 2.1.10. Kohinaportti engl. noise gate  ekspandoinnin erikoistapaus: ekspansiosuhde 1: 
  83. 83. signaalitaso Kohinaportin toiminta portti aukeaa portti sulkeutuu kynnystaso kohinaa t
  84. 84. 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 
  85. 85. 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
  86. 86. 2.2. Taajuus 1. 2. 3. 4. Äänenkorkeuden muuttaminen Vibraatto Ekvalisointi eli taajuuskorjaus Taajuussuodatus
  87. 87. 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 
  88. 88. Esimerkki: keston muuttava äänenkorkeuden nosto t t
  89. 89. Esimerkki: keston muuttava äänenkorkeuden lasku t t
  90. 90. Esimerkki: keston säilyttävä äänenkorkeuden nosto A f A f f
  91. 91. 2.2.2. Vibraatto  taajuusmodulointia (FM, frequency modulation)
  92. 92. 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
  93. 93. 2.2.3. Ekvalisointi eli taajuuskorjaus engl. equalizing, EQ  muokkaa taajuusjakaumaa ja siten äänenväriä  jakaa taajuskaistan osiin joita voidaan korostaa tai vaimentaa 
  94. 94. Yksinkertainen taajuuskorjain A korostus vaimennus f basso (bass) diskantti (treble)
  95. 95. Termejä keskitaajuus (center frequency) A 3 dB keskitaajuus Q-arvo = kaistanleveys kaistanleveys (bandwidth) f
  96. 96. Taajuuskorjaintyyppejä graafinen taajuuskorjain (graphic equalizer)  parametrinen taajuuskorjain (parametric equalizer)  puoliparametrinen taajuuskorjain (semiparametric equalizer, quasiparametric equalizer) 
  97. 97. 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ä 
  98. 98. Esimerkki: taajuuskaistajako A 0 f1 f2 f3 f4 f5 f
  99. 99. 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 }
  100. 100. Parametrinen taajuuskorjain   mahdollistaa keskitaajuuden ja A kaistanleveyden säädön jompikumpi säätö on kiinnitetty puoliparametrinen taajuuskorjain f
  101. 101. Parametrinen taajuuskorjain A korostus vaimennus keskitaajuus kaistanleveys f
  102. 102. 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
  103. 103. 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 
  104. 104. 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)
  105. 105. Parametreja    rajataajuus fc (cutoff frequency) jyrkkyys (slope) resonanssi (resonance)  rajataajuuden lähialueen korostaminen A fc f
  106. 106. Taajuussuodattimia A A alipäästö f A ylipäästö f A kaistanpäästö f kaistanesto f
  107. 107. Wahwah-efekti  rajataajuuden modulointia m A fc - m m fc fc + m f
  108. 108. 2.3. Aika 1. 2. 3. 4. 5. Kaiku Kuoroefekti Vaiheistus ja flanger-efekti Kaiunta Nopeutus ja hidastus
  109. 109. 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) 
  110. 110. 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
  111. 111. 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
  112. 112. 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)
  113. 113. Kampasuodatinilmiö A f
  114. 114. Flanger-efekti  flanger-efekti (flanging)  lyhyt viive (<50 ms)  moduloidaan viivettä kampasuodatin liikkuu edestakaisin taajuusalueen yli
  115. 115. 2.3.4. Kaiunta engl. reverb(eration)  jäljittelee tilan akustiikasta syntyvää jälkikaiuntaa  tekee äänestä luonnollisemman kuuloista  1000–3000 erillistä kaikua/s 
  116. 116. Äänen ajallinen jaottelu suora ääni  ensiheijastumat  seinät, lattia, katto  20–200 ms  jälkikaiunta: kaiut  tihenevät  vaimentuvat  mataloituvat 
  117. 117. Kaiunta tilassa
  118. 118. Kaiunnan osat A esiviive (predelay) ensiheijastumien kesto ensiheijastumat heräteääni (early reflections) (impulse) jälkikaiunnan kesto (decay) jälkikaiunta (reverberation) t
  119. 119. Perusparametreja     tilan koko (volume) tilan tyyppi (type) äänilähteen sijainti havainnoijan sijainti
  120. 120. Kaiuntatilatyyppejä 1(2) kirkas (bright)  pinnat heijastavat ääntä  esim. kylpyhuone, tyhjä luentosali  vaimentava (damping)  pinnat absorboivat ääntä  esim. vaatekomero, täysi luentosali 
  121. 121. Kaiuntatilatyyppejä 2(2) todelliset akustiset tilat, esim.  huone (room)  halli (hall)  kammio (chamber)  mekaaniset kaiuntalaitteet  jousikaiunta (spring reverb)  levykaiunta (plate reverb) 
  122. 122. 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 
  123. 123. 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) 
  124. 124. Portitettu kaiunta (gated reverb) A kohinaportin kynnystaso t
  125. 125. Käänteinen kaiunta (reverse reverb) A t
  126. 126. 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ä) 
  127. 127. 2.4. Aaltomuoto 1. 2. 3. 4. 5. 6. 7. Uudelleensamplaus Uudelleenkvantisointi Perustason korjaus Aaltomuodon kääntäminen Aaltomuoden invertointi Aaltomuodon muokkaus Miksaus
  128. 128. 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 
  129. 129. Esimerkki: uudelleensamplaus alaspäin A t
  130. 130. Esimerkki: uudelleensamplaus ylöspäin A t
  131. 131. 2.4.2. Uudelleenkvantisointi engl. requantization  dither-prosessointi (dithering): generoidaan kohinaa, joka kompensoi kvantisoinnissa syntyvää informaatiohukkaa  kohina ”heittelee” bittejä kvantisointirajan kummallekin puolelle 
  132. 132. Esimerkki: uudelleenkvantisointi A t
  133. 133. 2.4.3. Perustason korjaus
  134. 134. 2.4.4. Aaltomuodon kääntäminen
  135. 135. 2.4.5. Aaltomuodon invertointi
  136. 136. 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ä 
  137. 137. 2.4.7. Aaltomuodon muokkaus leikepöytä  leikkaa, kopioi, liitä  alueiden poistaminen  trimmaus  hiljaisuuden lisääminen 
  138. 138. 2.4.7. Miksaus miksaus (mixing)  kahden äänilähteen yhdistäminen  ristivaihto (crossfade)  yhden äänilähteen (lineaarinen) vaihto toiseksi 
  139. 139. 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
  140. 140. 3. Javan ääniohjelmointi 1. 2. java.applet javax.sound.sampled
  141. 141. 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 
  142. 142. 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) 
  143. 143. Muita esille tulevia Appletmetodeja void init()  void start()  void stop()  URL getCodeBase()  void showStatus(String msg)  String getParameter(String name) 
  144. 144. AudioClip-rajapinta  metodit yksittäistoistoon, silmukointiin ja pysäyttämiseen interface AudioClip { public void play(); public void loop(); public void stop(); }
  145. 145. 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ä
  146. 146. SimpleAudioApplet.java 1(3) import java.applet.*; import java.net.*; public class SimpleAudioApplet extends Applet { private AudioClip sound = null;
  147. 147. 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()
  148. 148. SimpleAudioApplet.java 3(3) public void start() { if (sound != null) sound.play(); } // start() } // class
  149. 149. SimpleAudioApplet.html ... <applet code="SimpleAudioApplet.class" width=300 height=300> Your browser doesn't support applets. </applet> ...
  150. 150. 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
  151. 151. 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()
  152. 152. BackgroundMusicApplet.java 2(2) public void start() { if (sound != null) sound.loop(); } // start() public void stop() { if (sound != null) sound.stop(); } // stop()
  153. 153. BackgroundMusicApplet.html ... <applet code="BackgroundMusicApplet.class" width=300 height=300> <param name="BG_MUSIC" value="muzak.wav"> Your browser doesn't support applets. </applet> ...
  154. 154. 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 
  155. 155. 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
  156. 156. 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
  157. 157. AudioApplet.java 3(6) public void stop() { for (int i = 0; i < sounds.length; i++) if (sounds[i] != null) sounds[i].stop(); } // stop()
  158. 158. 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
  159. 159. 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
  160. 160. 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
  161. 161. 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> ...
  162. 162. 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
  163. 163. 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> ...
  164. 164. 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
  165. 165. 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") + "/";
  166. 166. 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
  167. 167. AudioApplication.java 3(3) for (int i = 0; i < sounds.length; i++) { sounds[i].loop(); } // for } // main() } // class
  168. 168. 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
  169. 169. 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
  170. 170. 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
  171. 171. Ää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
  172. 172. Äänidatan formaatit 1(2) dataformaatti  kertoo kuinka sarja tavuja eli ”raaka” samplattu äänidata pitää tulkita  AudioFormat-luokka  tiedostoformaatti  määrittelee äänitiedoston rakenteen  AudioFileFormat-luokka 
  173. 173. Ää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 
  174. 174. 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
  175. 175. AudioFileFormat-luokka tiedostotyyppi (esim. WAVE, AIFF)  tiedoston pituus tavuina  äänidatan pituus kehyksinä  AudioFormat-olio, joka määrittelee tiedoston sisältämän äänidatan muodon 
  176. 176. Java Sound -perusosat äänijärjestelmä: AudioSystem  mikseri: Mixer  linja: Line  portti: Port 
  177. 177. Perusrakenne kohdelinjat mikserit Mixer lähdelinjat AudioSystem kohdelinjat Line lähdelinjat
  178. 178. Analogia: miksauspöytä tulosignaalit kaiuntalaite lähtösignaali tulosignaalin säätö taajuuskorjaus kaiunnan lähtö panorointi vahvistus kaiunnan paluu lähtösignaalin vahvistus
  179. 179. Äänijärjestelmä (audio system)  kokoaa yhteen kaikki laitteiston ja ohjelmiston tarjoamat äänipalvelut:  mikserit  linjat  portit  äänivirrat  tiedostoformaatit  ääniformaatit
  180. 180. 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)
  181. 181. 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
  182. 182. Mixer-rajapinnan metodeita Line.Info[] getSourceLines()  Line.Info[] getTargetLines()  Line getLine(Line.Info info)  void synchronize(Line[] lines, boolean maintainSync) 
  183. 183. 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
  184. 184. Line-rajapinnan metodeja      void open() void close() void addLineListener(LineListener listener) Control[] getControls() Control getControl(Control.Type control)
  185. 185. Portti (port)  abstrahoi laitteistotason liittymiä äänijärjestelmään, esim. mikrofoni tai kaiutin
  186. 186. Rajapintojen periytymishierarkia Line Port Mixer SourceDataLine DataLine TargetDataLine Clip
  187. 187. 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
  188. 188. DataLine-rajapinnan metodeja          AudioFormat getFormat() int getBufferSize() void start() void stop() int getFramePosition() float getLevel() void flush() void drain() boolean isActive()
  189. 189. Kohdedatalinja linja josta voidaan lukea dataa  mikseri voi toimittaa linjaan dataa esim. mikrofonista äänitys  huom. linja on kohde (target) mikserin näkökulmasta 
  190. 190. Esimerkki: äänitys Mixer vahvistus panorointi portteja TargetDataLine
  191. 191. TargetDataLine-rajapinnan metodeja void open(AudioFormat format)  int read(byte[] b, int off, int len) 
  192. 192. 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 
  193. 193. SourceDataLine-rajapinnan metodeja void open(AudioFormat format)  int write(byte[] b, int off, int len) 
  194. 194. Pätkä (clip) linja johon voidaan ladata dataa ennen toistoa  äänidatan pituus tunnetaan ennen toistoa aloituspaikka voidaan valita vapaasti  toistoa voidaan silmukoida 
  195. 195. Esimerkki: toisto Mixer SourceDataLine SourceDataLine portteja Clip kaiunta vahvistus panorointi
  196. 196. 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)
  197. 197. 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 
  198. 198. 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 
  199. 199. 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]);
  200. 200. 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(); }
  201. 201. Ää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 
  202. 202. 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;
  203. 203. 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
  204. 204. 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); }
  205. 205. 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ää."); }
  206. 206. SimplePlayer.java 5(5) } catch (IOException e) { System.err.println( "Virhe tiedoston luvussa."); } catch (UnsupportedAudioFileException e) { System.err.println( "Tuntematon tiedostoformaatti."); } // try } // main() } // class
  207. 207. 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 
  208. 208. 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];
  209. 209. 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
  210. 210. 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ää."); }
  211. 211. 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(); }
  212. 212. 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(); } }
  213. 213. 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
  214. 214. 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);
  215. 215. 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;
  216. 216. 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
  217. 217. 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
  218. 218. 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();
  219. 219. 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) 
  220. 220. 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];
  221. 221. 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); }
  222. 222. 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ä
  223. 223. Säädinten luokkahierarkia Control BooleanControl FloatControl EnumControl CompoundControl
  224. 224. 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 
  225. 225. Säädintyyppejä BooleanControl.Type.MUTE  EnumControl.Type.REVERB  FloatControl.Type.MASTER_GAIN  FloatControl.Type.PAN  FloatControl.Type.SAMPLE_RATE 
  226. 226. FloatControl-luokan metodeja          float getValue() void setValue(float newValue) float getMaximum() float getMinimum() float getPrecision() String getMaxLabel() String getMidLabel() String getMinLabel() String getUnits()
  227. 227. 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) { ... } }
  228. 228. 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); }
  229. 229. 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]);
  230. 230. Ää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 
  231. 231. Mitä käsiteltiin? 1(3) 1. Perusteita 1. Äänen fysiikkaa 2. Psykoakustiikka 3. Äänen syntetisointi 4. Samplaus ja kvantisointi 5. Tiedostoformaatit
  232. 232. Mitä käsiteltiin? 2(3) 2. Äänenkäsittelyoperaatiot 1. Voimakkuus 2. Taajuus 3. Aika 4. Aaltomuoto 5. Operaatioiden ketjuttaminen
  233. 233. Mitä käsiteltiin? 3(3) 3. Javan ääniohjelmointi 1. java.applet 2. javax.sound.sampled
  234. 234. 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ä 
  235. 235. 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
  236. 236. 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

×