AS3でwavファイルをEmbedしたりエフェクトかけたり(要POPFORGE)

FlashIDE(FlashCS3)だとライブラリにwavファイルを追加してリンケージすることによって、Embed可能だけど、Flex環境というか.asファイルにwavファイルのEmbedは不可能。(だと思うけど違っていたら教えてください)

そこでバイナリーとして読み込んでPOPFORGEで復元、再生することにした。

派生物として、サウンドの生データが取得できるのでそれにフィルターをかけてやるとエフェクトをかけることも可能。やる気出せばサウンドへのリアルタイムエフェクトの可能性が見えるかも。

もともとはPOPFORGEでオリジナルの音源を使って、ストリームを生成させることが目的だったんだけど、Voiceクラスを解析するのがかなり大変そうなので、泥臭いがシンプルな方法を模索しているウチに上記の様な事になった。いつの日かドップラー効果やリバーブ、ディストーションをグリグリかけられるようになるかも。

フローは以下の形。
1.バイナリーとしてwavを読み込み、Class化
2.バイトコードを取得
3.fromByteArrayにバイトコードを渡す
4.再生
*エフェクトのサンプルとして1オクターブ高くなるeffect()が付随


package
{
  import de.popforge.audio.output.Audio;
  import de.popforge.audio.output.SoundFactory;
  
  import flash.display.Sprite;
  import flash.media.Sound;
  import flash.utils.ByteArray
  import flash.utils.Endian
  

  public class SirenASound_REF extends Sprite
  {
    
    //バイナリーとしてwavを読み込み、Class化
    [Embed(source="wav/siren_short.wav", mimeType="application/octet-stream")]
    public static const Song:Class;
    
    //wavファイルヘッダー部分のoffset
    public static const WAV_HEADER_END:uint = 44
    
    public function SirenASound_REF(){
      init();
    }
    
    private function init(): void {
      //バイトコードを取得
      var bytes:ByteArray = getByteArray()    
      var array:Array = byteArray2Array(bytes)
      
      //effectの有無 1オクターブ高くなる
      //array = effect(array)
      //var bytes2:ByteArray = array2ByteArray(array)
      
      //fromByteArrayにバイトコードを渡す
      SoundFactory.fromByteArray(bytes,Audio.STEREO, Audio.BIT16, Audio.RATE44100, onSoundGenerated );
    }
    
    private function onSoundGenerated( sound: Sound ): void {
      //再生
      sound.play();
    }
    
    private function getByteArray():ByteArray {
      var bytes:ByteArray = new ByteArray()
      bytes.endian = Endian.LITTLE_ENDIAN
      var wavData:ByteArray = new Song() as ByteArray
      bytes.writeBytes(wavData, WAV_HEADER_END)
      bytes.position = 0    
      return bytes;
    }
    
    private function byteArray2Array(bytes:ByteArray):Array {
      var array:Array = new Array()
      while(bytes.position < bytes.length-1){array.push(bytes.readShort())}      
      return array;
    }
    private function array2ByteArray(array:Array):ByteArray {
      var bytes:ByteArray = new ByteArray()
      bytes.endian = Endian.LITTLE_ENDIAN
      for each(var index:int in array){bytes.writeShort(index)}      
      bytes.position = 0
      return bytes;
    }
    
    private function effect(sample:Array):Array {
      var array:Array = new Array()
      for (var i:int = 0; i < sample.length;i+=2){
        array.push(sample[i])
      }
      
      return array
    }
  }
}

* http://qurage.net/labo/as2html/ でコードフォーマットさせていただきました

サンプルファイル

Trackback

http://mt-sys.kappa-lab.com/mt-tb.cgi/142

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.