Спасибо! А есть ли более-менее кросс-браузерный метод?
Вот написал какрас скрипт, который рендерит те самые
треки в midi-поток. И всё отлично работает Но только в Mozilla-FF и в Opera.
Как я понимаю, в IE эта проблема решается довольно легко с помощью ActiveX файловой системы: Сохраняем на диск C:/sol2midi.mid и передаём ссылку. Пока не попробовал, но сработать должно.
Это уже 3 браузера! А вот как с Chrome быть..?
Эм-ммм, в Chrome используя new Audio удалось воспроизвести лишь mp3. Ни mid, ни rmi не воспроизводятся, а wav выдаёт ошибку! Но, вот написал более-менее кросс-браузерный метод.
Работает в Mozilla-FF и Opera, а также и в IE с использованием ActiveX файловой системы.
Если проверите в IE, отпишите, у кого работает/нет?
<html><head><title>MIDI-song for FireFox / IE / Opera by Paguo-86PK from javascript.ru</title>
<script language="JavaScript">
String.prototype.toBase64 =
function (header) {
// Encodes data with MIME base64
// + original by: Tyler Akins (http://rumkin.com)
// + improved by: Bayron Guevara
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var enc = "", i = 0, o1, o2, o3, h1, h2, h3, h4, bits;
do { // pack three octets into four hexets
o1 = this.charCodeAt(i ++);
o2 = this.charCodeAt(i ++);
o3 = this.charCodeAt(i ++);
bits = o1 << 16 | o2 << 8 | o3;
h1 = bits >> 18 & 0x3f;
h2 = bits >> 12 & 0x3f;
h3 = bits >> 6 & 0x3f;
h4 = bits & 0x3f;
// use hexets to index into b64, and append result to encoded string
enc += b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
} while (i < this.length);
switch(this.length % 3) {
case 1:
enc = enc.slice(0, -2) + "==";
break;
case 2:
enc = enc.slice(0, -1) + "=";
break;
}
return header + ";base64," + enc;
}
var
player = ( //////////////////////// Cross-browser midi-play method are here
function (fileName) {
try { //////////////////////////// Try to IE way
this.fso = new ActiveXObject("Scripting.FileSystemObject");
this.name = fileName;
this.play = function(stream) { // Flexable function for play sound
Player = document.getElementById("Media");
Player.FileName = ""; // document.getElementsByTagName("bgsound")[0].src="";
try { ////////////////////////// Save stream to HDD and play it
File = this.fso.CreateTextFile(this.name);
Enc = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
+ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
+ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F"
+ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F"
+ "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F"
+ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F"
+ "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F"
+ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F"
+ "\u0402\u0403\u201A\u0453\u201E\u2026\u2020\u2021\u20AC\u2030\u0409"
+ "\u2039\u040A\u040C\u040B\u040F\u0452\u2018\u2019\u201C\u201D\u2022"
+ "\u2013\u2014\x98\u2122\u0459\u203A\u045A\u045C\u045B\u045F\xA0\u040E"
+ "\u045E\u0408\xA4\u0490\xA6\xA7\u0401\xA9\u0404\xAB\xAC\xAD\xAE\u0407"
+ "\xB0\xB1\u0406\u0456\u0491\xB5\xB6\xB7\u0451\u2116\u0454\xBB\u0458"
+ "\u0405\u0455\u0457\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417"
+ "\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422"
+ "\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D"
+ "\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438"
+ "\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443"
+ "\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F";
for(i = 0; i < stream.length; ++ i)
File.write(Enc.charAt(stream.charCodeAt(i)));
File.close();
Player.FileName = this.name; // document.getElementsByTagName("bgsound")[0].src = this.name;
} catch(e) {
alert("Sorry...\r\nCan't played");
}
}
document.writeln("<object id='Media' classid='CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95'"
+" width='200' height='40'>");
document.writeln("<param name='Filename' value=''>");
document.writeln("<param name='AutoStart' value='True'>");
document.writeln("<param name='AutoRewind' value='True'>");
document.writeln("<param name='ShowDisplay' value='False'>");
document.writeln("<param name='ShowControls' value='True'>");
document.writeln("<param name='ShowStatusBar' value='False'>");
document.writeln("</object><br>");
} catch(e) { ///////////////////// All other browsers (Mozilla FireFox / Opera)
this.play = function(stream) {
Player = document.getElementById("Media");
Player.data = "";
Player.data = stream.toBase64("data:audio/mid");
}
document.writeln("<object id='Media' type='audio/mid' width='200' height='40' autoplay>");
document.writeln("<param name='AutoStart' value='True'>");
document.writeln("<param name='AutoRewind' value='True'>");
document.writeln("<param name='ShowDisplay' value='False'>");
document.writeln("<param name='ShowControls' value='True'>");
document.writeln("<param name='ShowStatusBar' value='False'>");
document.writeln("</object><br>");
}
return this;
})("C:/_base64_.mid"); //////////// <-- Choice to IE-generated file at here
var
song = "\x4D\x54\x68\x64\x00\x00\x00\x06\x00\x01\x00\x03\x7F\xFF\x4D\x54"
+ "\x72\x6B\x00\x00\x00\x53\x00\xC0\x50\x00\x90\x00\x00\x82\x9D\x60"
+ "\x80\x00\x00\x00\x90\x37\x7F\xC7\x38\x80\x37\x00\x00\x90\x38\x7F"
+ "\xC7\x38\x80\x38\x00\x00\x90\x39\x7F\x88\xF7\x00\x80\x39\x00\x00"
+ "\x90\x00\x00\x84\xBB\x40\x80\x00\x00\x00\x90\x3A\x7F\xC7\x38\x80"
+ "\x3A\x00\x00\x90\x39\x7F\xC7\x38\x80\x39\x00\x00\x90\x3B\x7F\x88"
+ "\xF7\x00\x80\x3B\x00\x00\xFF\x2F\x00\x4D\x54\x72\x6B\x00\x00\x00"
+ "\x11\x00\xC0\x51\x00\x90\x00\x00\x9A\xE5\x00\x80\x00\x00\x00\xFF"
+ "\x2F\x00\x4D\x54\x72\x6B\x00\x00\x00\x11\x00\xC0\x52\x00\x90\x00"
+ "\x00\x9A\xE5\x00\x80\x00\x00\x00\xFF\x2F\x00\x20\x20";
</script>
</head>
<body>
<button onclick='player.play(song)'>Cross-browser playing test</button>
</body>