忍者ブログ
研究室生活のメモ・・・だった過去の遺産。移転先→http://negimochix2.blogspot.com/
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Action Script 3.0でサウンドの一時停止,自動ループ再生ができた.
サウンドでは主に,
mp3の実体を扱うSoundクラス,
Soundクラスで再生を開始した音楽を制御するSoundChannelクラス

の2つが必要.
また,音量の調整,左右のスピーカーに流す割合を設定するには,SoundTransformクラスが必要.
SoundTransformクラスはSoundクラス専用というわけではなく,
Flash全体のサウンド(flvファイルのサウンドとかも)の設定にも使われるクラス.

最初は,↑の各クラスの役割をはっきり認識していなかったので,
一時停止をやっても2重再生とかのバグが起こって困った.

ソースはこんな感じ.
var sound:Sound = new Sound();
var soundCh:SoundChannel;

// サウンドの再生位置
var _currentPos:Number;
// 通常時のサウンドボリューム
var _soundVol:Number = 1.0;

var url:URLRequest = new URLRequest(mp3ファイル名);
// ロード開始
sound.load(url);
// サウンドのロード完了のイベントリスナー登録
sound.removeEventListener(Event.COMPLETE,
                          SoundCompleteHandler);

// サウンドのロード完了
function SoundCompleteHandler(event:Event) {
  // 位置0から再生開始
  soundCh = sound.play(0, 1);
		
  // 音量設定
  changeSoundVolume(_soundVol);

  // mp3の読み込み完了メソッド解除
  sound.removeEventListener(Event.COMPLETE,
                            SoundCompleteHandler);

  // 再生終了のイベントリスナー登録
  soundCh.addEventListener(Event.SOUND_COMPLETE,
                           SoundChannelCompleteHandler);
}

// サウンドの一時停止
function pauseMusic():void {
  // 再生位置を保存
  _currentPos = soundCh.position;
  // ストップ
  soundCh.stop();
  // SoundChannelの開放
  soundCh.removeEventListener(Event.SOUND_COMPLETE,
                              SoundChannelCompleteHandler);
  soundCh = null;
}

// サウンドの再生
function restartMusic():void {
  // 保存した再生位置から再生
  soundCh = sound.play(_currentPos, 1);
  soundCh.addEventListener(Event.SOUND_COMPLETE,
                           SoundChannelCompleteHandler);
  // 音量設定
  changeSoundVolume(_soundVol);
}

// 音量調整
function changeSoundVolume(setVol:Number):void {
  // 音量の制御用クラス
  var soundTrans:SoundTransform;

  soundTrans = soundCh.soundTransform;
  soundTrans.volume = setVol;
  soundCh.soundTransform = soundTrans;
}

// サウンド再生の終了イベント(ループ再生用)
function SoundChannelCompleteHandler(evt:Event):void {
  // 安全のため開放
  soundCh.removeEventListener(Event.SOUND_COMPLETE, 
                              SoundChannelCompleteHandler);
  soundCh = null;
	
  // 最初から再生
  soundCh = sound.play(0, 1);
  soundCh.addEventListener(Event.SOUND_COMPLETE, 
                           SoundChannelCompleteHandler);

  // 音量設定
   changeSoundVolume(_soundVol);
}

Soundクラスのstartメソッドの返り値がSoundChannelクラス.
以後,得られたSoundChannelを使ってサウンドを制御する.

サウンドの一時停止は,flvの場合と違ってpauseメソッドがない.
なので,再生位置を予め保存しておいて,SoundChannelクラスを破棄する.
ここで,SoundChannelクラスがちゃんと破棄されていないと後で再生をしたときに2重再生の原因となるので注意.
再生時は,保存しておいた再生位置をstartメソッドの第1引数に指定でおk.

ループ再生自体は,Soundクラスのstartメソッドの第2引数でリピート回数を指定すればいいんだけど,これじゃリピートが有限になっていつかは止まってしまう.
なので,常に自動的にループさせるには,1回の再生にしておいて,再生終了後のイベントが起きたときに,再び最初から再生させればいい.

上のソースをクラスとして作っておいて, さらに再生位置の移動,ボリューム設定を追加した結果,こんな感じのFlashができました.
test_sound


ちなみに,今回使用させていただいた音楽はこちら.

PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Infomation
くさもち 【中の人】
・くさもち
・ボカロ廃大学院生
・βからのニコ厨
・もちろん非リア充
・ミクZ4 第二期個人スポンサー

【メール】
・negimochi.tabetai(゚Д゚)gmail.com
(゚Д゚)→@

【その他やってるもの】
Twitter

・これは痛いピアプロ
・過去の遺産smart.fm

【作ったもの】
・製作に参加したDTX GDPメインサイト
で,実際に作ったIRページ
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Heartsnative
『Heartsnative/MOSAIC.WAV×鶴田加茂 feat.初音ミク』応援中!
VOCALOID Ranking Watcher
新曲は常にチェックすべし。
真・フルみっくすプレイヤー
おすすめ記事
jubeat ripples
今更やってみる