dialer.htm

戻る

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML LANG="ja">

<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=Shift_JIS">
<TITLE>トーン ダイアラー</TITLE>
</HEAD>

<BODY BGCOLOR="#CCFFFF">
<CENTER>
<BR><BR>
<B>トーン ダイアラー</B>
<BR><BR>

<IFRAME NAME="mid" SRC="about:blank" WIDTH=1 HEIGHT=1 FRAMEBORDER=0 SCROLLING=NO STYLE="visibility:hidden"></IFRAME>

<FORM onSubmit="return false">
番号: <INPUT TYPE=TEXT ID="data" SIZE=50>
<BR><BR>
<INPUT TYPE=BUTTON VALUE="ダイアル" onClick="dial()">
<BR><BR>
音色:
<INPUT TYPE=RADIO NAME="prog" ID="prog1" CHECKED> Recorder
<INPUT TYPE=RADIO NAME="prog"> Lead 1b(GM2 のみ)
<BR>
</FORM>

</CENTER>

<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--

function dial() {
  var data = document.getElementById("data").value;  // データ
  if(!data.length)  // 未入力
    return;

  var i;

  var gm1 = document.getElementById("prog1").checked;

  track0[I_GM_LEVEL] = (gm1) ? 0x01 : 0x03;

  var track1 = track1_hdr2.concat((gm1) ? track1_hdr3_gm1 : track1_hdr3_gm2);
  var track2 = track2_hdr2.concat((gm1) ? track2_hdr3_gm1 : track2_hdr3_gm2);

  var dt = 0;  // ディレイ タイム
  for(i = 0; i < data.length; i++) {
    var i_l, i_h;  // 低群,高群インデックス
    switch(data.charAt(i)) {
    case "1":
      i_l = 0;
      i_h = 0;
      break;
    case "2":
      i_l = 0;
      i_h = 1;
      break;
    case "3":
      i_l = 0;
      i_h = 2;
      break;
    case "A":
      i_l = 0;
      i_h = 3;
      break;
    case "4":
      i_l = 1;
      i_h = 0;
      break;
    case "5":
      i_l = 1;
      i_h = 1;
      break;
    case "6":
      i_l = 1;
      i_h = 2;
      break;
    case "B":
      i_l = 1;
      i_h = 3;
      break;
    case "7":
      i_l = 2;
      i_h = 0;
      break;
    case "8":
      i_l = 2;
      i_h = 1;
      break;
    case "9":
      i_l = 2;
      i_h = 2;
      break;
    case "C":
      i_l = 2;
      i_h = 3;
      break;
    case "*":
      i_l = 3;
      i_h = 0;
      break;
    case "0":
      i_l = 3;
      i_h = 1;
      break;
    case "#":
      i_l = 3;
      i_h = 2;
      break;
    case "D":
      i_l = 3;
      i_h = 3;
      break;
    case ",":
      dt += 2000;  // 2 秒
      continue;
    default:
      continue;
    }

    // ディレイ タイム
    var dtv = [dt & 0x7f];
    for(; ; ) {
      if(!(dt >>= 7))
        break;
      dtv.unshift(dt & 0x7f | 0x80);
    }

    track1_tone[I_FINE_M] = fine_l[i_l][0];
    track1_tone[I_FINE_L] = fine_l[i_l][1];
    track1_tone[I_NOTE_1] = track1_tone[I_NOTE_2] = note_l[i_l];
    track1 = track1.concat(dtv, track1_tone);

    track2_tone[I_FINE_M] = fine_h[i_h][0];
    track2_tone[I_FINE_L] = fine_h[i_h][1];
    track2_tone[I_NOTE_1] = track2_tone[I_NOTE_2] = note_h[i_h];
    track2 = track2.concat(dtv, track2_tone);

    dt = 50;  // 50 ms
  }

  track1 = track1.concat(track_trlr);
  track2 = track2.concat(track_trlr);
  var midi = header.concat(track_hdr1, track_length(track0), track0,
                           track_hdr1, track_length(track1), track1,
                           track_hdr1, track_length(track2), track2);

  var midi_uri = "data:audio/midi;base64,";

  // BASE64 エンコード
  var b3;
  var n = midi.length - midi.length % 3;
  for(i = 0; i < n; i += 3) {
    b3 = (midi[i] << 16) | (midi[i + 1] << 8) | midi[i + 2];
    midi_uri += b64.charAt(b3 >> 18);
    midi_uri += b64.charAt((b3 >> 12) & 0x3f);
    midi_uri += b64.charAt((b3 >> 6) & 0x3f);
    midi_uri += b64.charAt(b3 & 0x3f);
  }
  // 余り
  switch(midi.length - n) {
  case 1:
    midi_uri += b64.charAt(midi[i] >> 2);
    midi_uri += b64.charAt((midi[i] << 4) & 0x3f);
    midi_uri += "==";
    break;
  case 2:
    b3 = (midi[i] << 8) | midi[i + 1];
    midi_uri += b64.charAt(b3 >> 10);
    midi_uri += b64.charAt((b3 >> 4) & 0x3f);
    midi_uri += b64.charAt((b3 << 2) & 0x3f);
    midi_uri += "=";
    break;
  }

  mid.location.replace(midi_uri);
}

function track_length(tr) {
  var len = tr.length;
  return [len >> 24, (len >> 16) & 0xff, (len >> 8) & 0xff, len & 0xff];
}

//----------------------------------------------------------

  header = [
    0x4d, 0x54, 0x68, 0x64,  // MThd
    0x00, 0x00, 0x00, 0x06,  // データ長 6
    0x00, 0x01,              // フォーマット 1
    0x00, 0x03,              // 3 トラック
    0x01, 0xe0               // 分解能 480
  ];
  track_hdr1 = [
    0x4d, 0x54, 0x72, 0x6b  // MTrk
  ];
  track0 = [
    0x00, 0xf0, 0x05, 0x7e, 0x7f, 0x09, 0x00, 0xf7,  // GM1/GM2 システム・オン
    0x00, 0xff, 0x51, 0x03, 0x07, 0x53, 0x00,        // テンポ 125
    0x00, 0xff, 0x2f, 0x00
  ];
  I_GM_LEVEL = 6;
  track1_hdr2 = [
    0x64, 0xb0, 0x79, 0x00,  // リセット・オール・コントローラ
    0x00,       0x5b, 0x00,  // リバーブ・センド・レベル 0
    0x00,       0x5d, 0x00   // コーラス・センド・レベル 0
  ];
  track1_hdr3_gm1 = [
    0x00, 0xc0, 0x4a         // プログラム・チェンジ Recorder
  ];
  track1_hdr3_gm2 = [
    0x00,       0x00, 0x79,  // バンク・セレクト MSB 79H
    0x00,       0x20, 0x02,  //                  LSB 02H
    0x00, 0xc0, 0x50         // プログラム・チェンジ Lead 1b
  ];
  track2_hdr2 = [
    0x64, 0xb1, 0x79, 0x00,  // リセット・オール・コントローラ
    0x00,       0x5b, 0x00,  // リバーブ・センド・レベル 0
    0x00,       0x5d, 0x00   // コーラス・センド・レベル 0
  ];
  track2_hdr3_gm1 = [
    0x00, 0xc1, 0x4a         // プログラム・チェンジ Recorder
  ];
  track2_hdr3_gm2 = [
    0x00,       0x00, 0x79,  // バンク・セレクト MSB 79H
    0x00,       0x20, 0x02,  //                  LSB 02H
    0x00, 0xc1, 0x50         // プログラム・チェンジ Lead 1b
  ];
  track_trlr = [
    0x87, 0x7f, 0xff, 0x2f, 0x00
  ];
  track1_tone = [
                             // チャンネル・ファイン・チューニング
          0xb0, 0x65, 0x00,  // RPN MSB 0
    0x00,       0x64, 0x01,  //     LSB 1
    0x00,       0x06, 0x00,  // データ・エントリー MSB
    0x00,       0x26, 0x00,  //                    LSB
    0x00, 0x90, 0x00, 0x7f,  // ノート・オン
    0x46,       0x00, 0x00   // ノート・オフ 70 ms
  ];
  track2_tone = [
                             // チャンネル・ファイン・チューニング
          0xb1, 0x65, 0x00,  // RPN MSB 0
    0x00,       0x64, 0x01,  //     LSB 1
    0x00,       0x06, 0x00,  // データ・エントリー MSB
    0x00,       0x26, 0x00,  //                    LSB
    0x00, 0x91, 0x00, 0x7f,  // ノート・オン
    0x46,       0x00, 0x00   // ノート・オフ 70 ms
  ];
  I_FINE_M = 8;
  I_FINE_L = 11;
  I_NOTE_1 = 14;
  I_NOTE_2 = 17;
  // 低群 チャンネル・ファイン・チューニング データ MSB,LSB
  fine_l = [
    [0x3d, 0x58],  // 697  -296
    [0x2c, 0x06],  // 770 -2554
    [0x5c, 0x16],  // 852 +3606
    [0x4a, 0x21]   // 941 +1313
  ];
  // 高群 チャンネル・ファイン・チューニング データ MSB,LSB
  fine_h = [
    [0x5f, 0x77],  // 1209 +4087
    [0x4e, 0x4d],  // 1336 +1869
    [0x3d, 0x62],  // 1477  -286
    [0x2d, 0x02]   // 1633 -2430
  ];
  // 低群 ノート番号
  note_l = [
    77,  // 697 F5
    79,  // 770 G5
    80,  // 852 G#5
    82   // 941 A#5
  ];
  // 高群 ノート番号
  note_h = [
    86,  // 1209 D6
    88,  // 1336 E6
    90,  // 1477 F#6
    92   // 1633 G#6
  ];

  // BASE64 エンコード キャラクタ
  b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

  // Netscape で,ページを再ロードしたとき,コントロールの表示とフレームにロードした
  // 内容が初期化されない現象の対策
  document.getElementById("data").value = "";
  document.getElementById("prog1").checked = true;
  mid.location.replace("about:blank");

//-->
</SCRIPT>

</BODY>

</HTML>