function getSampleAt(t,DUR,SPS) { return 0.5+Math.sin(15*t)/(1+t*t); } // ---------------------------------------------- function genWAVUrl(fun, DUR=1, NCH=1, SPS=44100, BPS=1) { let size = DUR*NCH*SPS*BPS; let put = (n,l=4) => [(n<<24),(n<<16),(n<<8),n].filter((x,i)=>i<l).map(x=> String.fromCharCode(x>>>24)).join(''); let p = (...a) => a.map( b=> put(...[b].flat()) ).join(''); let data = 'RIFF${put(44+size)}WAVEfmt ${p(16,[1,2],[NCH,2],SPS,NCH*BPS*SPS,[NCH*BPS,2],[BPS*8,2])}data${put(size)}' for (let i = 0; i < DUR*SPS; i++) { let f= Math.min(Math.max(fun(i/SPS,DUR,SPS),0),1); data += put(Math.floor( f * (2**(BPS*8)-1)), BPS); } return "data:Audio/WAV;base64," + btoa(data); } function draw(fun, DUR=1, NCH=1, SPS=44100, BPS=1) { time.innerHTML=DUR+'s'; time.setAttribute('x',DUR-0.3); svgCh.setAttribute('viewBox','0 0 ${DUR} 1'); let p='', n=100;
.chart { border: 1px dashed #ccc; } .axis { font-size: 0.2px} audio { outline: none; }
Click at blue line (make volume to max): <svg class="chart" id="svgCh" onclick="changeStart(event)"> <circle cx="0" cy="-1" r="0.05" style="fill: rgba(255,0,0,1)" id="point"></circle> <polyline id="chart" fill="none" stroke="#0074d9" stroke-width="0.01" points=""/> <text x="0.03" y="0.9" class="axis">0</text> <text x="0.03" y="0.2" class="axis">1</text> <text x="4.8" y="0.9" class="axis" id="time"></text> </svg><br>