開発環境 Apache Flex SDK 4.13.0
FlashDevelop 4.7.1.1
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 ActionScript 3/AS3 Project
プロジェクト名 js2flash5

Project/Properties
Output
Background color #6495ED


Main.as
package
{
	import flash.display.*;
	import flash.events.*;
	import flash.external.*;
	import flash.media.*;
	import flash.text.*;
	import flash.utils.*;
 
	public class Main extends Sprite 
	{
		private var disp:TextField;
		private var tfmul:TextField;
		private var mul:Number = 1; // 倍率
		private var stream:ByteArray = null;
 
		private var sound:Sound;
		private var soundChannel:SoundChannel = null;
 
		public function Main() 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
 
			disp = new TextField;
			disp.defaultTextFormat = new TextFormat(null, 20, 0xffffff);
			disp.autoSize = TextFieldAutoSize.LEFT;
			disp.text = "ready";
			addChild(disp);
 
			sound = new Sound;
			sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
 
			var play:TextField = createButton(100, 550, 80, 30, "Play");
			var stop:TextField = createButton(200, 550, 80, 30, "Stop");
			tfmul = createInput(400, 550, 80, 30);
			var apply:TextField = createButton(500, 550, 80, 30, "Apply");
 
			play.addEventListener(MouseEvent.CLICK, onPlay);
			stop.addEventListener(MouseEvent.CLICK, onStop);
			apply.addEventListener(MouseEvent.CLICK, onApply);
 
			ExternalInterface.addCallback("importFile", importFile);
		}
 
		private function importFile(base16:String):void 
		{
			stream = ByteArrayFromBase16(base16);
			var str:String = "";
			str += "stream.length=[" + stream.length + "]\n";
 
			// RIFFチャンク
			stream.position = 0;
			stream.endian = Endian.LITTLE_ENDIAN;
			var ckid:String = stream.readMultiByte(4, "shift_jis"); // RIFF
			var cksize:uint = stream.readUnsignedInt();
			var fccType:String = stream.readMultiByte(4, "shift_jis"); // WAVE
			str += "\nckid=[" + ckid + "]\n";
			str += "cksize=[" + cksize + "]\n";
			str += "fccType=[" + fccType + "]\n";
 
			while (stream.position < stream.length) {
				ckid = stream.readMultiByte(4, "shift_jis"); // RIFF
				cksize = stream.readUnsignedInt();
				str += "\nckid=[" + ckid + "]\n";
				str += "cksize=[" + cksize + "]\n";
				switch (ckid) 
				{
				case "fmt ":
					// WAVEFORMAT
					var wFormatTag:uint = stream.readUnsignedShort();
					var nChannels:uint = stream.readUnsignedShort();
					var nSamplesPerSec:uint = stream.readUnsignedInt();
					var nAvgBytesPerSec:uint = stream.readUnsignedInt();
					var nBlockAlign:uint = stream.readUnsignedShort();
					var wBitsPerSample:uint = stream.readUnsignedShort();
					str += "wFormatTag=[" + wFormatTag + "]\n";
					str += "nChannels=[" + nChannels + "]\n";
					str += "nSamplesPerSec=[" + nSamplesPerSec + "]\n";
					str += "nAvgBytesPerSec=[" + nAvgBytesPerSec + "]\n";
					str += "nBlockAlign=[" + nBlockAlign + "]\n";
					str += "wBitsPerSample=[" + wBitsPerSample + "]\n";
					break;
				case "data":
					//
					stream.position += cksize;
					str += "stream.position=[" + stream.position + "]\n";
					break;
				}
			}
 
			disp.text = str;
		}
 
		private function ByteArrayFromBase16(base16:String):ByteArray
		{
			var dic:Array = [];
			dic["0"] = 0x0; dic["1"] = 0x1; dic["2"] = 0x2; dic["3"] = 0x3;
			dic["4"] = 0x4; dic["5"] = 0x5; dic["6"] = 0x6; dic["7"] = 0x7;
			dic["8"] = 0x8; dic["9"] = 0x9; dic["A"] = 0xA; dic["B"] = 0xB;
			dic["C"] = 0xC; dic["D"] = 0xD; dic["E"] = 0xE; dic["F"] = 0xF;
 
			var stream:ByteArray = new ByteArray;
			for (var i:int = 0; i < base16.length; i += 2) 
			{
				stream.writeByte(dic[base16.charAt(i)] << 4 | dic[base16.charAt(i + 1)]);
			}
			return stream;
		}
 
		// ボタン作成
		private function createButton(x:Number, y:Number, width:Number, height:Number, text:String):TextField
		{
			var dtf:TextFormat = new TextFormat;
			dtf.size = 24;
			dtf.align = TextFormatAlign.CENTER;
 
			var tf:TextField = new TextField;
			tf.border = true;
			tf.defaultTextFormat = dtf;
			tf.selectable = false;
			tf.x = x;
			tf.y = y;
			tf.width = width;
			tf.height = height;
			tf.text = text;
			addChild(tf);
			return tf;
		}
 
		// 入力作成
		private function createInput(x:Number, y:Number, width:Number, height:Number):TextField
		{
			var tf:TextField = new TextField;
			tf.border = true;
			tf.defaultTextFormat = new TextFormat(null, 24);
			tf.type = TextFieldType.INPUT; // 編集可
			tf.x = x;
			tf.y = y;
			tf.width = width;
			tf.height = height;
			addChild(tf);
			return tf;
		}
 
		// 再生ボタン
		private function onPlay(e:MouseEvent):void 
		{
			if (stream == null) return;
 
			stream.position = 44;
 
			if (soundChannel != null) {
				soundChannel.stop();
			}
			soundChannel = sound.play();
		}
 
		// 停止ボタン
		private function onStop(e:MouseEvent):void 
		{
			if (soundChannel == null) return;
 
			soundChannel.stop();
			soundChannel = null;
		}
 
		// 適用ボタン
		private function onApply(e:MouseEvent):void 
		{
			mul = parseFloat(tfmul.text);
			tfmul.text = mul.toString();
		}
 
		// サンプルデータ要求
		private function onSampleData(e:SampleDataEvent):void 
		{
			for (var i:int = 0; i < 16384; i++) 
			{
				var value:Number = mul * stream.readShort() / 32768;
				e.data.writeFloat(Math.min(Math.max(value, -1), 1));
				if (stream.length <= stream.position) {
					//
					break;
				}
			}
		}
 
	}
 
}
 

js2flash5.html
<!doctype html>
<head>
<title>js2flash5</title>
<script>
 
function onDragOver(event)
{
	event.preventDefault();
}
 
function onDrop(event)
{
	event.preventDefault();
 
	var files = event.dataTransfer.files;
	var file = files[0];
 
	if (file.type != "audio/wav") {
		alert("wavファイルではありません。");
		return;
	}
 
	var reader = new FileReader();
	reader.onload = onLoad;
	reader.readAsArrayBuffer(file);
}
 
function onLoad(event)
{
	var buf = event.target.result;
	var str = Base16FromArrayBuffer(buf);
	swf.importFile(str);
}
 
function Base16FromArrayBuffer(buf)
{
	var dic = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];
	var base16 = "";
	var bin = new Uint8Array(buf);
	for (var i = 0; i < bin.length; i++) {
		var b = bin[i];
		base16 += dic[b >> 4] + dic[b & 0x0f];
	}
	return base16;
}
 
</script>
</head>
 
<body>
<div ondragover="onDragOver(event)" ondrop="onDrop(event)">
<embed src="js2flash5.swf" id="swf" width=800 height=600 />
</div>
</body>
 
最終更新:2015年02月08日 16:29