dialer3.htm

戻る

<!DOCTYPE HTML>
<HTML LANG="ja">

<HEAD>
<META CHARSET="Shift_JIS">
<TITLE>トーン ダイアラー(Web Audio API 版)</TITLE>
</HEAD>

<BODY STYLE="background-color:#CCFFFF">
<DIV STYLE="text-align:center">
<BR><BR>
<B>トーン ダイアラー(Web Audio API 版)</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() {
  var data = document.getElementById("data").value;  // データ
  if(!data.length)  // 未入力
    return;

  elem_btn.disabled = true;

  var time = aud_ctx.currentTime;
  var osc_l, osc_h;
  osc_l = undefined;
  for(var i_data = 0; 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 ",":
      time += 2;  // 2 秒ディレイ
      continue;

    default:
      continue;
    }

    with(osc_l = aud_ctx.createOscillator()) {
      type = "sine";
      frequency.value = freq_l;
      onended = osc_ended;  // Firefox 25,26 では機能しない
      connect(gain_l);
    }
    with(osc_h = aud_ctx.createOscillator()) {
      type = "sine";
      frequency.value = freq_h;
      onended = osc_ended;
      connect(gain_h);
    }
    osc_l.start(time);
    osc_h.start(time);
    time += 0.07;  // 70 ms トーン
    osc_l.stop(time);
    osc_h.stop(time);
    time += 0.05;  // 50 ms ポーズ
  }

  if(osc_l == undefined)
    elem_btn.disabled = false;
  else
    osc_l.onended = osc_ended_fin;
}

function osc_ended(e) {
  e.currentTarget.disconnect();
}

function osc_ended_fin(e) {
  e.currentTarget.disconnect();
  elem_btn.disabled = false;
}

  with(aud_ctx = (window.webkitAudioContext == undefined) ? new AudioContext() : new webkitAudioContext()) {
    gain_l = createGain();
    gain_l.gain.value = 0.5;
    gain_l.connect(destination);
    gain_h = createGain();
    gain_h.gain.value = 0.5;
    gain_h.connect(destination);
  }

  elem_btn = document.getElementById("btn");

  // ページを再ロードしたときのため
  document.forms[0].reset();
  elem_btn.disabled = false;

//-->
</SCRIPT>

</BODY>

</HTML>