dialer2.htm

戻る

<!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>