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