Takaisin luentomateriaaliin

Musiikin soittaminen

Musiikin tai ääniefektin saa soimaan ohjelmaan melko lyhyellä lisäyksellä. Googletuksen perusteella kaikki ratkaisut eivät kuitenkaan tue kovin pitkiä tiedostoja. Jatkuvan musiikin saa lisättyä jos saman tiedoston laittaa toistoon jatkuvaksi vaikkakin jos käyttää loop-metodia niin on hyvä lopuksi muistaa käyttää myös stop-metodia.

import java.net.URL;
import java.applet.AudioClip;
import java.applet.Applet;

public class Esimerkki {

    private void haeJaSoitaMusiikki() {
      URL url = Esimerkki.class.getResource("Musiikki.wav");
      //URL url = new URL("src/Musiikki.wav");
      AudioClip aani = Applet.newAudioClip(url);
      aani.play();

    }
}

Tässä esimerkissä url on haettu Esimerkki-luokan sijainnin perusteella, mutta URL:n konstruktorin perusteella url:n voi määrittää myös kommentoidulla tavalla. Itse käytän tuota luokan perusteella hakua, koska se toimii myös sen jälkeen kun ohjelmasta on tehty suoritettava jar-paketti.

Kiitokset tästä esimerkistä ttpekkan:lle, joka etsi koodin omaan Väritestiinsä.

Äänen voimakkuuden säätäminen

Edelliselle lähestymistavalle en kuitenkaan löytänyt mitään tapaa säätää äänenvoimakkuutta, josta syystä tämä toinen esimerkki käyttääkin eri luokkia äänen toistamiseen.

import java.net.URL;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.FloatControl.Type;

public class Esimerkki {

    private Clip aani;
    private boolean aanetPaalla;

    private void haeMusiikki() {

      URL url = Esimerkki.class.getResource("Aani.wav");

      try {

        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);
        this.aani = AudioSystem.getClip();
        this.aani.open(audioInputStream);

        FloatControl gainControl = (FloatControl)this.aani.getControl(FloatControl.Type.MASTER_GAIN);
        gainControl.setValue(-10.0f);

      } catch (Exception e) {
        System.out.println("Äänitiedoston avaus ei onnistunut.");
        this.aanetPaalla = false;
      }
    }

    public void soitaAani() {

      if (aanetPaalla) {
        try {
          this.aani.start();
        } catch (Exception e) {}
      }
    }
}

Tässä esimerkissä en niinkään puutu Audio-luokkiin, koska olen niitä vasta kerran käyttänyt omassa ohjelmassa, mutta sen verran tuosta FloatControl:sta, että setValue-metodia käytettäessä arvon muutos asetetaan desibeleinä. Itsellä tuo menee vähän tuntemattomammalle puolelle joten olen arvioinut määriä kokeilemalla.

Takaisin luentomateriaaliin


Viimeksi muokattu 1.7.2012