NOTE: another example explains how to play it.
In this example, we are reading binary string from file, URL or base64-encoded string, and passing it to JZZ.MidiFile constructor.
Some older/freakier browsers may not support HTML5 File API required to open local files.
Due to the "same origin" security restriction, you must use URLs from your own domain, or write a proxy.
<!DOCTYPE html> <html> <head> <title>Read MIDI File</title> <script src="JZZ.Midi.js"></script> <script src="JZZ.MidiFile.js"></script> <style type="text/css"> button { width:6em; } #midi { font-family:Courier New, monospace; background-color:#eef; border:none; padding:0.2em; } #midi div { border:double; margin:0.2em; } #midi div div { border:none; } #midi div div.hdr { font-weight:bold; border:none; } #midi span.clk { width:6em; padding:0 0.5em; text-align:right; display:inline-block; background-color:#ddd; } #midi .wait { padding:.2em; font-size:1.5em; font-weight:bold; color:#888; } #midi .err { padding:.5em; font-size:1.2em; font-weight:bold; color:#d00; } </style> </head> <body> <h1>Read MIDI File</h1> <h2>from file:</h2> <p><input type=file id=file size=80 onchange='fromFile();'></p> <h2>from URL:</h2> <form onsubmit='fromUrl(); return false;'> <p><input type=text id=url size=80><input type=submit value=Submit...></p> </form> <h2>from string: <button onclick='fromString();'>Read...</button></h2> <p> <div id=fname> </div> </p> <p> <div id=midi>Files accepted: SMF (*.mid, *.kar), RMID (*.rmi)</div> </p> <script><!-- function fromFile(){ plzWait(); fName(document.getElementById('file').value); if(window.FileReader){ var reader=new FileReader(); var f=document.getElementById('file').files[0]; reader.onload=function(e){ readMidiFile(e.target.result);}; reader.readAsBinaryString(f); } else err('File API is not supported in this browser!'); } function fromUrl(){ var url=document.getElementById('url').value; plzWait(); fName(url); try{ var req=new XMLHttpRequest(); req.open("GET",url,true); if(req.overrideMimeType){ req.overrideMimeType("text/plain; charset=x-user-defined"); } req.onreadystatechange=function(ev){ if(req.readyState===4){ if(req.status===200){ var s=''; if(typeof req.responseBody=='unknown'){ // MSIE var a=new VBArray(req.responseBody).toArray(); for(var i=0;i<a.length;i++) s+=String.fromCharCode(a[i]); } else { var r=req.responseText; for(var i=0;i<r.length;i++) s+=String.fromCharCode(r.charCodeAt(i)&0xff); } readMidiFile(s); } else err(req.status+": "+req.statusText); } }; req.send(null); } catch(e){ err(e);} } function fromString(){ plzWait(); fName('Base64 string'); readMidiFile(JZZ_.MidiFile.fromBase64(b64)); } function readMidiFile(s){ try{ var mf=new JZZ_.MidiFile(s); displayMidiFile(mf); } catch(e){ err(e);} } function displayMidiFile(mf){ document.getElementById('midi').innerHTML=''; var chunk; var div; chunk=document.createElement('div'); chunk.innerHTML='<div class=hdr>MThd</div>'; div=document.createElement('div'); div.innerHTML='type: '+mf.type+(mf.ppqn?(', ppqn: '+mf.ppqn):(' smpte: '+mf.fps+'x'+mf.ppf)); chunk.appendChild(div); document.getElementById('midi').appendChild(chunk); for(var i=0;i<mf.length;i++){ chunk=document.createElement('div'); chunk.innerHTML='<div class=hdr>'+mf[i].type+'</div>'; if(mf[i].data){ div=document.createElement('div'); arr=[]; s=mf[i].data; for(var j=0;j<s.length;j++){ var c=s.charCodeAt(j)<32?'-':s.charAt(j); if(c=='&') c='&'; if(c=='<') c='<'; if(c=='>') c='>'; var n=(s.charCodeAt(j)<16?'0':'')+s.charCodeAt(j).toString(16); if(j && !(j%32)) arr.push('<br>'); else if(j && !(j%8)) arr.push(' '); arr.push('<span title="'+c+'">'+n+'</span>'); } div.innerHTML=arr.join(' '); chunk.appendChild(div); } if(mf[i] instanceof JZZ_.MidiFile.MTrk){ for(var j=0;j<mf[i].length;j++){ var evt=mf[i][j]; var s=evt.toString().replace(/&/g,'&').replace(/>/g,'>').replace(/</g,'<'); div=document.createElement('div'); div.innerHTML="<span class=clk>"+evt.time+"</span> <span>"+s+"</span>"; chunk.appendChild(div); } } document.getElementById('midi').appendChild(chunk); } } function err(e){ document.getElementById('midi').innerHTML='<span class=err>'+e+'</span>';} function plzWait(){ document.getElementById('midi').innerHTML='<span class=wait>One moment please...</span>';} function fName(s){ document.getElementById('fname').innerHTML='<tt>'+s+'</tt>';} var b64='\ TVRoZAAAAAYAAQADAGRNVHJrAAAAGgD/AwtMaXR0bGUgTGFtYgD/UQMKLCsA/y8ATVRyawAAAPEA/wMF\ V29yZHMA/wEYQFRNYXJ5IEhhZCBBIExpdHRsZSBMYW1iZP8BA1xNYTL/AQNyeSAy/wEEaGFkIDL/AQJh\ IDL/AQNsaXQy/wEEdGxlIDL/AQVsYW1iLGT/AQQvTGl0Mv8BBHRsZSAy/wEFbGFtYixk/wEEL0xpdDL/\ AQR0bGUgMv8BBWxhbWIsZP8BAy9NYTL/AQNyeSAy/wEEaGFkIDL/AQJhIDL/AQNsaXQy/wEEdGxlIDL/\ AQVsYW1iLGT/AQYvQmxhaC0y/wEFYmxhaC0y/wEFYmxhaC0y/wEFYmxhaC0y/wEFYmxhaCEA/y8ATVRy\ awAAALkA/wMFTXVzaWMAwAtkkEB/MkAAAD5/Mj4AADx/MjwAAD5/Mj4AAEB/MkAAAEB/MkAAAEB/WkAA\ Cj5/Mj4AAD5/Mj4AAD5/Wj4ACkB/MkAAAEN/MkMAAEN/WkMACkB/MkAAAD5/Mj4AADx/MjwAAD5/Mj4A\ AEB/MkAAAEB/MkAAAEB/WkAACj5/Mj4AAD5/Mj4AAEB/MkAAAD5/Mj4AADx/ZEBkAENkAEh/WjwAAEAA\ AEMAAEgACv8vAA=='; --></script> </body> </html>
Proxy is a little server-side script that allows reading files from other domain as if they were at your own domain.
It can be as simple as this:
<?php $url=$_REQUEST['url']; if($fp=fopen($url,"r")) while($str=fread($fp,1024)) echo $str; ?>
Make sure (or ask your hosting provider) that allow_url_fopen = On in your php settings.
All you have to do now, is to change
req.open("GET",url,true);
to
req.open("GET",'proxy.php?url='+url,true);
in your JavaScript.