![]() |
<!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> |