<!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width"> <title>Raw Audio Player</title> <link rel="stylesheet" href=""> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <form name="main" onsubmit="return play_url();"> URL: <br> <input type="text" name="url" id="url"><br><br> Sampling rate (optional): <br> <input type="text" name="rate" id="rate"><br><br> <input type="submit" value="Play"> </form> </body> <script> function play_url() { var url = document.main.url.value; if (url == undefined) { alert("Please enter a URL"); return false; } var rate = document.main.rate.value; if (rate == undefined) rate = 0; //alert("url: " + url + "\nrate: " + rate); var xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.responseType = "arraybuffer"; xhr.onload = function(e) { if (this.status != 200) { alert("Error: " + this.status); return; } var temp = 0; var data = new Uint8Array(this.response); var samples = new Float32Array(data.length); for (var i = 0; i < samples.length; i++) { temp = ((data[i] ^ 0x80) << 8) | 0x80; samples[i] = temp / 32768.0; } var ctx = new AudioContext(); rate = rate <= 0 ? ctx.sampleRate : rate; var buf = ctx.createBuffer(1, samples.length, rate); var player = ctx.createBufferSource(); buf.getChannelData(0).set(samples); player.buffer = buf; player.connect(ctx.destination); player.start(0); }; xhr.send(); return false;} </script></html>