2010/09/26(日) [n年前の日記]
#2 [flash] Flashでサウンドデータを鳴らすべく実験中
- Flash CS* で wav をライブラリに登録。ActionScript用に書き出す設定にしておく。
- Flash CS* でパブリッシュ。wav は Flash CS* 上でmp3変換される。本来鳴らすべき範囲も情報として保存されているのであろう、サウンドデータを含んだだけのswfができる。
- swfmill で、Flash CS*が吐き出した swf を内部リンケージ。
- FlashDevelop上で記述したスクリプトの中で、内部リンケージした外部swfの中にあるサウンドデータを呼び出す。
swfmill.xml は以下のような感じになった。
<?xml version="1.0" encoding="UTF-8" ?> <movie width="800" height="600" framerate="30" version="7"> <background color="#ffffff"/> <frame name="first"> <library> <clip id="SNDRES" import="sndres.swf" /> <clip id="IMG_BG" import="img/bg.jpg" /> </library> </frame> </movie>ID名=SNDRES、sndres.swf というのが、Flash CS* で吐き出した、サウンドデータを内部リンケージしている swf。
ActionScript側は、以下のような感じ。
class Main { public static function main(swfRoot:MovieClip):Void { // ---------------------------------------- // サウンド関係初期化 var sn:Number = 0; // サウンド番号管理用 var svol:Number = 80; // サウンド音量記録用 (0-100) // サウンドデータのリンケージID名一覧 var sndid:Array = [ "bell_kan.wav", // 0 "bell_kin.wav", // 1 "bell_kon.wav", // 2 "bgm02.wav", // 3 "bgm03.wav", // 4 "bgm05.wav" // 5 ]; // サウンドデータを内部リンケージしたswfを呼び出す var sndres:MovieClip = _root.attachMovie("SNDRES", "sound_res", _root.getNextHighestDepth()); sndres._visible = false; // 念のために非表示にしておく // Soundオブジェクト生成 var sd:Array = new Array(); for (var i:Number = 0; i < sndid.length; i++) { sd[i] = new Sound(sndres); sd[i].attachSound(sndid[i]); } // ※ 各サウンドに対して、個別に Volume や Pan 等を設定したい場合は、 // それぞれを MovieClip として生成(?)しなければならないらしいが、 // 今回そこまではやっていない。 // サウンド関係初期化はここまで // ---------------------------------------- // 表示関係の初期化 // (省略) // ---------------------------------------- // 各ボタンの処理 // サウンドを鳴らすボタンの処理 playbtn.onPress = function () { if ( (sn >= 3) && ( sn <= 5) ) { // BGM sd[sn].setVolume(svol); // (これから鳴らすサウンドの)音量を指定 // ループ回数として指定できる最大数が不明なので、ひとまず大きめの値を仮で指定。 sd[sn].start(0, 9999999); } else { // SE sd[sn].setVolume(svol); // SEはワンショットだけ鳴らせばいいはずなので、ループ回数には1を指定。 sd[sn].start(0, 1); } } // サウンドを停止するボタンの処理 stopbtn.onPress = function () { if ( (sn >= 3) && ( sn <= 5) ) { // BGM // stop(リンケージID名) として呼ばないと、他の音も停止してしまう。 sd[sn].stop(sndid[sn]); } else { // SE (SEは勝手に停止するはずなので何もしない) } } // サウンドを全停止するボタンの処理 stopallbtn.onPress = function () { // MTASC利用時は、stopAllSounds() を記述できない模様。未実装、もしくはバグかもしれず。 // stopAllSounds(); // stop() にID名を渡さずにを呼ぶことで、 // 動的に鳴らした全てのサウンドが停止するらしいので、これで代用する。 sd[sn].stop(); } // サウンド番号を増減するボタンの処理 // (省略) // 音量を設定するボタンの処理 // (省略) // 毎フレームの処理 _root.onEnterFrame = function () { // (省略) } } }
[ ツッコむ ]
以上です。