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
{
[Embed(source="wav/siren_short.wav", mimeType="application/octet-stream")]
public static const Song:Class;
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)
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/ でコードフォーマットさせていただきました
サンプルファイル