<!DOCTYPE HTML>
<HTML LANG="ja">
<HEAD>
<META CHARSET="Shift_JIS">
<TITLE>トーン ダイアラー(Audio 版)</TITLE>
</HEAD>
<BODY STYLE="background-color:#CCFFFF">
<DIV STYLE="text-align:center">
<BR><BR>
<B>トーン ダイアラー(Audio 版)</B>
<BR><BR>
<FORM onSubmit="return false">
番号: <INPUT TYPE=TEXT ID="data" SIZE=50>
<BR><BR>
<INPUT TYPE=BUTTON ID="btn" VALUE="ダイアル" onClick="dial()">
<BR>
</FORM>
</DIV>
<SCRIPT TYPE="text/javascript">
<!--
function dial() {
data = document.getElementById("data").value; // データ
if(!data.length) // 未入力
return;
elem_btn.disabled = true;
i_data = 0;
dial2();
}
function dial2() {
wave = "";
for(; i_data < data.length; i_data++) {
var freq_l, freq_h; // 低群,高群周波数
switch(data[i_data]) {
case "1":
freq_l = 697;
freq_h = 1209;
break;
case "2":
freq_l = 697;
freq_h = 1336;
break;
case "3":
freq_l = 697;
freq_h = 1477;
break;
case "A":
freq_l = 697;
freq_h = 1633;
break;
case "4":
freq_l = 770;
freq_h = 1209;
break;
case "5":
freq_l = 770;
freq_h = 1336;
break;
case "6":
freq_l = 770;
freq_h = 1477;
break;
case "B":
freq_l = 770;
freq_h = 1633;
break;
case "7":
freq_l = 852;
freq_h = 1209;
break;
case "8":
freq_l = 852;
freq_h = 1336;
break;
case "9":
freq_l = 852;
freq_h = 1477;
break;
case "C":
freq_l = 852;
freq_h = 1633;
break;
case "*":
freq_l = 941;
freq_h = 1209;
break;
case "0":
freq_l = 941;
freq_h = 1336;
break;
case "#":
freq_l = 941;
freq_h = 1477;
break;
case "D":
freq_l = 941;
freq_h = 1633;
break;
case ",":
play();
return;
default:
continue;
}
var i;
// 70 ms トーン
for(i = 0; i < 772/* 70*11.025 */; i++) {
var val = Math.round(16383 * (Math.sin(i * a * freq_l) + Math.sin(i * a * freq_h)));
wave += String.fromCharCode(val & 0xff, (val & 0xff00) >> 8);
}
// 50 ms ポーズ
for(i = 0; i < 552/* 50*11.025 */; i++)
wave += "\x00\x00";
}
play();
}
function play() {
if(!wave.length) {
audio_end();
return;
}
wave_int4(I_DATA_SIZE, wave.length);
wave_int4(I_RIFF_SIZE, wave_header.length - 8 + wave.length);
var hdr = "";
for(var i = 0; i < wave_header.length; i++)
hdr += String.fromCharCode(wave_header[i]);
// Opera 15 以上では“audio/wave”が使えなくなった
//elem_aud.src = "data:audio/wave;base64," + btoa(hdr + wave);
elem_aud.src = "data:audio/wav;base64," + btoa(hdr + wave);
elem_aud.load();
elem_aud.play();
}
// WAVE ヘッダに 4 バイト Integer をセットする.
function wave_int4(i_wave, val) {
wave_header[i_wave ] = val & 0xff;
wave_header[i_wave + 1] = (val & 0xff00) >> 8;
wave_header[i_wave + 2] = (val & 0xff0000) >> 16;
wave_header[i_wave + 3] = val >>> 24;
}
function audio_end() {
if(i_data < data.length) {
i_data++;
setTimeout(dial2, 2000); // 2 秒ディレイ
return;
}
elem_btn.disabled = false;
}
//----------------------------------------------------------
// WAVE ヘッダ
wave_header = [
0x52, 0x49, 0x46, 0x46, // RIFF
0x00, 0x00, 0x00, 0x00, // チャンク サイズ
0x57, 0x41, 0x56, 0x45, // WAVE
// fmt
0x66, 0x6d, 0x74, 0x20, // fmt
0x10, 0x00, 0x00, 0x00, // チャンク サイズ 16
0x01, 0x00, // wFormatTag PCM
0x01, 0x00, // wChannels 1
0x11, 0x2b, 0x00, 0x00, // dwSamplesPerSec 11025
0x22, 0x56, 0x00, 0x00, // dwAvgBytesPerSec 22050
0x02, 0x00, // wBlockAlign 2
0x10, 0x00, // wBitsPerSample 16
// data
0x64, 0x61, 0x74, 0x61, // data
0x00, 0x00, 0x00, 0x00, // チャンク サイズ
];
I_RIFF_SIZE = 4;
I_DATA_SIZE = 40;
a = 2 * Math.PI / 11025;
elem_aud = new Audio();
elem_aud.addEventListener("ended", audio_end, false);
elem_btn = document.getElementById("btn");
// ページを再ロードしたときのため
document.forms[0].reset();
elem_btn.disabled = false;
//-->
</SCRIPT>
</BODY>
</HTML>
|