2003 -0206 ver 1.00 発行 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/java/jmaga/      ┃ ┃'&┃&''*┃*''%┃%'      (C)2003 斎藤末広 jmaga@yscon.co.jp  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 前回の発行部数 7900部(まぐまぐ:6587 melma!:741 Pubzine:476             ティアラオンライン:19 めろんぱん:77) ★解除・登録 :http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ★バックナンバー :http://www.yscon.co.jp/j/java/jmaga/ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第36号 2003/02/06  基本テクニック編 サウンド ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE, SDK(JDK) 1.4.0,IE 5.5 を前提としています。  拡張子を表示するに設定してください。 ========================================================================= 交換広告(交換希望の方は,jmaga@yscon.co.jpまで) ==PR================================================================== ▽▲▽▲▽▲▽▲▽▲▽▲▽▲▽▲▽ ソフトウェア開発 / 基本情報技術者  のんびりやろう!情報処理試験!  初級シスアド / その他高度試験対策 △▼△▼△▼△▼△▼△▼△▼△▼△ 無料メールマガジンを毎日発行中! >>>>>>>> 登録はこちら >>>>>>>> http://www.melonpan.net/mag.php?000078 ==================================================================PR== ======================================================================== ▼ サウンド  この号では,Java のアプレットで,音を扱うにはどうしたらいいか,見てみる ことにしましょう。  Javaのアプリケーション,JavaScriptで音を扱うのは,複雑な要素が多いため 将来扱うことにします。 ------------------------------------------------------------------------ ▼ 単純な例  まず,アプレットで音を扱う単純な例を見てみましょう。 例 j36-01 xAudio01.java アプレット上のサウンド再生 単純な例 ソース http://www.yscon.co.jp/j/java/jmaga/j36/xAudio01.java 実行  http://www.yscon.co.jp/j/java/jmaga/j36/xAudio01.htm 1: /* 2: アプレット上のサウンド再生 単純な例 3: */ 4: import java.applet.Applet; 5: import java.applet.AudioClip; 6: import java.awt.Graphics; 7: 8: public class xAudio01 extends Applet { 9: 10: AudioClip xaClip; 11: 12: public void init(){ 13: xaClip = getAudioClip(getCodeBase(), "soother_dl.mid"); 14: } 15: 16: public void start(){ 17: xaClip.play(); 18: } 19: 20: public void paint(Graphics xgPen){ 21: xgPen.drawString("音再生テスト 作曲:アーク佐野", 100, 200); 22: } 23: 24: public void stop(){ 25: xaClip.stop(); 26: } 27: } 注意:xAudio01で利用しているMIDIは,アーク佐野氏の作曲です。 http://www.arksano.com/  AudioClip インターフェースを利用することで,上のサンプルのように,簡単 にサウンドを再生できます。  「インターフェース」というのは,Jマガでは,「クラスもどき」と呼んできま した。クラスのような働きをします。「インターフェース」は,別の号でいずれ 解説をします。ここでは,クラスのようなものであると理解しておいて下さい。  AudioClip の仕事(メソッド)は,play(),loop(),stop() があります。xAudio01 では,start() の中で,play() を利用しています。これを,loop() にすると, 再生を繰返します。play() だけだと,1回再生したら終わりになります。  再生が出来る音のファイル形式は,MIDI 形式と au 形式です。mp3 のような他 の形式も再生することはできますが,特別な工夫をする必要があります。 ------------------------------------------------------------------------ ▼ 再生ボタンの追加  再生ボタンを追加してみましょう。 例 j36-02 xAudio02.java アプレット上のサウンド再生 再生ボタン追加 ソース http://www.yscon.co.jp/j/java/jmaga/j36/xAudio02.java 実行  http://www.yscon.co.jp/j/java/jmaga/j36/xAudio02.htm 1: /* 2: アプレット上のサウンド再生 再生ボタン追加 3: */ 4: 5: import java.applet.Applet; 6: import java.applet.AudioClip; 7: import java.awt.Graphics; 8: 9: import java.awt.event.ActionListener; // ボタン係 10: import java.awt.Button; // ボタン 11: import java.awt.event.ActionEvent; // ボタンセンサ 12: 13: public class xAudio02 extends Applet { 14: 15: Button xbtnPlay = new Button("開始"); 16: Button xbtnStop = new Button("停止"); 17: 18: class xButtonAdapter implements ActionListener{ 19: public void actionPerformed(ActionEvent xbs){ 20: if (xbs.getSource() == xbtnPlay){ 21: xaClip.play(); 22: } 23: if (xbs.getSource() == xbtnStop){ 24: xaClip.stop(); 25: } 26: } 27: } 28: 29: xButtonAdapter xadpPlay = new xButtonAdapter(); //ボタン係01生成 30: xButtonAdapter xadpStop = new xButtonAdapter(); //ボタン係02生成 31: 32: AudioClip xaClip; 33: 34: public void init(){ 35: 36: add(xbtnPlay); 37: add(xbtnStop); 38: xbtnPlay.addActionListener(xadpPlay); 39: xbtnStop.addActionListener(xadpStop); 40: 41: xaClip = getAudioClip( getCodeBase(), "soother_dl.mid"); 42: } 43: 44: public void paint(Graphics xgPen){ 45: xgPen.drawString("音再生テスト 作曲:アーク佐野", 10, 50); 46: } 47: 48: public void stop(){ 49: xaClip.stop(); 50: } 51: } 注意:xAudio02で利用しているMIDIは,アーク佐野氏の作曲です。 http://www.arksano.com/  ボタンを追加すると,プログラムが複雑になりました。ボタンの組み込み方法 の復習をかねて説明します。  ボタンは,3つのクラス/インターフェース(クラスもどき)といっしょに働き ます。  その3つとは, 9: import java.awt.event.ActionListener; // ボタン係 10: import java.awt.Button; // ボタン 11: import java.awt.event.ActionEvent; // ボタンセンサ  で import されているものです。  Button クラスは,ボタンの見た目を作ります。 15: Button xbtnPlay = new Button("開始"); 16: Button xbtnStop = new Button("停止");  で,「開始」「停止」と表示されるボタンを作っています。  ActionListener インタフェース(クラスもどき)は,これを実装(implement)した クラスによって,ボタンが押されたときの動作を担当します。「ボタン係り」です。 18: class xButtonAdapter implements ActionListener{ 19: public void actionPerformed(ActionEvent xbs){ 20: if (xbs.getSource() == xbtnPlay){ 21: xaClip.play(); 22: } 23: if (xbs.getSource() == xbtnStop){ 24: xaClip.stop(); 25: } 26: } 27: }  で,ボタンが押されたときの仕事を定義しています。この仕事をするクラスを xButtonAdapter という名前にしました。xButtonAdapterは,ActionLister を実装 したといわれます。  3つめは, 19: public void actionPerformed(ActionEvent xbs){  に登場している。ActionEvent クラスです。ActionEvent クラスは,ボタンが 押されたかどうかを常時監視しています。 19: public void actionPerformed(ActionEvent xbs){ 20: if (xbs.getSource() == xbtnPlay){ 21: xaClip.play(); 22: } 23: if (xbs.getSource() == xbtnStop){ 24: xaClip.stop(); 25: } 26: }  で,押されたボタンが,xbtnPlay ボタン(開始ボタン)なら,音声を play() で 再生し,xbtnStop ボタン(停止ボタン)なら,音声を stop() すると定義しています。  次は,アニメーションをしながら音を再生する例をみましょう。 ------------------------------------------------------------------------ ▼ 爆弾アニメーション  爆弾に火がついて,爆発するアニメに音をつけてみます。爆弾に火がついてい 絵を2つ用意してそれを交互に表示し,時間がたったら,爆発させます。そのと きに爆発した絵に差し替えし,さらに,爆発音を再生します。 例 j36-03 xBomb.java 爆弾アニメーション ソース http://www.yscon.co.jp/j/java/jmaga/j36/xBomb.java 実行  http://www.yscon.co.jp/j/java/jmaga/j36/xBomb.htm 1: /* 2: 爆弾アニメーション 3: */ 4: import java.applet.Applet; 5: import java.awt.Graphics; 6: import java.awt.Image; 7: import java.applet.AudioClip; 8: 9: public class xBomb extends Applet implements Runnable { 10: 11: Thread xthKeeper; 12: Image ximgDokiDoki01, ximgDokiDoki02, ximgDokan; 13: 14: int ximgDokiNo; 15: int xdokiDokiTime; 16: boolean xbomb; 17: 18: AudioClip xaClip01 = null; 19: AudioClip xaClip02 = null; 20: 21: public void init(){ 22: xaClip01 = getAudioClip( getCodeBase(), "sounddoki.au"); 23: xaClip02 = getAudioClip( getCodeBase(), "sounddokan.au"); 24: 25: ximgDokiDoki01 = getImage(getCodeBase( ), "dokidoki01.gif"); 26: ximgDokiDoki02 = getImage(getCodeBase( ), "dokidoki02.gif"); 27: ximgDokan = getImage(getCodeBase( ), "dokan.gif"); 28: } 29: 30: public void start(){ 31: xaClip01.loop(); 32: xthKeeper = new Thread(this); // スレッド生成 33: xthKeeper.start(); // スレッド開始(ready状態へ) 34: xbomb = false; 35: xdokiDokiTime = 0; 36: ximgDokiNo = 1; 37: } 38: 39: // Runnable対象部分 スレッド実行の時間管理 40: public void run(){ 41: while(xthKeeper != null){ // 実行を継続する条件 42: try { 43: Thread.sleep(300); 44: } 45: catch(InterruptedException xe){ 46: } 47: xdokiDokiTime = xdokiDokiTime + 1; 48: repaint(); // 繰返し仕事(画面書き換え) 49: } 50: } 51: 52: // 画面に表示(繰返し仕事) 53: public void paint(Graphics xgPen){ 54: if ((xdokiDokiTime > 10) && !(xbomb)){ 55: xthKeeper = null; 56: xbomb = true; 57: xaClip01.stop(); 58: xaClip02.play(); 59: } 60: if (xbomb) { 61: xgPen.drawImage(ximgDokan,0,0,this); 62: }else{ 63: if (ximgDokiNo == 1){ 64: xgPen.drawImage(ximgDokiDoki01,0,0,this); 65: ximgDokiNo = 2; 66: }else{ 67: xgPen.drawImage(ximgDokiDoki02,0,0,this); 68: ximgDokiNo = 1; 69: } 70: } 71: // xgPen.drawString(""+xdokiDokiTime, 100,100); // テスト用 72: } 73: 74: public void stop(){ 75: xthKeeper = null; 76: } 77: } 注意:xBomb で利用しているサウンドファイルは,「音辞典vol12」(株)データク ラフト発行の素材を利用し,au形式にしたものです。著作権フリーではありませ んので,再配布をすることはできません。 http://www.sozaijiten.com/products/otojiten/vol12/vol12.html  サウンドは,2種類使用しています。導火線で火が燃えている音と,爆発音 です。 18: AudioClip xaClip01 = null; 19: AudioClip xaClip02 = null;  で宣言して,音ファイルの読み込みは, 22: xaClip01 = getAudioClip( getCodeBase(), "sounddoki.au"); 23: xaClip02 = getAudioClip( getCodeBase(), "sounddokan.au"); で行っています。  導火線が燃えているときのアニメーションの絵と爆発のときの絵は, 12: Image ximgDokiDoki01, ximgDokiDoki02, ximgDokan; で宣言して 25: ximgDokiDoki01 = getImage(getCodeBase( ), "dokidoki01.gif"); 26: ximgDokiDoki02 = getImage(getCodeBase( ), "dokidoki02.gif"); 27: ximgDokan = getImage(getCodeBase( ), "dokan.gif"); で画像ファイルを読み込んでいます。 21: public void init(){ 22: xaClip01 = getAudioClip( getCodeBase(), "sounddoki.au"); 23: xaClip02 = getAudioClip( getCodeBase(), "sounddokan.au"); 24: 25: ximgDokiDoki01 = getImage(getCodeBase( ), "dokidoki01.gif"); 26: ximgDokiDoki02 = getImage(getCodeBase( ), "dokidoki02.gif"); 27: ximgDokan = getImage(getCodeBase( ), "dokan.gif"); 28: } は,このプログラムを最初に動作されるときに一度だけ実行される部分です。 30: public void start(){ 31: xaClip01.loop(); 32: xthKeeper = new Thread(this); // スレッド生成 33: xthKeeper.start(); // スレッド開始(ready状態へ) 34: xbomb = false; 35: xdokiDokiTime = 0; 36: ximgDokiNo = 1; 37: } は,表示されるとき実行されます。最小化された画面が元サイズに戻されたとき も実行されます。xBomb では,プログラムが実行されたとき,また,最小化され た画面がもとサイズもどされたときに,導火線に火がつきます。 39: // Runnable対象部分 スレッド実行の時間管理 40: public void run(){ 41: while(xthKeeper != null){ // 実行を継続する条件 42: try { 43: Thread.sleep(300); 44: } 45: catch(InterruptedException xe){ 46: } 47: xdokiDokiTime = xdokiDokiTime + 1; 48: repaint(); // 繰返し仕事(画面書き換え) 49: } 50: }  アニメーションのパラパラの時間間隔をきめています。300ミリ秒ごとに絵を 出すようにしています。絵を出した回数を xdokiDokiTime で数えます。 52: // 画面に表示(繰返し仕事) 53: public void paint(Graphics xgPen){ 54: if ((xdokiDokiTime > 10) && !(xbomb)){ 55: xthKeeper = null; 56: xbomb = true; 57: xaClip01.stop(); 58: xaClip02.play(); 59: } 60: if (xbomb) { 61: xgPen.drawImage(ximgDokan,0,0,this); 62: }else{ 63: if (ximgDokiNo == 1){ 64: xgPen.drawImage(ximgDokiDoki01,0,0,this); 65: ximgDokiNo = 2; 66: }else{ 67: xgPen.drawImage(ximgDokiDoki02,0,0,this); 68: ximgDokiNo = 1; 69: } 70: } 71: // xgPen.drawString(""+xdokiDokiTime, 100,100); // テスト用 72: }  一こまずつの絵の部分です。導火線が燃えているとき,爆発したときを判断し て絵を決めています。導火線が燃えているときは,2つの絵を交互に表示するよ うにしています。  爆発するときは,xaClip01 の音を止めて,xaClip02 の音を再生開始をしてま す。 57: xaClip01.stop(); 58: xaClip02.play(); のところです。 71: // xgPen.drawString(""+xdokiDokiTime, 100,100); // テスト用 は,爆発のタイミングなどをテストするときに 頭の // をとって有効にして, 絵の表示回数を調べています。なくても動作しますが,テストのときのために, 余分につけています。 ------------------------------------------------------------------------ ▼ サウンドの取り扱い  アプレットでのサウンドの取り扱いは,この号で説明したことが基本です。  しかし,Java でのサウンドの取り扱いは,MP3プレイヤーを作成できるほど, クラスが用意されています。かなり複雑なプログラムになりますので,いづれの 号で,扱いたいと思います。 ----☆PR☆--------------------------------------------------------------           コンピュータ関係の資格を取りたい方へ              毎日届く,宿題メールの勉強仲間に入りませんか? .&&&& **** %%%%. &&&&&&******%%%%%% 登録: http://backno.mag2.com/reader/Back?id=0000001414 '&┃&''*┃*''%┃%' 発行元:末広ページ http://3721p.com --------------------------------------------------------------☆PR☆---- ------------------------------------------------------------------------ ▼ 次号の予定  次号では,StringBufferクラスの説明をします。  知りたいテクニック,また,解説してほしいクラスなどリクエストお寄せくだ さい。 ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,プログラムソースの利用は,商用を含めて,再利用,改変, 発表を制限しません。  画像や音などの素材は,それぞれ著作権があります。著作者に承諾なしに再利 用はできません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガに対するご意見をお待ちしています。ぜひ,ご返信下さい。 内容のレベルは 1 難しいのでもっと簡単にしてほしい 2 ちょうどよい 3 もっと難しくてもよい その他ご要望