開発環境 メモ帳
実行環境 Internet Explorer 11


WavView.html
<!doctype html>
<head>
<title>WavView</title>
</head>
 
<body>
<div id="drop" style="height:300px; padding:10px; border:3px solid;"
 ondragover="onDragOver(event)" ondrop="onDrop(event)">
ここにwavファイルをドロップします。
</div>
<br>
<table border=1>
<tr><td>
<svg id="svg" preserveAspectRatio="none">
</svg>
</td></tr>
</table>
<script>
 
var svg;
 
function onDrop(event)
{
	event.preventDefault();
 
	svg = document.getElementById("svg");
	while (svg.firstChild) {
		svg.removeChild(svg.firstChild);
	}
 
	var files = event.dataTransfer.files;
	var file = files[0];
	var drop = document.getElementById("drop");
 
	var str = "";
	str += "name=[" + file.name + "]<br>";
	str += "type=[" + file.type + "]<br>";
	str += "size=[" + file.size + "]<br>";
	drop.innerHTML = str;
 
	if (file.type != "audio/wav") {
		drop.innerHTML += "wavファイルではありません。";
		return;
	}
 
	var reader = new FileReader();
	reader.onload = onLoad;
	reader.readAsArrayBuffer(file);
}
 
function onDragOver(event)
{
	event.preventDefault();
}
 
function onLoad(event)
{
	var buf = event.target.result;
	var dv = new DataView(buf);
	var pos = 0;
	var drop = document.getElementById("drop");
 
	// RIFFチャンク
	{
		var ckid = fourcc(dv, 0); // RIFF
		var cksize = dv.getUint32(4, true);
		var fccType = fourcc(dv, 8); // WAVE
		pos += 12;
 
		var str = "";
		str += "<br>";
		str += "ckid=[" + ckid + "]<br>";
		str += "cksize=[" + cksize + "]<br>";
		str += "fccType=[" + fccType + "]<br>";
		drop.innerHTML += str;
	}
 
	while (pos < buf.byteLength) {
		var ckid = fourcc(dv, pos + 0);
		var cksize = dv.getUint32(pos + 4, true);
		pos += 8;
 
		var str = "";
		str += "<br>";
		str += "ckid=[" + ckid + "]<br>";
		str += "cksize=[" + cksize + "]<br>";
		drop.innerHTML += str;
 
		switch (ckid) {
		case "fmt ": {
				// WAVEFORMAT
				var wFormatTag = dv.getUint16(pos + 0, true);
				var nChannels = dv.getUint16(pos + 2, true);
				var nSamplesPerSec = dv.getUint32(pos + 4, true);
				var nAvgBytesPerSec = dv.getUint32(pos + 8, true);
				var nBlockAlign = dv.getUint16(pos + 12, true);
				var wBitsPerSample = dv.getUint16(pos + 14, true);
 
				var str = "";
				str += "wFormatTag=[" + wFormatTag + "]<br>";
				str += "nChannels=[" + nChannels + "]<br>";
				str += "nSamplesPerSec=[" + nSamplesPerSec + "]<br>";
				str += "nAvgBytesPerSec=[" + nAvgBytesPerSec + "]<br>";
				str += "nBlockAlign=[" + nBlockAlign + "]<br>";
				str += "wBitsPerSample=[" + wBitsPerSample + "]<br>";
				drop.innerHTML += str;
			}
			break;
		case "data":
			dataChunk(dv, pos, cksize);
			break;
		}
 
		pos += cksize;
	}
}
 
function fourcc(dv, pos)
{
	var str = "";
	for (var i = 0; i < 4; i++) {
		str += String.fromCharCode(dv.getUint8(pos + i));
	}
	return str;
}
 
function dataChunk(dv, pos, cksize)
{
	svg.setAttribute("width", Math.floor(cksize / 10));
	svg.setAttribute("height", 256);
	svg.setAttribute("viewBox", "0 0 " + cksize + " 256");
 
	for (var i = 0; i < cksize; i++) {
		var n = dv.getUint8(pos + i);
		append("line", {x1:i, y1:128, x2:i, y2:255 - n, stroke:"blue"});
	}
}
 
function append(type, attr)
{
	var e = document.createElementNS("http://www.w3.org/2000/svg", type);
	for (var n in attr) {
		e.setAttribute(n, attr[n]);
	}
	svg.appendChild(e);
}
 
</script>
</body>
 
最終更新:2014年10月09日 20:24