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