FlashからWAVファイルの書き出し
前回のエントリーで、WAVファイルをバイナリ解析して再生しましたが
今回は、波形データ(-1~1の配列)からWAVファイルを生成してみたいと思います。
WAVファイルフォーマットに合わせて、バイナリを書いていく作業になります。
package { import flash.utils.ByteArray; import flash.utils.Endian; public class WavUtil { private static var SAMPLING_RATE:int = 44100; public static const MONAURAL:int = 1; public static const STEREO:int = 2; public static const BIT8:int = 8; public static const BIT16:int = 16; public function WavUtil() /** * PCM データ配列をWAV形式にエンコードします * * @param data PCMデータ * @param channel チャンネル数 * @param bit ビット数 * @return WAVバイナリデータ */ public static function encode(data:Vector.< Number >, channel:int = 1, bit:int = 8):ByteArray { var byte:ByteArray = new ByteArray(); byte.endian = Endian.LITTLE_ENDIAN; var filesize:int = data.length * channel + 44; var blocksize:int = channel * (bit / 8); //RIFFヘッダ byte.writeUTFBytes("RIFF"); //これ以降のファイルサイズ byte.writeInt(filesize - 8); //WAVEヘッダ byte.writeUTFBytes("WAVE"); //fmtチャンク byte.writeUTFBytes("fmt "); //fmt チャンクのバイト数 byte.writeInt(16); //フォーマットID byte.writeShort(1); //チャンネル数 byte.writeShort(channel); //サンプリングレート byte.writeInt(SAMPLING_RATE); //データ速度 (Byte/sec) byte.writeInt(SAMPLING_RATE * blocksize); //ブロックサイズ byte.writeShort(blocksize); //サンプルあたりのビット数 (bit/sample) byte.writeShort(bit); //dataチャンク byte.writeUTFBytes("data"); //波形データのバイト数 byte.writeInt(data.length * blocksize); //波形データ byte.writeBytes(getWaveData(data, channel, bit)); return byte; } static private function getWaveData(data:Vector.< Number >, channel:int, bit:int):ByteArray { var byte:ByteArray = new ByteArray(); byte.endian = Endian.LITTLE_ENDIAN; var cnt:int; switch(bit) { case BIT8: if (channel == MONAURAL) { for (cnt = 0; cnt < data.length; cnt++) byte.writeByte(int(data[cnt] * 127 + 128)); } else if (channel == STEREO) { for (cnt = 0; cnt < data.length; cnt++) { byte.writeByte(int(data[cnt] * 127 + 128)); byte.writeByte(int(data[cnt] * 127 + 128)); }; } break; case BIT16: if (channel == MONAURAL) { for (cnt = 0; cnt < data.length; cnt++) byte.writeShort(int(data[cnt] * 32768)); } else if (channel == STEREO) { for (cnt = 0; cnt < data.length; cnt++) { byte.writeShort(int(data[cnt] * 32768)); byte.writeShort(int(data[cnt] * 32768)); }; } break; } return byte; } } }
上記エンコードクラスを使って作った簡易効果音ジェネレータ
作成した効果音をSAVEボタンでローカルにWAVファイルとして保存できます。
今回は生成した波形をWAV書き出ししていますが、
マイクからの入力音声をWAVファイルとして保存したりも出来るかと思います。
それでは、よりよいバイナリ解析ライフを!