こんにちは
Flex大好きプログラマのアラガです

先日リリースしたFlashPlayer10の新しい機能を使ったサービス「逆音」をリリースしました。
謎のおっさんと一緒に逆再生、スロー再生、高速再生の世界を満喫してください。

今回は、以前のエントリでも紹介したDynamic Sound Generationと新しいFileReferenceを使いました!
(Vectorは当然のごとく使ってます。便利!)

おかげでサーバーサイドプログラムを一切使わないで音遊びをすることが出来ちゃいました。テンション上がりますね


それでは、逆再生の方法を少々ご紹介します。

ローカルファイルの取得方法、ローカル音声ファイルの再生方法は以前紹介ましたが、正式リリースとなって少々変更点がありますのでご注意を!

現在の仕様は上条さんのブログで詳しく説明されていますので参考にしてください。


逆再生の方法

逆再生は、sound.extract(byteArray, 8192);を使用して抽出した元のMP3の音声データ(byteArray)をストックして、 SampleDataEventイベントのハンドラないでSampleDataEvent.dataに逆再生になるように書き込めば出来ます。

このような感じです

//データを貯める const BUFFER_LENGHT:Number = 8192; // ただしこのままだとCPUを使いすぎるので適宜スリープっぽいことをしています public function play():void { do { len:Number = _mp3Sound.extract(_mp3Samples, BUFFER_LENGHT); } while(len >= BUFFER_LENGHT); _playSound = new Sound(); _playSound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleDataHandler); _channel = _playSound.play(0,0); } // 再生 private function onSampleDataHandler(event:SampleDataEvent):void { var left:Number; var right:Number; for (i; i < BUFFER_LENGHT; i++) { _playingPosition += soundPitch * 8; // soundPitchが「ー」なら逆再生 _mp3Samples.position = _playingPosition; left = _mp3Samples.readFloat(); right = _mp3Samples.readFloat(); event.data.writeFloat(left); event.data.writeFloat(right); } }

本来はもう少し処理をしないと行けないかもしレマセンが、最小構成はこのような感じで動くはずです。


元のMP3の再生ポジションの取得

逆再生や速度の変更は簡単に出来ますが、Sound.extract()で取得するByteArrayデータの長さや元の音声データ長さは取得するのは簡単ではありません。

結局以下の公式で求められましたのでご参考にして下さい

var kHz:Number = 44.1; // 今回は固定にしてしまいました。 var sound:Saund; // 元のMP3のサウンドデータ var wave:ByteArray; // Sound.extractで取得する元データのByteArray var len:Number = sound.extract(wave); loadLength += len; // 全て取得後の関係式 len == sound.length * kHz; len * 8 == wave.length;

これさえわかれば怖い者はありません。皆さんもFlashのSoundで遊びまくりましょう!

PS.個人的には初めてちょっとだけタイムラインを使った。という大いなる挑戦もしてます。

HTML5飯