AstroのDynamic Sound GenerationとFileReference
こんにちは
先日入社した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)