TITLE:Wavファイルの演奏

Wavファイルの演奏

編集者:Terai Atsuhiro~

作成日:2004-08-16
更新日:2021-03-14 (日) 19:51:22
  • category: swing folder: Sound title: Wavファイルの演奏 tags: [AudioSystem, Sound] author: aterai pubdate: 2004-08-16T00:28:04+09:00 description: AudioSystemを使って、AudioInputStream、Clip(Line)などを作成取得し、wavファイルを演奏します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTTj2hYTjI/AAAAAAAAAko/8dQ-XleMZBc/s800/Sound.png

概要

AudioSystemを使って、AudioInputStreamClip(Line)などを作成取得し、wavファイルを演奏します。

概要

AudioSystemを使って、AudioInputStream、Clip(Line)などを作成取得し、wavファイルを演奏します。

#screenshot

サンプルコード

#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
URL url = getClass().getResource("notice1.wav");
#spandel
AudioInputStream sound = AudioSystem.getAudioInputStream(url);
#spanend
#spandel
AudioFormat format = sound.getFormat();
#spanend
#spandel
DataLine.Info di = new DataLine.Info(Clip.class, format);
#spanend
#spandel
Clip clip = (Clip) AudioSystem.getLine(di);
#spanend
#spandel
clip.open(sound);
#spanend
#spandel
clip.start();
#spanend
#spanadd
try (AudioInputStream sound = AudioSystem.getAudioInputStream(url);
#spanend
     Clip clip = (Clip) AudioSystem.getLine(new DataLine.Info(Clip.class, sound.getFormat()))) {
  SecondaryLoop loop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
  clip.addLineListener(e -> {
    LineEvent.Type t = e.getType();
    if (Objects.equals(t, LineEvent.Type.STOP) || Objects.equals(t, LineEvent.Type.CLOSE)) {
      loop.exit();
    }
  });
  clip.open(sound);
  clip.start();
  loop.enter();
#spanadd
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
#spanend
  ex.printStackTrace();
  Toolkit.getDefaultToolkit().beep();
#spanadd
}
#spanend
  • &jnlp;
  • &jar;
  • &zip;

解説

WAVE、AU、AIFF、SND形式のサウンドファイルが演奏できるようです。

解説

AudioSystemを使用すれば、WAVEAUAIFFSND形式のサウンドファイルが演奏可能です。

参考リンク

  • "taitai studio" フリーWav素材集
    • 上記のサイトのwavファイルをサンプルとして利用しています。
  • AudioInputStreamClipAutoCloseableで自動的に開放するためtry-with-resourcesブロックで作成
  • 演奏開始後にSecondaryLoopで現在のスレッドをブロックし新しいセカンダリイベントループで演奏を継続
  • 演奏終了イベントをLineListenerで受け取るとセカンダリイベントループを終了して現在のスレッドに戻りclose()が自動的に実行される

コメント

参考リンク

コメント