【 2015/03/02更新 】
最近自分でも使いましたが、なにぶん昔に組んだものでして設計や使い方にクセもあり、うまく制御しにくいことがありました。。『あまり期待してはいけないライブラリ』として扱って頂けますと僕の気も楽になりますし、使って頂いてもし不幸なことがあっても石を投げないでくださいよろしくおねがいしますm( )m
【 2012/07/03更新 】
addBGM()、addSE()でSoundクラスを直接指定出来るようにしました。対応遅くなってすみません。。
こんにちは!
突然なんですけど、自分用にSoundManagerをAS3で書いたので、もしよかったらみんな4の5の言わずに使ってみてください!
そして募金でもしてください!今すぐSoundManager募金して東日本の復興に充ててください!さあ早く!急いで!
ダウンロード・使い方については以下をご覧くださいませ。
SoundManager って何ですか?
Flashで音を鳴らすことに特化しただけのクラスライブラリです。それ以外のことは(ver0.85の時点では)出来ません。
AS3で普通に書くと、ただ音を鳴らして音量ON/OFFするだけでも案外めんどくさくなるのですが、
そのあたりを意識せずに数行の記述で簡単に扱いたいな、と思って書きました。
自分用に書いたので多少のクセはありますけれど、ある程度の基準に達したと判断したので公開します。
設計コンセプト・実装してない機能など
- Soundクラスの概念を意識しなくても使えるように
- staticなクラスとしてどこからでも呼び出せるように
- soundの制御は基本的にplay(),stop()の切り替えではなく音量の操作で行うことを想定
- soundを種類に応じてBGMとSEに分けて管理する。
- BGMの特性 → ループ再生する、重ね再生できない
- SEの特性 → ループ再生しない、重ね再生できる
- バグ回避の観点から、フェードアウトしながらのstop()と、pause()、resume()は実装から外しています
- 現バージョン(ver0.85)では、Tweenerの力を借りているのでTweenerを同梱しないと動きませんが、いずれなくても動作するようにしたいです。他Tween系ライブラリをお使いの人でも、同梱するTweenEngine.asを一部書き換えるだけで動かせると思います
ちなみにSoundManager.asにはもうちょっと踏み込んでメモってます。
ダウンロード
- SoundManager [jp.sakotsu.sound] ver.0.85 (2012/7/3更新)
http://sakotsu.jp/flash/work/soundmanager/lib_ver085.zip
※Tween系ライブラリ『Tweener』を同梱しています。
とても助かっていますいつもありがとうございます。好きです、Tweener!
いずれ、Tweener無しでも動くようにしたいです。
ライセンス形態について
商用・非商用に限らず自由に使って頂いてもちろん結構です!その替わり、文句だけは言わないでくださいw
動作サンプル
SoundManagerの基本的な使い方
[使い方その1] Flashのライブラリに音声ファイル(mp3, wavなど)を読み込む
Flashのライブラリに、使いたい音声ファイル(mp3, wavなど)を読み込み、
「ActionScriptに書き出し」「最初のフレームに書き出し」にチェックを入れます。
Flashのライブラリ上での操作はこんな感じです。
リンケージで設定したクラス名を指定して使いますので適当に「BGM1」や「SE1」などと命名してください。
これをswcファイルとして書き出せば、Soundクラスとしてimportして使うこともできます。
以降の解説では、これら「ActionScriptに書き出し」でクラス指定した音素材を総称してsoundと記述することとします。
[使い方その2] SoundManagerを初期化してからsoundを追加する
まず、初期化の一文を書きます。
SoundManager.init();
次に、soundをSoundManagerに登録します。
SoundManager.addBGM("bgm1", "BGM1"); SoundManager.addSE("se1", "SE1");
Soundクラスとして読み込む場合は、
SoundManager.addBGM("bgm1", new BGM1() ); SoundManager.addSE("se1", new SE1() );
とします。
音素材の用途に合わせて、『BGM』と『SE』に分けて登録します。
「ループ再生する、重ね再生できない」soundは『BGM』として、
「ループ再生しない、重ね再生できる」soundは『SE』として、addBGM() / addSE()で登録します。
addBGM() / addSE()の第1引数には、soundと紐付ける任意のsoundIDを記述し、第2引数にはリンケージ名/Soundクラス名を指定します。また、addBGM()の第3引数でloopの有無も指定できます(省略可。標準はtrue)。
同じIDで複数登録すると一番最後のものが反映されます。
addExternalBGM() / addExternalSE()でも同様に、外部ファイルへのパスを直接指定して登録することが出来ます。
SoundManager.addExternalBGM("bgm2", "external_bgm.mp3"); SoundManager.addExternalSE("se2", "external_se.mp3");
この場合、再生はストリーミング形式になります。(参考:flash.media.Sound (ActionScript 3.0))
[使い方その2] 再生する
soundを再生するにはplay()を実行します。
SoundManager.play("bgm1"); SoundManager.play("se1", 3); // 3秒掛けてフェードイン再生
play()の第1引数に再生したいsoundのIDを指定します。
第2引数を追加することで、フェードイン再生を秒数指定できます。
stop()で再生を停止します。
SoundManager.stop("bgm1");
ここで1つだけ注意点があります。
残念ながらstop()ではフェードアウトしながらの停止は実装していません。
これは僕の力不足の為、今のところ泣く泣く実装から外しています。バグ挙動の回避の為です、すみません。
どうしてもフェードアウト停止させたい場合は、音量を0にフェードアウトした後で停止させるなどで強引になんとかしてください。。
[使い方その3] 音量を調整する
基本的には、音量はBGMとSEごとに管理します。
全てのBGMを一括操作するにはsetVolumeBGM()を、
全てのSEを一括操作するにはsetVolumeSE()を使います。
音量を制御するつまみにこれを割り当てると便利だと思います。
第1引数に音量を0~1の範囲で指定します。第2引数でフェードイン/フェードアウトも指定できます。
SoundManager.setVolumeBGM(0.5); SoundManager.setVolumeSE(0.5, 1);
また、個別のsoundの音量だけを操作したい場合には、setVolume()を使います。
第1引数にsoundのIDを、第2引数に音量を、第3引数でフェードイン/フェードアウトも指定できます。
SoundManager.setVolume("bgm1", 0.5, 1);
[使い方その4] ミュート状態を交互に切り替える
SoundManager.toggleMuteBGM(); SoundManager.toggleMuteSE(1);
toggleMuteBGM()を実行すると、BGMに登録しているsound全てに対してmute/unMuteを交互に切り替えます。
toggleMuteSE()も同様に、SE全てに対して切り替えます。
引数を追加することで、フェードイン/フェードアウトを秒数指定できます。
通常、この記述だけで簡易なBGMの切り替えに関しては事足りるんじゃないかと思います。
toggleMuteBGM()/toggleMuteSE()の切り替え状態(true or false)は以下のプロパティ(読み込み専用)で参照できます。
デフォルト値はどちらもfalse(ミュート状態にない:音が出る)です。
trace( SoundManager.isMuteBGM ); //Boolean trace( SoundManager.isMuteSE ); //Boolean
これらのミュート状態を交互に切り替えるのではなく、直接一括で操作したい場合は以下のメソッドを使います。
SoundManager.setStatus(false, true, 1);
setStatus()の第1引数でBGM登録したsoundを、第2引数でSE登録したsoundに対する音の可否設定を指定します。
(true:聴こえる / false:聴こえない)
第3引数を追加することで、フェードイン/フェードアウトを秒数指定できます。
上記の記述例だと、「BGMをmute(音消し)にして、SEはunMute(聞こえる状態)」に1秒掛けてフェードさせます。
このメソッドの場合は、trueが「音が聞こえる」状態なので注意。
[使い方その5] その他のメソッド
上記以外のメソッドも紹介しておきます。
SoundManager.removeBGM("bgm1"); SoundManager.removeSE("bgm1");
addBGM() / addSE()で登録したsoundをIDを指定してリストから外します。
勝手に操作されたくないsoundがある場合は、removeしておきましょう。
再生中のsoundには実行されませんので、stopしてからremoveしてください。
SoundManager.setPanBGM(-1, 1); SoundManager.setPanSE(1, 1);
setPan()を全BGM/全SEに対して実行します。
SoundManager.setPan("bgm1", -1, 1);
個別にsoundの定位を操作します。
第1引数にsoundのIDを、第2引数に-1~1の範囲でNumber型で指定して-1(左スピーカーから出力)~0(標準)~ 1(右スピーカーから出力)を設定します。
第3引数を追加すれば、フェード効果を秒数指定できます。
SoundManager.stopBGM(); SoundManager.stopSE();
登録している全BGM/全SEの再生を停止します。
stop()と同じくフェードアウトしながらの停止はできません。
SoundManager.muteAllBGM(); SoundManager.unMuteAllBGM(1); SoundManager.muteAllSE(); SoundManager.unMuteAllSE(1);
全BGM/全SEに対して、mute/unMuteを指定します。
[使い方その6] プロパティ
便利かもしれないプロパティを紹介します。
trace( SoundManager.bgmList ); //Array trace( SoundManager.seList ); //Array trace( SoundManager.isAvailable("bgm1") );// Boolean;
bgmList/seListで、全BGM/全SEに登録してあるsoundのID一覧を配列で返します。
isAvailable()は、指定のIDが登録されているかどうかを返します。
trace( SoundManager.isPlaying("bgm1") ); //Boolean; trace( SoundManager.isMute("bgm1") ); //Boolean; trace( SoundManager.getProperty("bgm1") ); //String;
上から、指定したsoundに対して「再生中であるかどうか」「ミュート状態であるか」「プロパティ一覧」を取得できます。
こういう使い方も出来ます
大掛かりなフルフラッシュサイトを作る場合などで、
例えば、音素材だけを内包したsound.swfを親swfがLoaderで読み込んで使う、といったケースがあるかと思います。
その場合は、以下のような記述をすればOKです。
// [1] sound.swfを読み込む。ApplicationDomainの設定がポイント var _loader:Loader = new Loader(); _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onCompleteSoundSwf); _loader.load( new URLRequest("sound.swf"), new LoaderContext(false, ApplicationDomain.currentDomain) ); // [2] 読み込み完了後、sound.swfに内包された"BGM4"を指定して使えるようになります private function _onCompleteSoundSwf(e:Event):void { SoundManager.addBGM("bgm4", "BGM4"); SoundManager.play("bgm4"); }
Loaderクラスのメソッドloadの第2引数に指定するLoaderContextのプロパティの
アプリケーションドメインにApplicationDomain.currentDomainを指定します。
アプリケーションドメインについてよくわからない人は、ここを見てたらい回しにされるか、諦めて上のソースをコピペしてください。
最後に
今回、自分用のSoundmanagerを作るに当たって、githubに散在する偉大なる先人のSoundManagerなどを参考にさせて頂きました。(ありがとうございます!勉強になります!)
なので、sakotsu製のが肌に合わない方は、他の方のものを探すか、諦めて自分で組んでください。
意見・要望・バグ報告等ありましたらコメント欄に書いてくだされば、改良していくかもしれませんが、
緊急サポートは保障出来ませんので悪しからずお願い致します。
あと、このSoundManagerの不具合等により被害を被ったとしても、僕はあなたに対して「ごめんな・・」と言いながら缶コーヒーを奢る事ぐらいしか出来ません。
以上、よろしくお願い致します。