AstroのDynamic Sound GenerationとFileReference
2008年05月29日 - araga
こんにちは
先日入社した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)
- 本城直季風のムービーをFlashで利用したい!
- ガイドレイヤーに記述したフレームスクリプトの落とし穴
- [Flex]カスタムコンポーネントのカスタムイベントをMXML内でリスナー登録する方法
- FlashCS4で書き出されたswcファイルは、フレームスクリプトが実行されない?
- Flashで光の表現/BitmapDataを使って増幅させる
- Image.source に入れた画像のサイズを取るには
- 【Flex】ComboBoxとMenuを組み合わせて多段プルダウンメニューを作ってみました
- 「Flasher 100の質問」に答えてみた。
- Flex プロジェクト と ActionScript プロジェクト
- 「Flasher 100の質問」に答えてみた。
- AfterEffects
- AIR
- android
- Arduino
- AS2
- AS3
- as3
- BitmapData
- CHECKMATE
- crossdomain
- CS4
- Date
- DisplacementMapFilter
- Event
- event
- ExternalInterface
- FileReference
- FireBug
- FireFox
- Flash Lite
- FlashDevelop
- FlashPlayer10
- flash時計
- Flex
- Font
- GoogleMapsAPI
- INFINITY TANK BATTLE
- JSFL
- JSON
- Mobile
- mxp
- PaperVision3D
- Particle
- Progression
- Sound
- TextField
- Tips
- tool
- trace
- wonderfl
- Wonderfl
- xml
- アニメーション
- サンプルコード
- タイムライン
- デバッガ
- バグ
- フレーム
- ブログパーツ
- 爆速








