開発環境 |
Apache Flex SDK 4.13.0 |
|
FlashDevelop 4.7.1.1 |
実行環境 |
Microsoft Windows 8.1 (64bit) |
プロジェクトの種類 |
ActionScript 3/AS3 Project |
プロジェクト名 |
js2flash5 |
Project/Properties
Output
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