Mikseri (mixer) AudioSystem-luokan metodeita. Linja (line) Mixer-rajapinnan metodeita. Portti (port) Line-rajapinnan metodeja

Samankaltaiset tiedostot
Java Sound -perusosat. Perusrakenne. Analogia: miksauspöytä. Äänijärjestelmä (audio system) Mikseri (mixer) AudioSystem-luokan metodeita

AudioSystemTest.java. import javax.sound.sampled.*;

3.1. java.applet. 3. Javan ääniohjelmointi. Muita esille tulevia Appletmetodeja. Applet-luokan äänimetodeja. URL-luokka. AudioClip-rajapinta

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

3.1. java.applet. 3. Javan ääniohjelmointi. Muita esille tulevia Appletmetodeja. Applet-luokan äänimetodeja. AudioClip-rajapinta.

Rajapinta (interface)

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Metodien tekeminen Javalla

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Poikkeustenkäsittely

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmoinnin jatkokurssi, kurssikoe

Listarakenne (ArrayList-luokka)

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

17. Javan omat luokat 17.1

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Luokan sisällä on lista

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Java-kielen perusteet

Java ja grafiikka. Ville Sundberg

Java-kielen perusteita

Ohjelmointityö 3. Mikko Laamanen

Olio-ohjelmointi Javalla

8. Näppäimistöltä lukeminen 8.1

Java-API, rajapinnat, poikkeukset, UML,...

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Ohjelmointi 2 / 2010 Välikoe / 26.3

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Tietokannat II -kurssin harjoitustyö

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Ohjelmoinnin perusteet, kurssikoe

Ohjelmoinnin perusteet Y Python

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Java-kielen perusteita

8. Näppäimistöltä lukeminen 8.1

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Sarjallistaminen. Juha Järvensivu 2007

12. Näppäimistöltä lukeminen 12.1

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Ohjelmoinnin perusteet Y Python

Mitä poikkeuskäsittely tarkoittaa?

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Javan GUI Scratchaajalle

16. Javan omat luokat 16.1

10 Lock Lock-lause

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Mikä yhteyssuhde on?

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

9. Periytyminen Javassa 9.1

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

1. Omat operaatiot 1.1

17. Javan omat luokat 17.1

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Muuttujat ja kontrolli. Ville Sundberg

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Pakkauksen kokoaminen

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

13. Loogiset operaatiot 13.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Sisältö. 22. Taulukot. Yleistä. Yleistä

13. Loogiset operaatiot 13.1

public static void main (String [] args)

Javan perusteita. Janne Käki

Rinnakkaisohjelmointi, Syksy 2006

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

<applet code="simpleaudioapplet.class" width=300 height=300>

9. Periytyminen Javassa 9.1

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Olio-ohjelmointi Virhetilanteiden käsittely

Ohjelmoinnin perusteet Y Python

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

11. Javan valintarakenteet 11.1

Ohjelmoinnin perusteet Y Python

Sisältö. 2. Taulukot. Yleistä. Yleistä

Lista luokan sisällä

Tietorakenteet, laskuharjoitus 7,

Olio-ohjelmointi Käyttöliittymä

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Transkriptio:

AudioSystem-luokan metodeita static Mixer.Info Info[] getmixerinfo() static Mixer getmixer(mixer Mixer.Info info) static Line getline(line 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 Info[] getsourcelines() Info[] gettargetlines() Line getline(line info) void synchronize(line 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 Control.Type control) Portti (port) abstrahoi laitteistotason liittymiä äänijärjestelmään, esim. mikrofoni tai kaiutin (c) 2002-2006 Jouni Smed 1

Rajapintojen periytymishierarkia Datalinja Port Line Mixer SourceDataLine DataLine TargetDataLine Clip assosioi linjan tiettyyn ääniformaattiin puskuroitu: tavuvektori käynnistys ja pysäytys nykyinen sijainti (media( position) taso (level( level): tämänhetkisen signaalin amplitudi tyhjennys (flush( flush): poistaa prosessoimattoman datan puskuri valutus (drain( 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( target) ) mikserin näkökulmasta Esimerkki: äänitys TargetDataLine-rajapinnan metodeja TargetDataLine Mixer portteja void open(audioformat format) int read(byte byte[] b, int off, int len) vahvistus panorointi (c) 2002-2006 Jouni Smed 2

Lähdedatalinja linja johon voidaan kirjoittaa dataa mikseri voi toimittaa kirjoitetun datan esim. kaiuttimiin toisto huom. linja on lähde (source( source) ) mikserin näkökulmasta SourceDataLine-rajapinnan metodeja void open(audioformat format) int write(byte byte[] b, int off, int len) Pätkä (clip) Esimerkki: toisto linja johon voidaan ladata dataa ennen toistoa äänidatan pituus tunnetaan ennen toistoa aloituspaikka voidaan valita vapaasti toistoa voidaan silmukoida Clip SourceDataLine SourceDataLine kaiunta Mixer vahvistus panorointi portteja Clip-rajapinnan metodeja void open(audioinputstream stream) int getframelength() long getmicrosecondlength() void setframeposition(int int frames) void setmicrosecondposition(long milliseconds) void loop(int count) void setlooppoints(int start, int end) Mikserin haku Mixer.Info Info-olio olio sisältää mikserin kuvauksen pyydetään äänijärjestelmältä lista mikserikuvauksia getmixerinfo- metodilla valitaan listasta sopiva ja pyydetään sitä getmixer-metodilla (c) 2002-2006 Jouni Smed 3

Linjan haku Info-olio 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 Info- ja Data Info-olioillaolioilla AudioSystemTest.java 1(2) import javax.sound.sampled.*; public class AudioSystemTest Mixer.Info Info[] mi = AudioSystem.getMixerInfo(); i = 0; i < mi.length; i++) System.out.println(mi[i]); Mixer m = AudioSystem.getMixer(mi[i]); AudioSystemTest.java 2(2) Info[] sli = m.getsourcelineinfo(); j = 0; j < sli.length; j++) System.out.println("source: " + sli[j]); Info[] tli = m.gettargetlineinfo(); j = 0; j < tli.length; j++) System.out.println("target: " + tli[j]); System.out.println(); Äänivirran haku pyydetään äänijärjestelmältä AudioInputStream-olio olio kutsumalla getaudioinputstream-metodia 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 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) loopcou ount = Integer.parseInt(args[2]) - 1; catch (NumberFormatException System.err.println("Ei kokonaisluku: + args[2]); System.exit(1); else loopcount = Clip.LOOP_CONTINUOUSLY; // if (c) 2002-2006 Jouni Smed 4

SimplePlayer.java 3(5) AudioInputStream source = AudioSystem.getAudioInputStream(file); AudioFormat format = source.getformat(); Data info = new Data Info(Clip.class, format); if (!AudioSystem AudioSystem.isLineSupported(info)) System.err.println("Ei sopivaa linjaa."); System.exit(1); SimplePlayer.java 4(5) try Clip clip = (Clip( Clip)AudioSystem.getLine(info); clip.open(source); if (loopcount == 0) clip.start(); else clip.loop(loopcount); catch (LineUnavailableException System.err.println("Linjaa ei voi käyttk yttää."); SimplePlayer.java 5(5) catch (IOException System.err.println( "Virhe tiedoston luvussa."); catch (UnsupportedAudioFileException 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 Type-tapahtumatyyppejä: OPEN, CLOSE, START, STOP 1(5) public class RandomSequencePlayer private Random random = new Random(); private Clip[] clips; public RandomSequencePlayer(File File[] files) AudioInputStream[] sources = new AudioInputStream[files.length]; AudioFormat[] formats = new AudioFormat[files.length]; Data Info[] infos = new Data Info[files.length]; 2(5) i = 0; i < sources.length; i++) sources[i] = AudioSystem.getAudioInputStream(files[i]); formats[i] = sources[i].getformat(); infos[i] = new Data Info(Clip.class, formats[i]); if (!AudioSystem AudioSystem.isLineSupported(infos[i])) System.err.println("Ei sopivaa linjaa."); System.exit(1); // if // for (c) 2002-2006 Jouni Smed 5

3(5) clips = new Clip[sources.length]; i = 0; i < clips.length; i++) clips[i] = (Clip)AudioSystem.getLine(infos[i]); clips[i].addlinelistener(new new Changer()); clips[i].open(sources[i]); catch (LineUnavailableException System.err.println("Linjaa ei voi käyttk yttää."); 4(5) public void startrandomclip() int finger = random.nextint(clips.length); clips[finger].setframeposition(0); clips[finger].start(); File[] files = new File[args.length]; i = 0; i < files.length; i++) files[i] = new File(args[i]); RandomSequencePlayer rsp = new RandomSequencePlayer(files); rsp.startrandomclip(); 5(5) private class Changer implements LineListener public void update(lineevent if (e.gettype().equals(lineevent LineEvent.Type.START)) System.out.println("New clip started."); if (e.gettype().equals(lineevent LineEvent.Type.STOP)) startrandomclip(); Lähdedatalinjan käyttö varataan puskuriksi byte-taulukko 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 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) Data info = new Data Info( SourceDataLine.class, format); if (AudioSystem.isLineSupported(info)) SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info); int buffersize = 6 * (int( int)samplefrequency; byte[] buffer = new byte[buffersize]; int twosecmarker = 2 * (int( int)samplefrequency; int foursecmarker = 4 * (int( int)samplefrequency; (c) 2002-2006 Jouni Smed 6

SynthPlayer.java 3(5) Random random = new Random(); i = 0; i < twosecmarker; i++) buffer[i] = (byte( byte)random.nextint(); int wavelength = (int( int)samplefrequency / 440; i = twosecmarker; i <= (foursecmarker - wavelength); i += wavelength) j = i; j < i + wavelength / 2; j++) buffer[j] = Byte.MAX_VALUE; j = i + wavelength / 2; j < i + wavelength; j++) buffer[j] = Byte.MIN_VALUE; // for SynthPlayer.java 4(5) i = foursecmarker; i <= (buffersize - wavelength); i += wavelength) j = i; j < i + wavelength; j++) buffer[j] = (byte( 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(); (c) 2002-2006 Jouni Smed 7