Digitaalisen äänenkäsittelyn perusteet 8.12.2006
(c) 2002-2006 Jouni Smed 1
Kohdedatalinjan käyttö
varataan puskuriksi varataan puskuriksi byte byte- -taulukko taulukko
puskurin koon vaikutus kuten puskurin koon vaikutus kuten lähdedatalinjassa
lähdedatalinjassa
read read- -metodin kutsu lukee puskuriin dataa metodin kutsu lukee puskuriin dataa ja palauttaa sen määrän tavuina
ja palauttaa sen määrän tavuina
drain drain- -metodi odottaa, kunnes mikserissä metodi odottaa, kunnes mikserissä oleva data tulee luetuksi
oleva data tulee luetuksi
flush flush- -metodi poistaa lukemista odottavan metodi poistaa lukemista odottavan datan (muuten se jää odottamaan mikseriin) datan (muuten se jää odottamaan mikseriin)
Karaoke.java 1(2)
DDataLineataLine..InfoInfo infoTarget = infoTarget = newnew DataLine
DataLine..InfoInfo((TargetDataLineTargetDataLine.class, format);.class, format);
DataLine
DataLine..InfoInfo infoSource = infoSource = newnew DataLine
DataLine..InfoInfo((SourceDataLineSourceDataLine.class, format);.class, format);
if
if ((AudioSystemAudioSystem.isLineSupported(infoTarget) .isLineSupported(infoTarget)
&
& AudioSystemAudioSystem.isLineSupported(infoSource) .isLineSupported(infoSource) {{ trytry{ {
TargetDataLine
TargetDataLinelineTarget = (TargetDataLinelineTarget = (TargetDataLine)) AudioSystem
AudioSystem.getLine(infoTarget);.getLine(infoTarget);
SourceDataLine
SourceDataLinelineSource = (SourceDataLinelineSource = (SourceDataLine)) AudioSystem
AudioSystem.getLine(infoSource);.getLine(infoSource);
int int bufferSize = (bufferSize = (intint)(bufferLength)(bufferLength**
format.getFrameSize() * format.getFrameRate());
format.getFrameSize() * format.getFrameRate());
byte
byte[] buffer = [] buffer = newnewbytebyte[bufferSize];[bufferSize];
Karaoke.java 2(2)
lineTarget.open(format, bufferSize);
lineTarget.open(format, bufferSize);
lineSource.open(format);
lineSource.open(format);
lineTarget.start();
lineTarget.start();
lineSource.start();
lineSource.start();
while while(true(true) {) {
int dataSize = int dataSize =
lineTarget.read(buffer, 0, bufferSize);
lineTarget.read(buffer, 0, bufferSize);
// T
// Täässssääkohtaa puskurissa olevalle kohtaa puskurissa olevalle äääänellenelle // voisi
// voisi tehdtehdääjotain jäjotain jäynynääää...
lineSource.write(buffer, 0, dataSize);
lineSource.write(buffer, 0, dataSize);
} }
Linjan säätimet (controls)
Control- Control -luokasta periytyy neljä säädintyyppiä: luokasta periytyy neljä säädintyyppiä:
BooleanControl: katkaisin BooleanControl : katkaisin
esim. mykistys ( esim. mykistys (mute mute) )
FloatControl: säätökytkin FloatControl : säätökytkin
esim. vahvistus, panorointi esim. vahvistus, panorointi
EnumControl: valintakytkin EnumControl : valintakytkin
esim. kaiunnan esivalinnat esim. kaiunnan esivalinnat
CompoundControl: säädinkokoelma CompoundControl : säädinkokoelma
esim. taajuuskorjain voi olla kokoelma esim. taajuuskorjain voi olla kokoelma FloatControl
FloatControl- -tyyppisiä säätökytkimiä tyyppisiä säätökytkimiä
Säädinten luokkahierarkia
Control Control
BooleanControl
BooleanControl FloatControlFloatControl EnumControlEnumControl CompoundControlCompoundControl
Linjan säädinten haku
getControls- getControls -metodi palauttaa taulukon metodi palauttaa taulukon linjan tarjoamista säätimistä
linjan tarjoamista säätimistä
isControlSupported- isControlSupported -metodi palauttaa metodi palauttaa onko halutun tyyppistä säädintä tarjolla onko halutun tyyppistä säädintä tarjolla
getControl- getControl -metodi palauttaa pyydetyn metodi palauttaa pyydetyn tyyppisen säätimen
tyyppisen säätimen
Digitaalisen äänenkäsittelyn perusteet 8.12.2006
(c) 2002-2006 Jouni Smed 2
Säädintyyppejä
BooleanControl BooleanControl. .Type Type.MUTE .MUTE
EnumControl EnumControl. .Type Type.REVERB .REVERB
FloatControl FloatControl. .Type Type.MASTER_GAIN .MASTER_GAIN
FloatControl FloatControl. .Type Type.PAN .PAN
FloatControl FloatControl. .Type Type.SAMPLE_RATE .SAMPLE_RATE
FloatControl-luokan metodeja
float float getValue() getValue()
void void setValue(float setValue( float newValue) newValue)
float float getMaximum() getMaximum()
float float getMinimum() getMinimum()
float float getPrecision() getPrecision()
String String getMaxLabel() getMaxLabel()
String String getMidLabel() getMidLabel()
String String getMinLabel() getMinLabel()
String String getUnits() getUnits()
ControlPlayer.java 1(3)
boolean
boolean gain = gain = falsefalse, , pan = pan = falsefalse,, rate =
rate = falsefalse, , mute = mute = falsefalse;; if
if (args.length >= 1) {(args.length >= 1) {
gain = args[1].equals("gain");
gain = args[1].equals("gain");
pan = args[1].equals("pan");
pan = args[1].equals("pan");
rate = args[1].equals("rate");
rate = args[1].equals("rate");
mute = args[1].equals("mute");
mute = args[1].equals("mute");
} } float
float parameter = 0.0f;parameter = 0.0f;
if
if (args.length == 3)(args.length == 3){{ try
try{{ parameter =
parameter = FloatFloat.parseFloat(args[2]);.parseFloat(args[2]);
} catch} catch ((NumberFormatExceptionNumberFormatExceptione) { ... }e) { ... } }
}
ControlPlayer.java 2(3)
clip.open(source);
clip.open(source);
clip.start();
clip.start();
if if (gain && (gain && clip.isControlSupported( clip.isControlSupported(
FloatControl
FloatControl. .Type Type.MASTER_GAIN)) .MASTER_GAIN)) { { FloatControl
FloatControl gainCtrl = gainCtrl =
(FloatControl ( FloatControl)clip.getControl( )clip.getControl(
FloatControl
FloatControl. .Type Type.MASTER_GAIN); .MASTER_GAIN);
gainCtrl.setValue(parameter);
gainCtrl.setValue(parameter);
} }
ControlPlayer.java 3(3)
if
if (mute &&(mute && clip.isControlSupported(clip.isControlSupported(
BooleanControl
BooleanControl..TypeType.MUTE)) {.MUTE)) { BooleanControl
BooleanControlmuteCtrl =muteCtrl = (
(BooleanControlBooleanControl)clip.getControl()clip.getControl(
BooleanControl
BooleanControl..TypeType.MUTE);.MUTE);
muteCtrl.setValue(
muteCtrl.setValue(truetrue););
} }// if// if Control
Control[] ctrl = clip.getControls();[] ctrl = clip.getControls();
for
for ((int int i = 0; i < ctrl.length; i++)i = 0; i < ctrl.length; i++) System
System.out.println(ctrl[i]);.out.println(ctrl[i]);
Ääniominaisuuksien käyttöoikeudet
määritelty AudioPermission määritelty AudioPermission- -luokassa: luokassa:
toisto toisto
äänitys äänitys
appletti: saa toistaa muttei äänittää appletti: saa toistaa muttei äänittää
sovellus: saa toistaa ja äänittää sovellus: saa toistaa ja äänittää
ohjelmien oikeuksia voidaan muuttaa Policy ohjelmien oikeuksia voidaan muuttaa Policy Tool
Tool - -ohjelmalla ohjelmalla
Digitaalisen äänenkäsittelyn perusteet 8.12.2006
(c) 2002-2006 Jouni Smed 3
Mitä käsiteltiin? 1(3)
1.1.
Perusteita Perusteita
1.1.
Äänen fysiikkaa Äänen fysiikkaa
2.
2.
Psykoakustiikka Psykoakustiikka
3.
3.
Äänen syntetisointi Äänen syntetisointi
4.
4.
Samplaus ja kvantisointi Samplaus ja kvantisointi
5.5.
Tiedostoformaatit Tiedostoformaatit
Mitä käsiteltiin? 2(3)
2.2.
Äänenkäsittelyoperaatiot Äänenkäsittelyoperaatiot
1.1.
Voimakkuus Voimakkuus
2.
2.
Taajuus Taajuus
3.
3.
Aika Aika
4.
4.
Aaltomuoto Aaltomuoto
5.5.
Operaatioiden ketjuttaminen Operaatioiden ketjuttaminen
Mitä käsiteltiin? 3(3)
3.3.
Javan ääniohjelmointi Javan ääniohjelmointi
1.
1.
java.applet java.applet
2.2.
javax.sound.sampled javax.sound.sampled
Mitkä olivat tavoitteet?
teoreettinen: ymmärtää äänenkäsittelyyn teoreettinen: ymmärtää äänenkäsittelyyn liittyviä käsitteitä
liittyviä käsitteitä
→
→ mitä mitä voidaan voidaan tehdä tehdä
käytännöllinen: ymmärtää operaatioiden käytännöllinen: ymmärtää operaatioiden vaikutus ääneen
vaikutus ääneen
→
→ mitä mitä pitää pitää tehdä tehdä
Kurssin hyväksytty suoritus =
1. 1. Ilmoittautuminen 13.11 menness Ilmoittautuminen 13.11 mennessä ä
2.
2. Hyv Hyvä äksytty harjoitusty ksytty harjoitustyö ö
työ palautettava 31.12.2006 mennessä työ palautettava 31.12.2006 mennessä 3.
3. Hyv Hyvä äksytty tentti ksytty tentti
Tentit
tenttipäivät tenttipäivät
1.1.
15.12.2006, sali 15.12.2006, sali β β, , klo 10:00 klo 10:00– –12:00 12:00 (luentotentti)
(luentotentti)
2.2.
15.1.2007 15.1.2007
3.3.
12.2.2007 12.2.2007
varmista tenttiaika ja - varmista tenttiaika ja -paikka paikka http://www.it.utu.fi/opetus/tentit/
http://www.it.utu.fi/opetus/tentit/
muista ilmoittautua ajoissa! muista ilmoittautua ajoissa!
Digitaalisen äänenkäsittelyn perusteet 8.12.2006
(c) 2002-2006 Jouni Smed 4
Tie tästä eteenpäin
DÄPDÄP
MIDI MIDI
sekvensserit sekvensserit moniraitaohjelmat moniraitaohjelmat äänittäminen
äänittäminen
säveltäminen säveltäminen signaaliprosessointi
signaaliprosessointi FFT FFT tiivistäminen
tiivistäminen
tiedostoformaatit tiedostoformaatit MPEG MPEG
akustiikka akustiikka
kompleksiluvut kompleksiluvut äänentoisto
äänentoisto AD
AD--muunnosmuunnos DA DA--muunnosmuunnos
olet tässä olet tässä