こんにちは
先日入社したFlex好きPHPプログラマのaragaです。

AstroのDynamic Sound GenerationとFileReferenceをFlexで試してみました。

Flash Player10のインストールとFlexBuilderでのAstroの使い方は Spark project の wiki とか kamijoさんのブログを参考にしてください。

やりたいこと

  • FileReferenceを使ってローカルのMP3を再生する。
  • 再生中のMP3にエフェクトをかける。

FileReferenceからByteArrayを取得する

基本
FileReference.load()
-> complete
-> FileReference.data
で、ファイルのByteArrayがとれます。

Imageやswf、textに使用する場合は、Loader.loadBytes( FileReference.data) で
後はいつもと同じなのですが、mp3はそんなにうまいこといきません。

僕もmp3のByteArrayからSoundオブジェクト作成に挑戦しましたが、
力至らずGoogle先生に聞いてみたところ、既にMP3FileReferenceLoaderというライブラリがありました

使い方は簡単です。

private var fileRef:FileReference // fileRef.browse(); のselectイベント後 private function playSound():void { var loader:MP3FileReferenceLoader = new MP3FileReferenceLoader(); loader.addEventListener(MP3SoundEvent.COMPLETE, loaderCompleteHandler); loader.getSound(fileRef); } private function loaderCompleteHandler(event:MP3SoundEvent):void { loader.removeEventListener(MP3SoundEvent.COMPLETE, loaderCompleteHandler); var mp3Sound:Sound = event.sound; }

簡単にSoundオブジェクトをとれました

MP3にエフェクト

Adobe Is Making Some Noise Part 3を参考にしました

Sound.extract() と Sound.samplesCallbackData を使います

ポイントはplayしていないSoundからextract()でByteArrayを抜いて、
エフェクトをかけたByteArrayをplay中のSoundにSound.samplesCallbackDataに追加します。
これで好きなエフェクトがかけられます。

private function samplesCallback(event:SamplesCallbackEvent):void { soundData.position = 0; var len:Number = mp3Sound.extract(soundData,BUFFER_LENGHT); if (len < BUFFER_LENGHT) { len += mp3Sound.extract(soundData, BUFFER_LENGHT - len, 0); } soundData.position = 0; for (var i:uint = 0; i < BUFFER_LENGHT; i++) { // soundDataのポイントをずらしてピッチをかえることができる var left:Number = soundData.readFloat(); var right:Number = soundData.readFloat(); // ココでleftとrightをいじるといろいろできる sound.samplesCallbackData.writeFloat(left); sound.samplesCallbackData.writeFloat(right); } }

サンプル(要FlashPlayer10)

ソース(Flex)

HTML5飯