diff --git a/preview/813/audio/434013__mrpearch__drum-patern.mp3 b/preview/813/audio/434013__mrpearch__drum-patern.mp3 new file mode 100644 index 00000000..8f039326 Binary files /dev/null and b/preview/813/audio/434013__mrpearch__drum-patern.mp3 differ diff --git a/preview/813/audio/Ada_Lovelace_(As_Told_By_U.S._Chief_Technology_Officer_Megan_Smith).mp3 b/preview/813/audio/Ada_Lovelace_(As_Told_By_U.S._Chief_Technology_Officer_Megan_Smith).mp3 new file mode 100644 index 00000000..51b983ec Binary files /dev/null and b/preview/813/audio/Ada_Lovelace_(As_Told_By_U.S._Chief_Technology_Officer_Megan_Smith).mp3 differ diff --git a/preview/813/audio/BluesHawk1.wav b/preview/813/audio/BluesHawk1.wav new file mode 100644 index 00000000..5baf152f Binary files /dev/null and b/preview/813/audio/BluesHawk1.wav differ diff --git a/preview/813/audio/Burns1.wav b/preview/813/audio/Burns1.wav new file mode 100644 index 00000000..b752a873 Binary files /dev/null and b/preview/813/audio/Burns1.wav differ diff --git a/preview/813/audio/DittersdorfOvid2.ogx b/preview/813/audio/DittersdorfOvid2.ogx new file mode 100644 index 00000000..9d321b04 Binary files /dev/null and b/preview/813/audio/DittersdorfOvid2.ogx differ diff --git a/preview/813/audio/captain-pretzel_ghost-gulping.wav b/preview/813/audio/captain-pretzel_ghost-gulping.wav new file mode 100644 index 00000000..bb2b5818 Binary files /dev/null and b/preview/813/audio/captain-pretzel_ghost-gulping.wav differ diff --git a/preview/813/audio/unfinite_function.mp3 b/preview/813/audio/unfinite_function.mp3 new file mode 100644 index 00000000..31b7dad5 Binary files /dev/null and b/preview/813/audio/unfinite_function.mp3 differ diff --git a/preview/813/common.js b/preview/813/common.js new file mode 100644 index 00000000..59a87e16 --- /dev/null +++ b/preview/813/common.js @@ -0,0 +1 @@ +const e="object"==typeof global?global:self,t=[].findIndex||function(e,t){let n=this.length;for(;n--;)if(e.call(t,this[n]))return n;return n},n=Object.defineProperty,i="__event-target__"+Math.random(),o=e.WeakMap||function(){return{get:e=>e[i],set(e,t){n(e,i,{configurable:!0,value:t})}}};let r=e.EventTarget;try{new r}catch(e){r=(()=>{const e=new o,i=t=>e.get(t)||r(t),r=t=>{const n=new f;return e.set(t,n),n},l=(e,t)=>{for(const i in t)n(e,i,{configurable:!0,value:t[i]})};function s(){}function a(e){const t=e.options;t&&t.once&&u.call(e.target,this.type,e.listener,e.options),"function"==typeof e.listener?e.listener.call(e.target,this):e.listener.handleEvent(this)}function c(e){return this===e.listener}function u(e,n,o){const r=i(this)[e];if(r){const e=t.call(r,c,n);-15?e=10:e>2?e=5:e>1&&(e=2),e*t},L=function(){i.clearRect(0,0,t,n),i.font="12px sans-serif",i.textBaseline="middle",i.textAlign="end";const e=D((r-l)/v*30),f=D((a-c)/T*20),h=f>=1?0:-Math.floor(Math.log10(f));for(let e=Math.floor(a/f)*f;e>=c;e-=f)i.strokeStyle="rgb(0, 0, 0)",i.fillText(e.toFixed(h),m-2,P(e));if(i.textBaseline="top",i.textAlign="center",i.setTransform(0,-1,1,0,0,0),u&&i.fillText(u,-(T/2+g),0),i.setTransform(1,0,0,1,0,0),o){i.strokeStyle="rgb(0, 0, 0)";for(let e=Math.pow(10,Math.ceil(Math.log10(l)));e<=r;e*=10)i.fillText(e,A(e),n-y+2)}else{i.strokeStyle="rgb(0, 0, 0)";const t=e>=1?0:-Math.floor(Math.log10(e));for(let o=Math.ceil(l/e)*e;o<=r;o+=e)i.fillText(o.toFixed(t),A(o),n-y+2)}s&&i.fillText(s,m+(t-m)/2,n-y+16);for(let e=Math.floor(a/f)*f;e>=c;e-=f)i.strokeStyle="rgb(100, 100, 100)",i.beginPath(),i.moveTo(A(l),P(e)),i.lineTo(A(r),P(e)),i.stroke();if(o){let e=Math.pow(10,Math.floor(Math.log10(l))),t=Math.ceil(l/e)*e;for(i.strokeStyle="rgb(100, 100, 100)";t<=r;){i.beginPath();const n=A(t);i.moveTo(n,P(a)),i.lineTo(n,P(c)),i.stroke(),t+=e,t>=9.99*e&&(e*=10)}}else for(let t=Math.ceil(l/e)*e;t<=r;t+=e){i.beginPath();const e=A(t);i.moveTo(e,P(a)),i.lineTo(e,P(c)),i.stroke()}i.rect(A(l),P(c),A(r)-A(l),P(a)-P(c)),i.stroke(),b=i.getImageData(0,0,t,n)};this.envelopeMode=!1;let B=[];const C=()=>{i.putImageData(b,0,0),i.save(),i.beginPath(),i.rect(m,g,t-m-10,n-y-g),i.clip();for(let e=0;e+1=0;e--)i.lineTo(A(t[e]),P(-n[e]));i.fill()}else i.stroke()}i.restore()};this.drawData=function(...e){B=e,C()},this.drawMarkers=function(e){i.save(),i.fillStyle="rgb(165, 0, 52)",f=[];for(const t of e)f.push([A(t[0]),P(t[1])]),i.beginPath(),i.arc(A(t[0]),P(t[1]),4,0,2*Math.PI),i.fill();i.restore()},Object.defineProperty(this,"xlim",{get:()=>[l,l],set(e){[l,r]=e,L(),C()}}),Object.defineProperty(this,"ylim",{get:()=>[c,c],set(e){[c,a]=e,L(),C()}}),Object.defineProperty(this,"logx",{get:()=>o,set(e){o=e,o?(x=k,A=M):(x=w,A=E),L(),C()}}),Object.defineProperty(this,"xlabel",{get:()=>s,set(e){s=e,y=s?30:16,T=n-g-y,L(),C()}}),Object.defineProperty(this,"ylabel",{get:()=>u,set(e){u=e,m=u?44:30,v=t-m-10,L(),C()}});const R=(e,t,n)=>{h=null;let i=n;for(let n=0;n{0===e.button&&R(e.offsetX,e.offsetY,6)})),e.addEventListener("touchstart",(e=>{e.preventDefault(),null===h&&R(e.touches.item(0).pageX-e.target.offsetLeft,e.touches.item(0).pageY-e.target.offsetTop,40)}));const O=()=>{if(null!==h){const e=new Event("markermoveend");e.marker=h,this.dispatchEvent(e),h=null}};e.addEventListener("mouseup",(e=>{0===e.button&&O()})),e.addEventListener("touchend",(e=>{e.preventDefault(),0===e.touches.length&&O()}));const W=(e,t)=>{if(null===h)return;const n=new Event("markermove");n.marker=h,n.valX=x(e-d),n.valY=S(t-p),this.dispatchEvent(n)};e.addEventListener("mousemove",(e=>{1===e.buttons?W(e.offsetX,e.offsetY):O()})),e.addEventListener("touchmove",(e=>{e.preventDefault(),W(e.touches.item(0).pageX-e.target.offsetLeft,e.touches.item(0).pageY-e.target.offsetTop)}));new ResizeObserver((e=>{for(const i of e)i.contentBoxSize?i.contentBoxSize[0]?(t=i.contentBoxSize[0].inlineSize,n=i.contentBoxSize[0].blockSize):(t=i.contentBoxSize.inlineSize,n=i.contentBoxSize.blockSize):(t=i.contentRect.width,n=i.contentRect.height);const i=f.map((([e,t])=>[x(e),S(t)]));v=t-m-10,T=n-g-y,L(),C(),this.drawMarkers(i)})).observe(e)}class a extends l{constructor(e){super(),s.call(this,e)}}function c(e,t){const n=new a(t);let i=!1,o=!1;Object.defineProperty(this,"drawWave",{get:()=>i,set(t){i=t,t?(n.logx=!1,n.ylim=[-1,1],n.xlim=[0,e.timeIndices.length-1],n.xlabel="time in samples",n.ylabel="amplitude"):(n.xlim=[50,2e4],n.logx=!o,n.ylim=[-130,0],n.xlabel="frequency in Hz",n.ylabel="magnitude in dB")}}),Object.defineProperty(this,"freqLinear",{get:()=>o,set(e){o=e,i||(n.logx=!o)}}),this.drawWave=!1,function t(){if(setTimeout((()=>requestAnimationFrame(t)),40),i){const t=e.getTimeDomainData();n.drawData(e.timeIndices,t)}else{const t=e.getFrequencyDomainData();n.drawData(e.frequencies,t)}}()}async function u(...e){const t=new(window.AudioContext||window.webkitAudioContext)({latencyHint:"playback"});let n=null,i=null,o=null;const r=t.createAnalyser();r.smoothingTimeConstant=.3,r.minDecibels=-130,r.fftSize=1024;const l=new Float32Array(r.fftSize),s=new Float32Array(r.frequencyBinCount);r.connect(t.destination);let a=null,c=0;await t.audioWorklet.addModule("noisesourceproc.js");const u="object"==typeof e[0]?e[0]:function(e,t){return{init:async n=>{await n.audioWorklet.addModule(e);const i=new AudioWorkletNode(n,t);i.port.postMessage({action:"list-properties"});const o=await(r=i.port,new Promise((e=>{const t=r.onmessage;r.onmessage=n=>{r.onmessage=t,e(n.data)}})));var r;if("list-properties"===o.response)for(const e of o.properties)Object.defineProperty(i,e,{set(t){i.port.postMessage({action:"set-property",param:e,value:t})}});return i},setup:(e,t,n)=>{t.connect(e),e.connect(n)},teardown:e=>{e.disconnect()}}}(...e),f=await u.init(t),h=new Float32Array(r.frequencyBinCount);for(let e=0;enull!==n,createBuffer:e=>new Promise((n=>{t.decodeAudioData(e,n)})),getTimeDomainData:function(){return r.getFloatTimeDomainData(l),l},timeIndices:d,getFrequencyDomainData:function(){return r.getFloatFrequencyData(s),s},frequencies:h,proc:f,get currentTime(){return t.currentTime},get sampleRate(){return t.sampleRate},get position(){if(null===a)return null;let e=this.currentTime-a;return n instanceof AudioBufferSourceNode&&(e=0!==n.loopEnd?e%(n.loopEnd-n.loopStart)+n.loopStart:(e+c)%n.buffer.duration),e}}}class f extends l{constructor(e){super();const t=e.getContext("2d"),{width:n,height:i}=e,o=Array(n),r=Array(n);let l=null,s=null,a=null,c=null,u=null,f=null;const h=()=>{if(t.fillStyle="rgb(221, 218, 215)",t.strokeStyle="rgb(186, 180, 175)",t.fillRect(0,0,n,i),t.strokeRect(0,0,n,i),l instanceof AudioBuffer){t.fillStyle="rgb(186, 180, 175)",null!==a&&(null!==s?t.fillRect(a,0,s-a,i):(t.beginPath(),t.moveTo(a,0),t.lineTo(a,i),t.stroke())),null!==c&&null!==u&&t.fillRect(c,0,u-c,i),t.fillStyle="black",t.beginPath(),t.moveTo(0,i/2);for(let e=0;e=0;e--)t.lineTo(e,(r[e]+1)*i/2);if(t.fill(),null!==f){const e=Math.round(f/l.duration*n);t.lineWidth=1,t.strokeStyle="rgb(165, 0, 52)",t.beginPath(),t.moveTo(e,0),t.lineTo(e,i),t.stroke(),t.strokeStyle="white",t.beginPath(),t.moveTo(e,(r[e]+1)*i/2),t.lineTo(e,(o[e]+1)*i/2),t.stroke()}}},d=e=>{s=e,a=null,c=null,u=null},p=e=>{a=e,h()},m=()=>{if(null!==s){if(l instanceof AudioBuffer)if(null!==a&&a!==s){s>a&&([s,a]=[a,s]);const e=new Event("selected");e.startPos=s*l.length/n/l.sampleRate,e.endPos=a*l.length/n/l.sampleRate,this.dispatchEvent(e),c=s,u=a}else{const e=new Event("clicked");e.position=s*l.length/n/l.sampleRate,this.dispatchEvent(e)}s=null,a=null,h()}};e.addEventListener("mousedown",(e=>{0===e.button&&d(e.offsetX)})),e.addEventListener("touchstart",(e=>{e.preventDefault(),d(e.touches.item(0).pageX-e.target.offsetLeft)})),e.addEventListener("mousemove",(e=>{p(e.offsetX)})),e.addEventListener("touchmove",(e=>{e.preventDefault(),p(e.touches.item(0).pageX-e.target.offsetLeft)})),e.addEventListener("mouseup",(e=>{0===e.button&&m()})),e.addEventListener("touchend",(e=>{e.preventDefault(),0===e.touches.length&&m()})),e.addEventListener("mouseleave",(()=>{null===s&&(a=null,h())})),Object.defineProperty(this,"signal",{set(e){if(e instanceof AudioBuffer){l=e,o.fill(-1),r.fill(1);for(let e=0;eo[i]&&(o[i]=t[e]),t[e]null!==c&&null!==u?{start:c*l.length/n/l.sampleRate,end:u*l.length/n/l.sampleRate}:null}),Object.defineProperty(this,"playbackPosition",{set(e){f=e,h()}})}}function h(e,t){const n=[];let i=null;const o=document.getElementById("source-select"),r=o.children[1];o.children[0].addEventListener("click",(e=>{e.stopPropagation(),r.style.visibility="visible"===r.style.visibility?"hidden":"visible"}),!1),document.addEventListener("click",(()=>{r.style.visibility="hidden"}),!1);const l=document.getElementById("play"),s=document.getElementById("stop"),a=new f(document.getElementById("timelinecanvas"));function c(){e.isPlaying()?(l.disabled=!0,s.disabled=!1):(s.disabled=!0,l.disabled=!n[i])}function u(t){i=Number(t.getAttribute("data-source-idx")),o.children[0].innerText=t.textContent,function e(t){t.classList.remove("selected"),Array.from(t.children).forEach(e)}(r),t.classList.add("selected"),e.stop(),c(),a.signal=n[i]}function h(e,t){e.innerText=t,Number(e.getAttribute("data-source-idx"))===i&&(o.children[0].innerText=t)}t.forEach((async function(t){const o=document.createElement("div");if(o.setAttribute("data-source-idx",n.length),r.children[0].append(o),o.addEventListener("click",(e=>{u(e.target)})),"remote"===t.type){o.innerText=`${t.label} (loading...)`;const r=n.length;n.push(null);const l=await window.fetch(t.url);n[r]=await e.createBuffer(await l.arrayBuffer()),h(o,t.label),r===i&&(a.signal=n[r])}else if("sine"===t.type){const e=t.frequency||440;o.innerText=t.label||`${e} Hz sine`,n.push({type:"sine",frequency:e,gain:t.gain||.5})}else"noise"===t.type&&(o.innerText=t.label||"Noise",n.push({type:"noise",filter:t.filter||[],gain:t.gain||.5}));c()})),s.onclick=function(){e.stop(),c()},l.onclick=function(){const t=a.selection;null!==t?e.start(n[i],t.start,t.end):e.start(n[i]),c()};const d=r.children[1],p=d.children[0],m=document.createElement("input");m.type="file",m.accept="audio/*",m.addEventListener("change",(async t=>{const i=t.target.files[0];if(!i)return;const o=document.createElement("div");o.setAttribute("data-source-idx",n.length),o.innerText=`${i.name} (loading...)`,u(o),d.insertBefore(o,p);const r=n.length;o.addEventListener("click",(e=>{u(e.target)})),n.push(null);const l=await new Promise((e=>{const t=new FileReader;t.onload=t=>{e(t.target.result)},t.readAsArrayBuffer(i)}));n[r]=await e.createBuffer(l),h(o,i.name),c()}),!1),0===t.length?o.children[0].innerText="input signal":u(r.children[0].children[0]),p.addEventListener("click",(()=>{m.click()})),a.addEventListener("clicked",(t=>{e.stop(),e.start(n[i],t.position),c()})),a.addEventListener("selected",(t=>{e.stop(),e.start(n[i],t.startPos,t.endPos),c()}));const v=()=>{a.playbackPosition=e.position,setTimeout((()=>requestAnimationFrame(v)),40)};v()}void 0===Math.log10&&(Math.log10=function(e){return Math.LOG10E*Math.log(e)}),void 0===AnalyserNode.prototype.getFloatTimeDomainData&&(AnalyserNode.prototype.getFloatTimeDomainData=function(e){const t=new Uint8Array(e.length);this.getByteTimeDomainData(t);for(let n=0;n{try{await navigator.serviceWorker.register("sw.js",{type:"module"})}catch(e){console.warn("ServiceWorker registration failed: ",e)}}));export{a as FunctionGraph,c as SignalGraph,u as setupAudio,h as setupPlayerControls};!function(){function e(e,t){var n=document.createElement("iframe");n.style.cssText="position:absolute;left:0;top:-999px;width:1px;height:1px;",t.appendChild(n);var i=n.contentWindow,o=i.document,r="var window,$hook";for(var l in i)l in e||"eval"===l||(r+=",",r+=l);for(var s in e)r+=",",r+=s,r+="=self.",r+=s;var a=o.createElement("script");a.appendChild(o.createTextNode('function $hook(self,console) {"use strict";\n '+r+";return function() {return eval(arguments[0])}}")),o.body.appendChild(a),this.exec=i.$hook(e,console)}var t,n=[];function i(e){for(var t=[],n=0;n=0&&i[o].eventTime>n.eventTime;)o--;if(-1===o){var r=a.parameters.get(t).value,l=e.currentTime;n instanceof u?m(n,r,l):(i.splice(0,0,new u(r,l)),o=0)}i.splice(o+1,0,n)}if(u.prototype.func=function(e){return e>=this.eventTime?this.v:this.v0},f.prototype.func=function(e){return e>=this.eventTime?this.v1:e<=this.t0||this.v1*this.v0<=0?this.v0:this.v0*Math.pow(this.v1/this.v0,(e-this.t0)/(this.eventTime-this.t0))},h.prototype.func=function(e){return e>=this.eventTime?this.v1:e<=this.t0?this.v0:this.v0+(this.v1-this.v0)*(e-this.t0)/(this.eventTime-this.t0)},d.prototype.func=function(e){return e<=this.eventTime?this.v0:this.v1+(this.v0-this.v1)*Math.exp((this.eventTime-e)/this.tau)},p.prototype.func=function(e){if(e<=this.eventTime)return this.v0;var t=this.duration/(this.values.length-1),n=Math.floor((e-this.eventTime)/t);return n>=this.values.length-1?this.values[this.values.length-1]:this.values[n]+(this.values[n+1]-this.values[n])*(e-(n*t+this.eventTime))/t},a.parameters=new Map,s.properties)for(var g=function(){var t=s.properties[y],n=e.createGain().gain;n.value=t.defaultValue,n.cancelAndHoldAtTime=function(e){for(var n=c.get(t.name),i=0;i0?n[i-1]:null,r=i0&&n.push(new u(n[i-1].func(e),e))},n.exponentialRampToValueAtTime=function(n,i){ia[0].eventTime;){if(a[0]instanceof d){if(a.length<2)break;if(a[1]instanceof d&&f Delay-Based Audio Effects

Delay-Based Audio Effects

Predefined
Local files
Browse...
Mod. Freq.
Mod. Depth

This script demonstrates audio effects resulting from delay-based algorithms. It is designed for a first insight into the perceptual experience of one amplitude-modulation and three delay-based audio effects: tremolo, vibrato, chorus, and flanger.

Tremolo is the rapid repetition of one note in music terminology or a rapid alternation between two or more notes (string instruments, mandolin, flute, piano, harpsichord, spinet, guitar). In technical terminology tremolo is a rapid repetitive increase and decrease in volume. The effect is based on modifying the time domain envelope (amplitude) of a signal.

Vibrato is the rapid and repetitive variation in pitch for the duration of a note (string instruments, guitar, singing voice, yodeling). In technical terminology the effect is based on modifying the pitch of a signal by delay line modulation (phase modulation).

Chorus simulates the result of an ensemble of musicians (singers, violins) playing together with slight pitch and amplitude differences. The chorus effect performs a loudness increase. These amplitude and pitch differences are simulated by amplitude modulation and delay line modulation (phase modulation) and all signals are summed together to form the output signal.

A flanger simulates a special filter effect wich occurs if a slowly time-varying single reflection is added to the direct signal (jet airplane effect). This effect was achieved by playing two copies of a single signal from two tape machines while slowing down the replay speed of one tape machine by placing a finger to the flange of one tape reel.

You can choose between two predefined audio signals or your own local audio file to be processed.

Predefined music signals "Guitar riff 1" and "Guitar riff 2" are licensed under CC0-1.0.

\ No newline at end of file diff --git a/preview/813/delays.js b/preview/813/delays.js new file mode 100644 index 00000000..04570d53 --- /dev/null +++ b/preview/813/delays.js @@ -0,0 +1 @@ +import{SignalGraph as e,setupAudio as o,setupPlayerControls as t}from"./common.js";window.addEventListener("load",(async()=>{const n={tremolo:.5,vibrato:.003,flanger:.002,chorus:.015},a={tremolo:0,vibrato:1,flanger:1,chorus:.3},i={tremolo:0,vibrato:0,flanger:1,chorus:1},d=await o({init:e=>({audioCtx:e,_type:"tremolo",_bypass:!1,_modulationFrequency:1,_modulationDepth:1,modulationSourceNode:null,modulationGainNode:null,modulationNode:null,modulationNoiseSourceNodes:null,modulationNoiseGainNodes:null,delayNodes:null,dryGainNode:null,tremoloWetGainNode:null,delayWetGainNode:null,chorusDelayWetGainNode:null,updateCoefficients(){if(this.modulationGainNode){this.tremoloWetGainNode.gain.value=this._bypass||"tremolo"!==this._type?0:1,this.delayWetGainNode.gain.value=this._bypass?0:a[this._type],this.chorusDelayWetGainNode.gain.value=this._bypass||"chorus"!==this._type?0:.3,this.dryGainNode.gain.value=this._bypass?1:i[this._type],this.modulationGainNode.gain.value="chorus"!==this._type?n[this._type]*this._modulationDepth:0;for(let e=0;e<3;e++)this.modulationNoiseGainNodes[e].gain.value="chorus"===this._type?n[this._type]*this._modulationDepth:0;this.modulationSourceNode.frequency.value=this._modulationFrequency;for(let e=0;e<3;e++)this.modulationNoiseSourceNodes[e].parameters.get("fadePeriod").value=.5/this._modulationFrequency;this.modulationNode.gain.value=1-.5*this._modulationDepth;for(let e=0;e<3;e++)this.delayNodes[e].delayTime.value=n[this._type]*this._modulationDepth+.008*e}},set type(e){this._type=e,this.updateCoefficients()},set bypass(e){this._bypass=e,this.updateCoefficients()},set modulationFrequency(e){this._modulationFrequency=e,this.updateCoefficients()},set modulationDepth(e){this._modulationDepth=e,this.updateCoefficients()}}),setup:(e,o,t)=>{e.modulationSourceNode=e.audioCtx.createOscillator(),e.modulationSourceNode.type="sine",e.modulationSourceNode.start(),e.modulationGainNode=e.audioCtx.createGain(),e.modulationNode=e.audioCtx.createGain(),e.modulationNoiseSourceNodes=new Array(3),e.modulationNoiseGainNodes=new Array(3),e.delayNodes=new Array(3);for(let o=0;o<3;o++)e.modulationNoiseSourceNodes[o]=new AudioWorkletNode(e.audioCtx,"noisesource-processor",{numberOfInputs:0,outputChannelCount:[1]}),e.modulationNoiseGainNodes[o]=e.audioCtx.createGain(),e.delayNodes[o]=e.audioCtx.createDelay(),e.modulationNoiseSourceNodes[o].connect(e.modulationNoiseGainNodes[o]),e.modulationNoiseGainNodes[o].connect(e.delayNodes[o].delayTime);e.dryGainNode=e.audioCtx.createGain(),e.tremoloWetGainNode=e.audioCtx.createGain(),e.delayWetGainNode=e.audioCtx.createGain(),e.chorusDelayWetGainNode=e.audioCtx.createGain(),e.modulationSourceNode.connect(e.modulationGainNode),e.modulationGainNode.connect(e.modulationNode.gain),o.connect(e.modulationNode),e.modulationNode.connect(e.tremoloWetGainNode),e.tremoloWetGainNode.connect(t),e.modulationGainNode.connect(e.delayNodes[0].delayTime),o.connect(e.delayNodes[0]),o.connect(e.delayNodes[1]),o.connect(e.delayNodes[2]),e.delayNodes[0].connect(e.delayWetGainNode),e.delayNodes[1].connect(e.chorusDelayWetGainNode),e.delayNodes[2].connect(e.chorusDelayWetGainNode),e.delayWetGainNode.connect(t),e.chorusDelayWetGainNode.connect(t),o.connect(e.dryGainNode),e.dryGainNode.connect(t),e.updateCoefficients()},teardown:e=>{e.modulationSourceNode&&(e.modulationSourceNode.disconnect(),e.modulationSourceNode=null),e.modulationGainNode&&(e.modulationGainNode.disconnect(),e.modulationGainNode=null),e.modulationNode&&(e.modulationNode.disconnect(),e.modulationNode=null),e.modulationNoiseSourceNodes&&(e.modulationNoiseSourceNodes.forEach((e=>e.disconnect())),e.modulationNoiseSourceNodes=null),e.modulationNoiseGainNodes&&(e.modulationNoiseGainNodes.forEach((e=>e.disconnect())),e.modulationNoiseGainNodes=null),e.delayNodes&&(e.delayNodes.forEach((e=>e.disconnect())),e.delayNodes=null),e.dryGainNode&&(e.dryGainNode.disconnect(),e.dryGainNode=null),e.tremoloWetGainNode&&(e.tremoloWetGainNode.disconnect(),e.tremoloWetGainNode=null),e.delayWetGainNode&&(e.delayWetGainNode.disconnect(),e.delayWetGainNode=null),e.chorusDelayWetGainNode&&(e.chorusDelayWetGainNode.disconnect(),e.chorusDelayWetGainNode=null)}});t(d,[{type:"remote",label:"Guitar riff 1",url:"audio/Burns1.wav"},{type:"remote",label:"Guitar riff 2",url:"audio/BluesHawk1.wav"}]);const l=new e(d,document.getElementById("funccanvas")),u=document.getElementById("linear");u.checked=!1,u.onchange=function(e){l.freqLinear=e.target.checked};const s=e=>{l.drawWave=e,u.style.visibility=u.labels[0].style.visibility=e?"hidden":"visible"};s(!0),document.getElementById("spectrum").onchange=e=>{s(!e.target.checked)},document.getElementById("waveform").onchange=e=>{s(e.target.checked)},document.getElementById("bypass").checked=!1,document.getElementById("bypass").onchange=function(e){d.proc.bypass=e.target.checked};const c={tremolo:20,vibrato:5,flanger:1,chorus:5};document.getElementById("effecttype").value="tremolo",document.getElementById("effecttype").onchange=function(e){const o=e.target.value;if(!(o in c))return;d.proc.type=o,document.getElementById("diagram").src=`images/delays/${o}1.png`;const t=c[o],n=document.getElementById("modulationfrequency"),a=n.value*t/n.max;n.max=t,n.value=a,n.labels[0].innerText=`${a} Hz`,d.proc.modulationFrequency=a},document.getElementById("modulationfrequency").value=1,document.getElementById("modulationfrequency").oninput=function(e){e.target.labels[0].innerText=`${e.target.value} Hz`,d.proc.modulationFrequency=e.target.value},document.getElementById("modulationdepth").value=1,document.getElementById("modulationdepth").oninput=function(e){e.target.labels[0].innerText=e.target.value,d.proc.modulationDepth=e.target.value}})); \ No newline at end of file diff --git a/preview/813/distortion.html b/preview/813/distortion.html new file mode 100644 index 00000000..2730bfc3 --- /dev/null +++ b/preview/813/distortion.html @@ -0,0 +1 @@ + Distortion

Distortion

Predefined
Local files
Browse...

This script demonstrates audio effects resulting from nonlinear signal distortion.

The input signal is routed over the nonlinear transfer function plotted above. The marked handle allows you to adjust the input and output gain of the audio signal. Horizontal movement changes the input gain, vertical movement changes the output gain. Please be careful: the signal may be clipped at the top and bottom, which will produce awful sounds!

You can choose between two predefined audio signals or your own local audio file to be processed.

Predefined music signals "Guitar riff 1" and "Guitar riff 2" are licensed under CC0-1.0.

\ No newline at end of file diff --git a/preview/813/distortion.js b/preview/813/distortion.js new file mode 100644 index 00000000..87248a93 --- /dev/null +++ b/preview/813/distortion.js @@ -0,0 +1 @@ +import{FunctionGraph as e,setupAudio as t,setupPlayerControls as a}from"./common.js";window.addEventListener("load",(async()=>{const r=await t("distortionproc.js","distortion-processor");a(r,[{type:"remote",label:"Guitar riff 1",url:"audio/Burns1.wav"},{type:"remote",label:"Guitar riff 2",url:"audio/BluesHawk1.wav"}]);let o=50,n=1;r.proc.parameters.get("inputGain").value=o,r.proc.parameters.get("outputGain").value=n;const l=new e(document.getElementById("funccanvas"));l.logx=!1,l.xlim=[-1,1],l.ylim=[-1,1];const i=new Float32Array(500),u=new Float32Array(500),s=()=>{for(let e=0;e1?a=1:a<-1&&(a=-1),u[e]=a}l.drawData(i,u),l.drawMarkers([[Math.log(3)/o,.5*n]])},c=(e,t)=>{e.cancelScheduledValues(r.currentTime),e.exponentialRampToValueAtTime(t,r.currentTime+.05)};l.addEventListener("markermove",(e=>{o=Math.log(3)/e.valX,o>1e3||o<0?o=1e3:o2?n=2:n<0&&(n=0),c(r.proc.parameters.get("inputGain"),o),c(r.proc.parameters.get("outputGain"),n),s()})),s()})); \ No newline at end of file diff --git a/preview/813/distortionproc.js b/preview/813/distortionproc.js new file mode 100644 index 00000000..14358cab --- /dev/null +++ b/preview/813/distortionproc.js @@ -0,0 +1 @@ +class t extends AudioWorkletProcessor{constructor(t){super();const e=this;this.port.onmessage=r=>{"set-property"===r.data.action?e[r.data.param]=r.data.value:"list-properties"===r.data.action&&e.port.postMessage({response:"list-properties",properties:t})}}}class e extends t{constructor(){super([])}static get parameterDescriptors(){return[{name:"inputGain",defaultValue:1},{name:"outputGain",defaultValue:1}]}static parameterAt(t,e){return t[1===t.length?0:e]}process(t,r,s){if(0===t[0].length)return!0;for(let a=0;a Dynamic Range Control

Dynamic Range Control

Predefined
Local files
Browse...
Input signal
Output signal

This script allows a simple dynamic range control of an audio signal. To do this, the current level of the input signal is determined and a gain factor is derived, such that a given relation between input level and output level is achieved.

This relation can be controlled with the curve displayed in the right half.

  • By dragging the upper right vertex horizontally the limiter threshold can be controlled. Input levels exceeding this threshold are attenuated to a constant output level.
  • By dragging the upper right vertex vertically an overall gain can be controlled.
  • By dragging the lower left vertex horizontally the noise threshold can be controlled. If the input level is below this threshold, the output is muted.
  • By dragging the lower left vertex vertically the compression ratio is controlled, that is the slope of the line segment between limiter and noise threshold. A flat line segment causes compression, while a steep line segment causes expansion.

The gain factor thus obtained is low-pass filtered to reduce harmonic distortion.

You can choose between two predefined audio signals or your own local audio file to be processed.

Predefined music signal "Funk" is licensed under CC-BY-3.0 by unfinite.

Predefined music signal "Orchestra" is licensed under CC-BY-SA-4.0 by Porticodoro / SmartCGArt Media Productio.

\ No newline at end of file diff --git a/preview/813/drc.js b/preview/813/drc.js new file mode 100644 index 00000000..f0df6e18 --- /dev/null +++ b/preview/813/drc.js @@ -0,0 +1 @@ +import{FunctionGraph as e,setupAudio as t,setupPlayerControls as a}from"./common.js";window.addEventListener("load",(async()=>{const o=await t("drcproc.js","drc-processor");a(o,[{type:"remote",label:"Funk",url:"audio/unfinite_function.mp3"},{type:"remote",label:"Orchestra",url:"audio/DittersdorfOvid2.ogx"}]);const n={in:-80,out:-45},r={in:-10,out:-10};o.proc.bypass=!1,o.proc.newyorkstyle=!1,o.proc.parameters.get("limiterThreshold").value=r.in,o.proc.parameters.get("limiterLevel").value=r.out,o.proc.parameters.get("noiseThreshold").value=n.in,o.proc.parameters.get("compressionRatio").value=(r.in-n.in)/(r.out-n.out);const i=new e(document.getElementById("funccanvas"));i.logx=!1,i.xlim=[-90,0],i.xlabel="input level in dB",i.ylim=[-90,0],i.ylabel="output level in dB";const l=()=>{i.drawData([n.in,n.in,r.in,0],[-120,n.out,r.out,r.out]),i.drawMarkers([[n.in,n.out],[r.in,r.out]])};i.addEventListener("markermove",(e=>{0===e.marker?(n.in=Math.max(Math.min(e.valX,r.in),-90),n.out=Math.max(Math.min(e.valY,r.out-.1),-90),o.proc.parameters.get("noiseThreshold").value=n.in,o.proc.parameters.get("compressionRatio").value=(r.in-n.in)/(r.out-n.out)):1===e.marker&&(r.in=Math.max(Math.min(e.valX,0),n.in),r.out=Math.max(Math.min(e.valY,0),n.out+.1),o.proc.parameters.get("limiterThreshold").value=r.in,o.proc.parameters.get("limiterLevel").value=r.out,o.proc.parameters.get("compressionRatio").value=(r.in-n.in)/(r.out-n.out)),l()})),l();const m=new e(document.getElementById("inputenvcanvas"));m.logx=!1,m.xlim=[-512e3/o.sampleRate,0],m.xlabel="time in s",m.ylim=[-1,1],m.envelopeMode=!0;const s=new e(document.getElementById("outputenvcanvas"));s.logx=!1,s.xlim=[-512e3/o.sampleRate,0],s.xlabel="time in s",s.ylim=[-1,1],s.envelopeMode=!0,o.proc.envelopeSubsampling=2e3;const c=new Float32Array(256);for(let e=0;e{var t,a;t=e.data.inputEnvelope,a=e.data.outputEnvelope,m.drawData(c,t),s.drawData(c,a)},document.getElementById("newyork").onchange=function(e){o.proc.newYorkStyle=e.target.checked,document.getElementById("diagram").src=e.target.checked?"images/drc/diag1.png":"images/drc/diag2.png"},document.getElementById("bypass").onchange=function(e){o.proc.bypass=e.target.checked}})); \ No newline at end of file diff --git a/preview/813/drcproc.js b/preview/813/drcproc.js new file mode 100644 index 00000000..c3be2c12 --- /dev/null +++ b/preview/813/drcproc.js @@ -0,0 +1 @@ +class t extends AudioWorkletProcessor{constructor(t){super();const e=this;this.port.onmessage=a=>{"set-property"===a.data.action?e[a.data.param]=a.data.value:"list-properties"===a.data.action&&e.port.postMessage({response:"list-properties",properties:t})}}}class e extends t{constructor(){super(["bypass","newYorkStyle","envelopeSubsampling"]),this.instantaneousPower=1,this.gain=1,this.inputMaxima=new Float32Array(256),this.outputMaxima=new Float32Array(256),this.currentInputMax=0,this.currentOutputMax=0,this.maxSampleCount=0,this.envelopeSubsampling=2e3,this.bypass=!1,this.newYorkStyle=!1}static get parameterDescriptors(){return[{name:"limiterThreshold",defaultValue:-10},{name:"limiterLevel",defaultValue:-10},{name:"noiseThreshold",defaultValue:-80},{name:"compressionRatio",defaultValue:2}]}static parameterAt(t,e){return t[1===t.length?0:e]}process(t,a,s){if(0===t[0].length)return!0;for(let i=0;ithis.instantaneousPower?this.instantaneousPower=.99*this.instantaneousPower+.01*r:this.instantaneousPower=.995*this.instantaneousPower+.005*r;const n=10*Math.log10(this.instantaneousPower),o=e.parameterAt(s.limiterThreshold,i),u=e.parameterAt(s.limiterLevel,i),p=e.parameterAt(s.noiseThreshold,i),h=e.parameterAt(s.compressionRatio,i);let l=-1e3;n>o?l=u-n:n>p&&(l=u-n+(n-o)/h),this.gain=.99*this.gain+.01*Math.pow(10,l/20);for(let e=0;e=this.envelopeSubsampling&&(this.maxSampleCount=0,this.inputMaxima.copyWithin(0,1),this.inputMaxima[this.inputMaxima.length-1]=this.currentInputMax,this.currentInputMax=0,this.outputMaxima.copyWithin(0,1),this.outputMaxima[this.outputMaxima.length-1]=this.currentOutputMax,this.currentOutputMax=0,this.port.postMessage({inputEnvelope:new Float32Array(this.inputMaxima),outputEnvelope:new Float32Array(this.outputMaxima)}))}return!0}}registerProcessor("drc-processor",e); \ No newline at end of file diff --git a/preview/813/eq.html b/preview/813/eq.html new file mode 100644 index 00000000..82acd4e1 --- /dev/null +++ b/preview/813/eq.html @@ -0,0 +1 @@ + Audio Filters

Audio Filters

Predefined
Local files
Browse...

This script demonstrates audio effects resulting from Audio Filters. It is designed for a first insight into the perceptual effect of filtering an audio signal. Besides the different filter functions and their acoustical effect the script offers a first insight into the logarithmic behavior of loudness and frequency resolution of our human acoustical perception.

The following filter types can be set in the lower part of the user interface; their parameters can be controlled by dragging the red dot(s) in the frequency response graph.

  • Low-/High-pass filter (LP/HP) with control parameter
    • cut-off frequency
    • all frequencies above (LP) or below (HP) the cut-off frequency are attenuated according to the shown frequency response
  • Low/High-frequency shelving filter (LFS/HFS) with control parameters
    • cut-off frequency fc
    • boost/cut
    • all frequencies below (LFS) or above (HFS) the cut-off frequency are boosted/cut according to the selected boost/cut
  • Peak filter with control parameters
    • center frequency fc
    • boost/cut
    • Q-factor Q=fc/fb, which controls the bandwidth fb of the boost/cut around the adjusted center frequency fc. Lower Q-factor means wider bandwidth.
    • the peak filter boosts/cuts the center frequency with a bandwidth adjusted by the Q-factor.

The center window shows the frequency response (filter gain versus frequency) of the selected filter functions. You can choose between a linear and a logarithmic frequency axis.

You can choose between two predefined audio signals or your own local audio file to be processed.

Predefined music signal "Funk" is licensed under CC-BY-3.0 by unfinite.

Predefined music signal "Orchestra" is licensed under CC-BY-3.0 by Captain Pretzel.

\ No newline at end of file diff --git a/preview/813/eq.js b/preview/813/eq.js new file mode 100644 index 00000000..e174a833 --- /dev/null +++ b/preview/813/eq.js @@ -0,0 +1 @@ +import{FunctionGraph as e,setupAudio as a,setupPlayerControls as t}from"./common.js";window.addEventListener("load",(async()=>{const r=await a("eqproc.js","eq-processor");t(r,[{type:"remote",label:"Funk",url:"audio/unfinite_function.mp3"},{type:"remote",label:"Orchestra",url:"audio/captain-pretzel_ghost-gulping.wav"}]);let n=1,o=1,s=1;r.proc.type="lowpass",r.proc.bypass=!1,r.proc.parameters.get("omegaC").value=n,r.proc.parameters.get("gain").value=o,r.proc.parameters.get("Q").value=s;const m=new e(document.getElementById("funccanvas"));m.xlim=[20,2e4],m.ylim=[-20,20];const c=()=>[[n/2/Math.PI*r.sampleRate,-3]],l=()=>[[n/2/Math.PI*r.sampleRate,10*Math.log10(o>=1?(1+o*o)/2:2/(1+1/(o*o)))]],g=()=>1,p=e=>e>=0?Math.sqrt(2*Math.pow(10,e/10)-1):1/Math.sqrt(2/Math.pow(10,e/10)-1),u={lowpass:{magnitudeSquared(e,a){const t=a*(1+e);return t*t/(t*t+(1-e)*(1-e))},get markers(){return c()},gainFromMarker:g},highpass:{magnitudeSquared(e,a){const t=1-e;return t*t/(t*t+a*(1+e)*a*(1+e))},get markers(){return c()},gainFromMarker:g},lowshelving:{magnitudeSquared(e,a){const t=(1-e)*(1-e),r=a*a*(1+e)*(1+e);return o>=1?(t+o*o*r)/(t+r):(t+r)/(t+r/(o*o))},get markers(){return l()},gainFromMarker:p},highshelving:{magnitudeSquared(e,a){const t=(1-e)*(1-e),r=a*a*(1+e)*(1+e);return o>=1?(o*o*t+r)/(t+r):(t+r)/(t/(o*o)+r)},get markers(){return l()},gainFromMarker:p},peak:{magnitudeSquared(e,a){const t=(1-e)*(1-e)+a*a*(1+e)*(1+e),r=a*(1-e*e),n=s*s;return o>=1?(t+(o*o/n-2)*r)/(t+(1/n-2)*r):(t+(1/n-2)*r)/(t+(1/(o*o*n)-2)*r)},get markers(){const e=10*Math.log10(o>=1?(1+o*o)/2:2/(1+1/(o*o))),a=Math.tan(n/2),t=1/(2*s)+Math.sqrt(1+1/(4*s*s)),m=Math.atan(a*t)*r.sampleRate/Math.PI,c=Math.atan(a/t)*r.sampleRate/Math.PI,l=[[n/2/Math.PI*r.sampleRate,20*Math.log10(o)]];return c>=20&&l.push([c,e]),m<=2e4&&l.push([m,e]),l},gainFromMarker:e=>Math.pow(10,e/20)}};let h=u.lowpass;const i=()=>{const e=Math.tan(n/2),a=e*e,t=new Float32Array(500),o=new Float32Array(500);for(let e=0;e{e.cancelScheduledValues(r.currentTime),e.exponentialRampToValueAtTime(a,r.currentTime+.05)};m.addEventListener("markermove",(e=>{const a=e.valX<20?20:e.valX;if(0===e.marker)n=2*Math.PI*a/r.sampleRate,d(r.proc.parameters.get("omegaC"),n),o=h.gainFromMarker(e.valY),o>10?o=10:o<.1&&(o=.1),d(r.proc.parameters.get("gain"),o);else if(1===e.marker|2===e.marker){const e=Math.tan(n/2),t=Math.tan(Math.PI*a/r.sampleRate)/e;s=Math.abs(1/(t-1/t)),d(r.proc.parameters.get("Q"),s)}i()})),i();const M=document.getElementById("linear");M.checked=!1,M.onchange=function(e){m.logx=!e.target.checked,i()},document.getElementById("bypass").onchange=function(e){r.proc.bypass=e.target.checked},document.getElementById("type").onchange=function(e){r.proc.type=e.target.value,h=u[e.target.value],i()}})); \ No newline at end of file diff --git a/preview/813/eqproc.js b/preview/813/eqproc.js new file mode 100644 index 00000000..75b170ed --- /dev/null +++ b/preview/813/eqproc.js @@ -0,0 +1 @@ +class t extends AudioWorkletProcessor{constructor(t){super();const s=this;this.port.onmessage=a=>{"set-property"===a.data.action?s[a.data.param]=a.data.value:"list-properties"===a.data.action&&s.port.postMessage({response:"list-properties",properties:t})}}}class s extends t{constructor(){super(["type","bypass"]),this.type="lowpass",this.state=new Array(0),this.a0=1,this.a1=0,this.a2=0,this.b0=1,this.b1=0,this.b2=0,this.bypass=!1}static get parameterDescriptors(){return[{name:"omegaC",defaultValue:1},{name:"gain",defaultValue:1},{name:"Q",defaultValue:1}]}setChannelCount(t){if(this.state.length!==t){this.state=new Array(t);for(let t=0;t=1){const h=s;this.b0=1+Math.sqrt(2*h)*t+h*a,this.b1=2*(h*a-1),this.b2=1-Math.sqrt(2*h)*t+h*a,this.a0=1+Math.SQRT2*t+a,this.a1=2*(-1+a),this.a2=1-Math.SQRT2*t+a}else{const h=1/s;this.b0=1+Math.SQRT2*t+a,this.b1=2*(-1+a),this.b2=1-Math.SQRT2*t+a,this.a0=1+Math.sqrt(2*h)*t+h*a,this.a1=2*(h*a-1),this.a2=1-Math.sqrt(2*h)*t+h*a}},highshelving(t,s){const a=t*t;if(s>=1){const h=s;this.b0=h+Math.sqrt(2*h)*t+a,this.b1=2*(-h+a),this.b2=h-Math.sqrt(2*h)*t+a,this.a0=1+Math.SQRT2*t+a,this.a1=2*(-1+a),this.a2=1-Math.SQRT2*t+a}else{const h=1/s;this.b0=1+Math.SQRT2*t+a,this.b1=2*(-1+a),this.b2=1-Math.SQRT2*t+a,this.a0=h+Math.sqrt(2*h)*t+a,this.a1=2*(-h+a),this.a2=h-Math.sqrt(2*h)*t+a}},peak(t,s,a){const h=t*t;if(s>=1){const e=s;this.b0=1+e/a*t+h,this.b1=2*(-1+h),this.b2=1-e/a*t+h,this.a0=1+1/a*t+h,this.a1=2*(-1+h),this.a2=1-1/a*t+h}else{const e=1/s;this.b0=1+1/a*t+h,this.b1=2*(-1+h),this.b2=1-1/a*t+h,this.a0=1+e/a*t+h,this.a1=2*(-1+h),this.a2=1-e/a*t+h}}},registerProcessor("eq-processor",s); \ No newline at end of file diff --git a/preview/813/fastconv.html b/preview/813/fastconv.html new file mode 100644 index 00000000..d1506650 --- /dev/null +++ b/preview/813/fastconv.html @@ -0,0 +1 @@ + Fast Convolution

Fast Convolution

Predefined
Local files
Browse...

This script demonstrates audio effects resulting from a Fast Convolution algorithm. It is designed for a first insight into the perceptual effects of convolving an inpulse response with an audio signal.

The script generates an impulse response by modulating the amplitude of a random signal. The graphical interface presents the curve of the amplitude modulation, which can be manipulated with three control points. Two control points are used for the initial behaviour of the amplitude modulation. The third control point is used for the exponential decay of the impulse response.

You can choose between two predefined audio signals or your own local audio file to be processed.

Predefined music signal "Drums" is licensed under CC0-1.0.

Predefined signal "Speech" is in the public domain.

\ No newline at end of file diff --git a/preview/813/fastconv.js b/preview/813/fastconv.js new file mode 100644 index 00000000..db7cf210 --- /dev/null +++ b/preview/813/fastconv.js @@ -0,0 +1 @@ +import{FunctionGraph as e,setupAudio as o,setupPlayerControls as a}from"./common.js";window.addEventListener("load",(async()=>{const n=200,t=await o({init(e){const o=e.createBuffer(2,e.sampleRate*n/1e3,e.sampleRate),a=800/Math.sqrt(o.length)*e.sampleRate/44100;return{audioCtx:e,convolverNode:null,dryGainNode:null,wetGainNode:null,impulseResponseBuffer:o,set bypass(e){this._bypass=e,this.updateCoefficients()},updateCoefficients(){this.dryGainNode&&(this.dryGainNode.gain.value=this._bypass?1:0),this.wetGainNode&&(this.wetGainNode.gain.value=this._bypass?0:a)},_bypass:!1}},setup(e,o,a){e.convolverNode=e.audioCtx.createConvolver(),e.convolverNode.buffer=e.impulseResponseBuffer,o.connect(e.convolverNode),e.wetGainNode=e.audioCtx.createGain(),e.convolverNode.connect(e.wetGainNode),e.wetGainNode.connect(a),e.dryGainNode=e.audioCtx.createGain(),o.connect(e.dryGainNode),e.dryGainNode.connect(a),e.updateCoefficients()},teardown(e){e.convolverNode&&(e.convolverNode.disconnect(),e.convolverNode=null)}});a(t,[{type:"remote",label:"Drums",url:"audio/434013__mrpearch__drum-patern.mp3"},{type:"remote",label:"Speech",url:"audio/Ada_Lovelace_(As_Told_By_U.S._Chief_Technology_Officer_Megan_Smith).mp3"}]);const r={x:30,y:.3},s={x:50,y:.8};let i=n;const l=e=>{if(e{for(let e=0;e<2;e++){const o=t.proc.impulseResponseBuffer.getChannelData(e);for(let e=0;e{for(let e=0;e{0===e.marker&&(r.x=Math.max(Math.min(e.valX,s.x),0),r.y=Math.max(Math.min(e.valY,1),0)),1===e.marker&&(s.x=Math.max(Math.min(e.valX,i),r.x),s.y=Math.max(Math.min(e.valY,1),0)),2===e.marker&&(i=Math.max(Math.min(e.valX,n),s.x)),u()})),d.addEventListener("markermoveend",(()=>{c(),u()})),document.getElementById("bypass").onchange=function(e){t.proc.bypass=e.target.checked},u()})); \ No newline at end of file diff --git a/preview/813/images/ant_logo.png b/preview/813/images/ant_logo.png new file mode 100644 index 00000000..9a47347b Binary files /dev/null and b/preview/813/images/ant_logo.png differ diff --git a/preview/813/images/delays/chorus1.png b/preview/813/images/delays/chorus1.png new file mode 100644 index 00000000..fba2315c Binary files /dev/null and b/preview/813/images/delays/chorus1.png differ diff --git a/preview/813/images/delays/flanger1.png b/preview/813/images/delays/flanger1.png new file mode 100644 index 00000000..912a7a3c Binary files /dev/null and b/preview/813/images/delays/flanger1.png differ diff --git a/preview/813/images/delays/tremolo1.png b/preview/813/images/delays/tremolo1.png new file mode 100644 index 00000000..8661206a Binary files /dev/null and b/preview/813/images/delays/tremolo1.png differ diff --git a/preview/813/images/delays/vibrato1.png b/preview/813/images/delays/vibrato1.png new file mode 100644 index 00000000..f5ef696b Binary files /dev/null and b/preview/813/images/delays/vibrato1.png differ diff --git a/preview/813/images/distortion.png b/preview/813/images/distortion.png new file mode 100644 index 00000000..11856d6d Binary files /dev/null and b/preview/813/images/distortion.png differ diff --git a/preview/813/images/drc/diag1.png b/preview/813/images/drc/diag1.png new file mode 100644 index 00000000..c6cae346 Binary files /dev/null and b/preview/813/images/drc/diag1.png differ diff --git a/preview/813/images/drc/diag2.png b/preview/813/images/drc/diag2.png new file mode 100644 index 00000000..5d87f133 Binary files /dev/null and b/preview/813/images/drc/diag2.png differ diff --git a/preview/813/images/eq.png b/preview/813/images/eq.png new file mode 100644 index 00000000..de603d93 Binary files /dev/null and b/preview/813/images/eq.png differ diff --git a/preview/813/images/fastconv.png b/preview/813/images/fastconv.png new file mode 100644 index 00000000..82e4c233 Binary files /dev/null and b/preview/813/images/fastconv.png differ diff --git a/preview/813/images/home.png b/preview/813/images/home.png new file mode 100644 index 00000000..b4b53ebb Binary files /dev/null and b/preview/813/images/home.png differ diff --git a/preview/813/images/masking.png b/preview/813/images/masking.png new file mode 100644 index 00000000..84b82003 Binary files /dev/null and b/preview/813/images/masking.png differ diff --git a/preview/813/images/ovs/ns5.png b/preview/813/images/ovs/ns5.png new file mode 100644 index 00000000..ce3502a6 Binary files /dev/null and b/preview/813/images/ovs/ns5.png differ diff --git a/preview/813/images/ovs/ns5b.png b/preview/813/images/ovs/ns5b.png new file mode 100644 index 00000000..90973df7 Binary files /dev/null and b/preview/813/images/ovs/ns5b.png differ diff --git a/preview/813/images/ovs/ns5c.png b/preview/813/images/ovs/ns5c.png new file mode 100644 index 00000000..8ca387c1 Binary files /dev/null and b/preview/813/images/ovs/ns5c.png differ diff --git a/preview/813/images/ovs/ns5d.png b/preview/813/images/ovs/ns5d.png new file mode 100644 index 00000000..0dccbccc Binary files /dev/null and b/preview/813/images/ovs/ns5d.png differ diff --git a/preview/813/images/qds/ns5.png b/preview/813/images/qds/ns5.png new file mode 100644 index 00000000..6844b7be Binary files /dev/null and b/preview/813/images/qds/ns5.png differ diff --git a/preview/813/images/qds/ns5b.png b/preview/813/images/qds/ns5b.png new file mode 100644 index 00000000..5a1a6f25 Binary files /dev/null and b/preview/813/images/qds/ns5b.png differ diff --git a/preview/813/images/qds/ns5c.png b/preview/813/images/qds/ns5c.png new file mode 100644 index 00000000..61118b09 Binary files /dev/null and b/preview/813/images/qds/ns5c.png differ diff --git a/preview/813/images/qds/ns5d.png b/preview/813/images/qds/ns5d.png new file mode 100644 index 00000000..a227b2e7 Binary files /dev/null and b/preview/813/images/qds/ns5d.png differ diff --git a/preview/813/index.html b/preview/813/index.html new file mode 100644 index 00000000..50bec9d8 --- /dev/null +++ b/preview/813/index.html @@ -0,0 +1,51 @@ + jsdafx – Digital Audio Effects in JavaScript

jsdafx – Digital Audio Effects in JavaScript

\ No newline at end of file diff --git a/preview/813/install-sw.js b/preview/813/install-sw.js new file mode 100644 index 00000000..f4c7fb02 --- /dev/null +++ b/preview/813/install-sw.js @@ -0,0 +1 @@ +"serviceWorker"in navigator&&window.addEventListener("load",(async()=>{try{await navigator.serviceWorker.register("sw.js",{type:"module"})}catch(e){console.warn("ServiceWorker registration failed: ",e)}}));export{}; \ No newline at end of file diff --git a/preview/813/masking.html b/preview/813/masking.html new file mode 100644 index 00000000..f97bc1ed --- /dev/null +++ b/preview/813/masking.html @@ -0,0 +1 @@ + Audio Coding Psychoacoustics - Masking effect

Audio Coding Psychoacoustics - Masking effect

Predefined
Local files
Browse...

This script demonstrates psychoacoustic audio masking effects. It is designed for a first insight into the perceptual experience of masking a sinusoidal signal with band-limited noise.

\ No newline at end of file diff --git a/preview/813/masking.js b/preview/813/masking.js new file mode 100644 index 00000000..bc7d1728 --- /dev/null +++ b/preview/813/masking.js @@ -0,0 +1 @@ +import{SignalGraph as e,setupAudio as t,setupPlayerControls as n}from"./common.js";const a=[-38039e-9,133903e-10,115506e-10,101914e-10,915214e-11,839983e-11,780699e-11,736965e-11,6982e-9,666185e-11,631753e-11,598502e-11,558116e-11,515935e-11,463898e-11,409421e-11,343557e-11,277465e-11,19833e-10,121513e-11,4.07231e-7,-5.09591e-7,-132249e-11,-214109e-11,-295921e-11,-374283e-11,-444368e-11,-504289e-11,-554715e-11,-594715e-11,-624373e-11,-640934e-11,-644364e-11,-632703e-11,-607486e-11,-568387e-11,-517216e-11,-455573e-11,-382748e-11,-303319e-11,-216484e-11,-122558e-11,-2.89094e-7,6.77418e-7,162429e-11,254431e-11,338173e-11,415372e-11,481973e-11,538979e-11,581906e-11,61258e-10,628229e-11,631631e-11,620469e-11,597466e-11,560613e-11,514288e-11,455825e-11,392622e-11,320917e-11,247342e-11,171068e-11,9.65171e-7,2.26399e-7,-4.44764e-7,-106147e-11,-157985e-11,-201853e-11,-23325e-10,-254783e-11,-263356e-11,-262734e-11,-250027e-11,-229634e-11,-199142e-11,-164394e-11,-123962e-11,-8.3278e-7,-4.25592e-7,-5.91837e-8,2.59792e-7,4.79295e-7,6.08201e-7,6.00178e-7,4.63822e-7,1.64896e-7,-2.72688e-7,-8.77065e-7,-161798e-11,-250807e-11,-349917e-11,-459061e-11,-57266e-10,-689271e-11,-802588e-11,-909724e-11,-100437e-10,-108363e-10,-114032e-10,-117261e-10,-117327e-10,-11411e-9,-107102e-10,-96319e-10,-81375e-10,-62506e-10,-395754e-11,-130241e-11,170391e-11,498942e-11,851578e-11,121908e-10,159551e-10,196938e-10,233315e-10,267365e-10,298325e-10,324832e-10,346105e-10,360915e-10,368576e-10,368059e-10,358972e-10,340571e-10,3128e-8,275361e-10,228666e-10,172867e-10,108856e-10,372931e-11,-404254e-11,-123191e-10,-209139e-10,-296744e-10,-383809e-10,-468512e-10,-548516e-10,-62184e-9,-686119e-10,-739498e-10,-779792e-10,-805453e-10,-814732e-10,-806573e-10,-77983e-9,-734184e-10,-66927e-9,-585581e-10,-483644e-10,-36488e-9,-230746e-10,-835327e-11,744068e-11,239982e-10,410102e-10,581043e-10,749231e-10,910539e-10,10612e-8,119709e-9,131456e-9,14098e-8,147969e-9,152112e-9,153183e-9,150979e-9,145392e-9,136351e-9,123891e-9,108095e-9,891544e-10,673065e-10,429026e-10,163287e-10,-119213e-10,-413339e-10,-713046e-10,-101224e-9,-130421e-9,-158243e-9,-183998e-9,-207047e-9,-226744e-9,-24252e-8,-253834e-9,-260249e-9,-261384e-9,-256988e-9,-246888e-9,-231064e-9,-209579e-9,-182665e-9,-150641e-9,-113991e-9,-732844e-10,-292375e-10,17363e-9,656064e-10,114544e-9,163136e-9,210339e-9,255066e-9,296268e-9,332899e-9,364e-6,388658e-9,406099e-9,415637e-9,416764e-9,409101e-9,392473e-9,366861e-9,332472e-9,289679e-9,239078e-9,181428e-9,1177e-7,49002e-9,-233785e-10,-980559e-10,-173512e-9,-248186e-9,-320445e-9,-388675e-9,-451262e-9,-506679e-9,-55347e-8,-590338e-9,-616123e-9,-629888e-9,-630889e-9,-618662e-9,-592975e-9,-553906e-9,-501794e-9,-437293e-9,-36132e-8,-275096e-9,-180072e-9,-779681e-10,293155e-10,139674e-9,250896e-9,360643e-9,466564e-9,566278e-9,657486e-9,737963e-9,805671e-9,858741e-9,895589e-9,914889e-9,915677e-9,89732e-8,859599e-9,802671e-9,727134e-9,633969e-9,524591e-9,400774e-9,264684e-9,118783e-9,-34153e-9,-191141e-9,-348993e-9,-504434e-9,-654109e-9,-794713e-9,-923004e-9,-.00103593,-.00113065,-.00120463,-.0012557,-.00128212,-.00128259,-.00125635,-.00120315,-.00112334,-.0010178,-888012e-9,-735983e-9,-564272e-9,-375899e-9,-174348e-9,365483e-10,252627e-9,469526e-9,682718e-9,887654e-9,.00107981,.00125482,.00140855,.00153721,.00163743,.00170635,.00174168,.00174178,.00170571,.00163325,.00152496,.00138215,.00120689,.001002,770964e-9,517939e-9,247621e-9,-347859e-10,-323716e-9,-613299e-9,-897529e-9,-.00117033,-.00142576,-.00165803,-.00186174,-.00203194,-.00216425,-.00225499,-.00230124,-.00230096,-.00225303,-.00215728,-.00201456,-.0018267,-.00159655,-.00132787,-.00102535,-694473e-9,-341457e-9,268863e-10,403245e-9,779998e-9,.00114931,.00150336,.00183442,.0021351,.00239847,.00261822,.0027888,.00290557,.00296491,.00296432,.00290248,.00277933,.00259608,.00235523,.00206052,.0017169,.00133044,908245e-9,458296e-9,-106549e-10,-489303e-9,-967918e-9,-.00143659,-.0018854,-.00230463,-.00268499,-.00301781,-.0032952,-.00351031,-.0036574,-.00373207,-.00373131,-.00365363,-.00349909,-.00326939,-.00296778,-.0025991,-.00216966,-.00168716,-.00116056,-599896e-9,-161087e-10,579163e-9,.00117384,.0017556,.00231219,.00283162,.00330246,.00371408,.00405688,.00432251,.00450406,.00459624,.00459555,.0045003,.00431078,.0040292,.00365975,.00320849,.00268331,.00209374,.00145084,766942e-9,554662e-10,-669391e-9,-.00139289,-.00210009,-.0027761,-.00340648,-.00397744,-.00447621,-.00489131,-.00521279,-.00543249,-.00554421,-.00554389,-.00542972,-.00520222,-.00486427,-.00442106,-.00388008,-.00325091,-.00254515,-.00177614,-95875e-8,-109059e-9,755911e-9,.00161859,.00246115,.00326597,.00401587,.00469461,.00528714,.00578,.00616157,.00642237,.00655526,.00655568,.00642169,.00615415,.00575664,.00523553,.00459978,.00386089,.00303261,.00213076,.00117287,177882e-9,-834247e-9,-.00184292,-.00282737,-.003767,-.00464192,-.00543328,-.00612372,-.00669773,-.007142,-.00744573,-.0076009,-.00760241,-.00744832,-.00713982,-.00668135,-.00608046,-.00534776,-.00449667,-.00354326,-.00250588,-.00140483,-261959e-9,899738e-9,.00205664,.00318491,.00426108,.00526242,.00616755,.00695677,.00761259,.00812006,.00846711,.00864485,.00864779,.00847396,.00812505,.00760632,.00692664,.00609824,.00513658,.00406,.00288942,.00164787,360119e-9,-947891e-9,-.00224953,-.00351804,-.00472707,-.00585128,-.00686676,-.00775167,-.00848663,-.00905516,-.00944405,-.00964368,-.00964821,-.00945579,-.0090686,-.00849284,-.00773863,-.0068199,-.00575402,-.0045616,-.00326599,-.00189287,-469726e-9,974688e-9,.00241096,.00380959,.00514164,.00637929,.00749644,.00846928,.00927679,.00990116,.0103282,.0105478,.0105539,.0103448,.00992326,.0092964,.00847564,.00747643,.00631803,.00502306,.00361715,.00212832,586546e-9,-976978e-9,-.00253038,-.0040418,-.00548004,-.00681525,-.00801946,-.00906729,-.00993637,-.0106079,-.0110671,-.0113033,-.0113105,-.0110874,-.0106372,-.00996814,-.00909266,-.00802769,-.00679408,-.00541627,-.00392175,-.00234055,-704632e-9,952792e-9,.00259792,.00419705,.0057173,.00712725,.00839764,.00950194,.0104169,.0111233,.0116057,.0118536,.0118611,.0116273,.0111562,.0104566,.00954223,.00843111,.00714542,.00571095,.00415667,.00251402,816385e-9,-901671e-9,-.00260507,-.00425896,-.00582945,-.00728427,-.00859348,-.00973008,-.0106706,-.0113954,-.0118895,-.0121425,-.0121489,-.0119084,-.0114255,-.01071,-.00977639,-.00864352,-.00733447,-.00587594,-.00429767,-.00263191,-912679e-9,824869e-9,.00254523,.00421325,.00579487,.00725781,.00857224,.00971142,.0106522,.0113756,.011867,.0121168,.01212,.011877,.0113933,.010679,.00974916,.0086233,.00732479,.00588058,.00432051,.00267677,983182e-9,-725505e-9,-.00241431,-.00404878,-.00559567,-.00702365,-.00830393,-.00941086,-.0103225,-.0110209,-.0114927,-.0117291,-.0117264,-.0114857,-.0110129,-.010319,-.00941905,-.00833266,-.00708297,-.00569645,-.00420221,-.00263145,-.00101676,608545e-9,.00221115,.00375838,.00521895,.00656351,.00776536,.00880089,.0096501,.010297,.0107298,.0109415,.0109293,.0106954,.0102465,.00959352,.00875172,.00774004,.00658077,.00529908,.00392244,.00248002,.00100208,-480695e-9,-.0019378,-.0033396,-.00465791,-.00586658,-.00694202,-.00786368,-.00861445,-.00918095,-.00955382,-.00972783,-.00970196,-.00947938,-.00906729,-.00847681,-.00772257,-.00682247,-.00579718,-.00466973,-.00346491,-.00220882,-928188e-9,350112e-9,.0015997,.00279519,.00391279,.00493068,.00582958,.00659298,.00720757,.0076634,.00795405,.00807673,.00803227,.007825,.00746265,.00695609,.00631902,.00556767,.00472034,.00379698,.00281876,.00180753,785341e-9,-226028e-9,-.00120555,-.00213341,-.00299139,-.00376326,-.00443509,-.0049955,-.00543583,-.00575033,-.00593614,-.00599335,-.00592487,-.00573633,-.00543584,-.00503379,-.00454249,-.00397588,-.00334912,-.00267826,-.00197976,-.00127017,-565689e-9,11821e-8,767102e-9,.00136794,.00190931,.0023817,.00277761,.00309171,.00332089,.00346427,.00352313,.00350081,.00340258,.00323537,.00300761,.00272889,.0024097,.0020611,.00169441,.00132086,951322e-9,595974e-9,264057e-9,-363732e-10,-298637e-9,-517598e-9,-689757e-9,-813324e-9,-888219e-9,-916039e-9,-899959e-9,-844605e-9,-75587e-8,-640708e-9,-50688e-8,-362702e-9,-216744e-9,-775601e-10,466212e-10,148158e-9,220276e-9,257287e-9,254818e-9,209959e-9,121402e-9,-104877e-10,-183637e-9,-394296e-9,-637104e-9,-905223e-9,-.0011905,-.00148369,-.0017747,-.0020529,-.00230738,-.00252735,-.00270238,-.00282284,-.00288011,-.00286697,-.00277782,-.00260893,-.00235863,-.00202748,-.00161829,-.00113621,-588658e-9,147506e-10,662394e-9,.00134084,.00203512,.00272908,.0034057,.00404754,.00463714,.00515747,.00559239,.00592707,.0061484,.00624544,.0062097,.00603553,.00572027,.00526452,.00467219,.00395056,.00311021,.00216493,.00113145,291999e-10,-.00112005,-.00229266,-.00346354,-.00460676,-.00569605,-.00670543,-.00760981,-.00838559,-.00901123,-.00946784,-.00973967,-.00981454,-.00968428,-.00934496,-.00879716,-.00804609,-.00710155,-.00597789,-.00469382,-.00327209,-.00173911,-124446e-9,.00153971,.00321923,.00487869,.0064822,.00799409,.00937976,.0106064,.0116439,.0124654,.0130479,.0133732,.013428,.0132046,.0127009,.011921,.0108748,.00957825,.00805282,.00632549,.00442807,.0023967,271121e-9,-.00190606,-.00409027,-.00623584,-.00829703,-.0102289,-.0119884,-.0135353,-.014833,-.0158496,-.0165583,-.0169384,-.0169759,-.0166636,-.0160014,-.014997,-.013665,-.0120273,-.0101127,-.00795622,-.00559855,-.00308533,-466182e-9,.0022062,.00487716,.0074912,.00999313,.0123292,.0144484,.0163033,.0178515,.0190561,.0198871,.0203217,.0203451,.0199508,.019141,.0179266,.0163271,.0143701,.0120914,.00953357,.00674585,.0037828,703357e-9,-.00243037,-.00555434,-.00860392,-.0115152,-.0142264,-.0166792,-.0188197,-.0206002,-.0219796,-.0229248,-.0234114,-.023424,-.0229572,-.0220152,-.0206121,-.018772,-.0165279,-.0139219,-.0110038,-.00783038,-.00446446,-973323e-9,.00257245,.00610045,.00953795,.0128134,.0158578,.0186066,.0210003,.0229867,.0245213,.0255684,.0261023,.0261076,.0255797,.0245249,.0229605,.0209145,.0184249,.0155394,.012314,.00881242,.00510425,.00126407,-.00263031,-.00649942,-.0102637,-.0138452,-.0171692,-.0201659,-.0227714,-.0249298,-.026594,-.0277266,-.028301,-.028302,-.027726,-.0265813,-.0248879,-.0226775,-.0199922,-.0168843,-.0134152,-.00965393,-.00567592,-.00156148,.00260587,.0067411,.0107594,.014578,.0181178,.021305,.0240728,.0263628,.0281259,.0293239,.0299299,.0299291,.029319,.0281097,.0263238,.0239955,.0211706,.0179049,.0142638,.0103204,.00615433,.00185004,-.00250493,-.00682174,-.0110121,-.0149899,-.0186735,-.0219868,-.0248611,-.0272367,-.0290639,-.0303042,-.0309309,-.03093,-.0303003,-.0290535,-.0272138,-.0248179,-.0219138,-.01856,-.0148244,-.0107826,-.00651673,-.00211371,.0023368,.006744,.0110179,.0150712,.0188211,.0221908,.0251113,.0275229,.0293762,.0306332,.0312682,.0312682,.0306332,.0293762,.0275229,.0251113,.0221908,.0188211,.0150712,.0110179,.006744,.0023368,-.00211371,-.00651673,-.0107826,-.0148244,-.01856,-.0219138,-.0248179,-.0272138,-.0290535,-.0303003,-.03093,-.0309309,-.0303042,-.0290639,-.0272367,-.0248611,-.0219868,-.0186735,-.0149899,-.0110121,-.00682174,-.00250493,.00185004,.00615433,.0103204,.0142638,.0179049,.0211706,.0239955,.0263238,.0281097,.029319,.0299291,.0299299,.0293239,.0281259,.0263628,.0240728,.021305,.0181178,.014578,.0107594,.0067411,.00260587,-.00156148,-.00567592,-.00965393,-.0134152,-.0168843,-.0199922,-.0226775,-.0248879,-.0265813,-.027726,-.028302,-.028301,-.0277266,-.026594,-.0249298,-.0227714,-.0201659,-.0171692,-.0138452,-.0102637,-.00649942,-.00263031,.00126407,.00510425,.00881242,.012314,.0155394,.0184249,.0209145,.0229605,.0245249,.0255797,.0261076,.0261023,.0255684,.0245213,.0229867,.0210003,.0186066,.0158578,.0128134,.00953795,.00610045,.00257245,-973323e-9,-.00446446,-.00783038,-.0110038,-.0139219,-.0165279,-.018772,-.0206121,-.0220152,-.0229572,-.023424,-.0234114,-.0229248,-.0219796,-.0206002,-.0188197,-.0166792,-.0142264,-.0115152,-.00860392,-.00555434,-.00243037,703357e-9,.0037828,.00674585,.00953357,.0120914,.0143701,.0163271,.0179266,.019141,.0199508,.0203451,.0203217,.0198871,.0190561,.0178515,.0163033,.0144484,.0123292,.00999313,.0074912,.00487716,.0022062,-466182e-9,-.00308533,-.00559855,-.00795622,-.0101127,-.0120273,-.013665,-.014997,-.0160014,-.0166636,-.0169759,-.0169384,-.0165583,-.0158496,-.014833,-.0135353,-.0119884,-.0102289,-.00829703,-.00623584,-.00409027,-.00190606,271121e-9,.0023967,.00442807,.00632549,.00805282,.00957825,.0108748,.011921,.0127009,.0132046,.013428,.0133732,.0130479,.0124654,.0116439,.0106064,.00937976,.00799409,.0064822,.00487869,.00321923,.00153971,-124446e-9,-.00173911,-.00327209,-.00469382,-.00597789,-.00710155,-.00804609,-.00879716,-.00934496,-.00968428,-.00981454,-.00973967,-.00946784,-.00901123,-.00838559,-.00760981,-.00670543,-.00569605,-.00460676,-.00346354,-.00229266,-.00112005,291999e-10,.00113145,.00216493,.00311021,.00395056,.00467219,.00526452,.00572027,.00603553,.0062097,.00624544,.0061484,.00592707,.00559239,.00515747,.00463714,.00404754,.0034057,.00272908,.00203512,.00134084,662394e-9,147506e-10,-588658e-9,-.00113621,-.00161829,-.00202748,-.00235863,-.00260893,-.00277782,-.00286697,-.00288011,-.00282284,-.00270238,-.00252735,-.00230738,-.0020529,-.0017747,-.00148369,-.0011905,-905223e-9,-637104e-9,-394296e-9,-183637e-9,-104877e-10,121402e-9,209959e-9,254818e-9,257287e-9,220276e-9,148158e-9,466212e-10,-775601e-10,-216744e-9,-362702e-9,-50688e-8,-640708e-9,-75587e-8,-844605e-9,-899959e-9,-916039e-9,-888219e-9,-813324e-9,-689757e-9,-517598e-9,-298637e-9,-363732e-10,264057e-9,595974e-9,951322e-9,.00132086,.00169441,.0020611,.0024097,.00272889,.00300761,.00323537,.00340258,.00350081,.00352313,.00346427,.00332089,.00309171,.00277761,.0023817,.00190931,.00136794,767102e-9,11821e-8,-565689e-9,-.00127017,-.00197976,-.00267826,-.00334912,-.00397588,-.00454249,-.00503379,-.00543584,-.00573633,-.00592487,-.00599335,-.00593614,-.00575033,-.00543583,-.0049955,-.00443509,-.00376326,-.00299139,-.00213341,-.00120555,-226028e-9,785341e-9,.00180753,.00281876,.00379698,.00472034,.00556767,.00631902,.00695609,.00746265,.007825,.00803227,.00807673,.00795405,.0076634,.00720757,.00659298,.00582958,.00493068,.00391279,.00279519,.0015997,350112e-9,-928188e-9,-.00220882,-.00346491,-.00466973,-.00579718,-.00682247,-.00772257,-.00847681,-.00906729,-.00947938,-.00970196,-.00972783,-.00955382,-.00918095,-.00861445,-.00786368,-.00694202,-.00586658,-.00465791,-.0033396,-.0019378,-480695e-9,.00100208,.00248002,.00392244,.00529908,.00658077,.00774004,.00875172,.00959352,.0102465,.0106954,.0109293,.0109415,.0107298,.010297,.0096501,.00880089,.00776536,.00656351,.00521895,.00375838,.00221115,608545e-9,-.00101676,-.00263145,-.00420221,-.00569645,-.00708297,-.00833266,-.00941905,-.010319,-.0110129,-.0114857,-.0117264,-.0117291,-.0114927,-.0110209,-.0103225,-.00941086,-.00830393,-.00702365,-.00559567,-.00404878,-.00241431,-725505e-9,983182e-9,.00267677,.00432051,.00588058,.00732479,.0086233,.00974916,.010679,.0113933,.011877,.01212,.0121168,.011867,.0113756,.0106522,.00971142,.00857224,.00725781,.00579487,.00421325,.00254523,824869e-9,-912679e-9,-.00263191,-.00429767,-.00587594,-.00733447,-.00864352,-.00977639,-.01071,-.0114255,-.0119084,-.0121489,-.0121425,-.0118895,-.0113954,-.0106706,-.00973008,-.00859348,-.00728427,-.00582945,-.00425896,-.00260507,-901671e-9,816385e-9,.00251402,.00415667,.00571095,.00714542,.00843111,.00954223,.0104566,.0111562,.0116273,.0118611,.0118536,.0116057,.0111233,.0104169,.00950194,.00839764,.00712725,.0057173,.00419705,.00259792,952792e-9,-704632e-9,-.00234055,-.00392175,-.00541627,-.00679408,-.00802769,-.00909266,-.00996814,-.0106372,-.0110874,-.0113105,-.0113033,-.0110671,-.0106079,-.00993637,-.00906729,-.00801946,-.00681525,-.00548004,-.0040418,-.00253038,-976978e-9,586546e-9,.00212832,.00361715,.00502306,.00631803,.00747643,.00847564,.0092964,.00992326,.0103448,.0105539,.0105478,.0103282,.00990116,.00927679,.00846928,.00749644,.00637929,.00514164,.00380959,.00241096,974688e-9,-469726e-9,-.00189287,-.00326599,-.0045616,-.00575402,-.0068199,-.00773863,-.00849284,-.0090686,-.00945579,-.00964821,-.00964368,-.00944405,-.00905516,-.00848663,-.00775167,-.00686676,-.00585128,-.00472707,-.00351804,-.00224953,-947891e-9,360119e-9,.00164787,.00288942,.00406,.00513658,.00609824,.00692664,.00760632,.00812505,.00847396,.00864779,.00864485,.00846711,.00812006,.00761259,.00695677,.00616755,.00526242,.00426108,.00318491,.00205664,899738e-9,-261959e-9,-.00140483,-.00250588,-.00354326,-.00449667,-.00534776,-.00608046,-.00668135,-.00713982,-.00744832,-.00760241,-.0076009,-.00744573,-.007142,-.00669773,-.00612372,-.00543328,-.00464192,-.003767,-.00282737,-.00184292,-834247e-9,177882e-9,.00117287,.00213076,.00303261,.00386089,.00459978,.00523553,.00575664,.00615415,.00642169,.00655568,.00655526,.00642237,.00616157,.00578,.00528714,.00469461,.00401587,.00326597,.00246115,.00161859,755911e-9,-109059e-9,-95875e-8,-.00177614,-.00254515,-.00325091,-.00388008,-.00442106,-.00486427,-.00520222,-.00542972,-.00554389,-.00554421,-.00543249,-.00521279,-.00489131,-.00447621,-.00397744,-.00340648,-.0027761,-.00210009,-.00139289,-669391e-9,554662e-10,766942e-9,.00145084,.00209374,.00268331,.00320849,.00365975,.0040292,.00431078,.0045003,.00459555,.00459624,.00450406,.00432251,.00405688,.00371408,.00330246,.00283162,.00231219,.0017556,.00117384,579163e-9,-161087e-10,-599896e-9,-.00116056,-.00168716,-.00216966,-.0025991,-.00296778,-.00326939,-.00349909,-.00365363,-.00373131,-.00373207,-.0036574,-.00351031,-.0032952,-.00301781,-.00268499,-.00230463,-.0018854,-.00143659,-967918e-9,-489303e-9,-106549e-10,458296e-9,908245e-9,.00133044,.0017169,.00206052,.00235523,.00259608,.00277933,.00290248,.00296432,.00296491,.00290557,.0027888,.00261822,.00239847,.0021351,.00183442,.00150336,.00114931,779998e-9,403245e-9,268863e-10,-341457e-9,-694473e-9,-.00102535,-.00132787,-.00159655,-.0018267,-.00201456,-.00215728,-.00225303,-.00230096,-.00230124,-.00225499,-.00216425,-.00203194,-.00186174,-.00165803,-.00142576,-.00117033,-897529e-9,-613299e-9,-323716e-9,-347859e-10,247621e-9,517939e-9,770964e-9,.001002,.00120689,.00138215,.00152496,.00163325,.00170571,.00174178,.00174168,.00170635,.00163743,.00153721,.00140855,.00125482,.00107981,887654e-9,682718e-9,469526e-9,252627e-9,365483e-10,-174348e-9,-375899e-9,-564272e-9,-735983e-9,-888012e-9,-.0010178,-.00112334,-.00120315,-.00125635,-.00128259,-.00128212,-.0012557,-.00120463,-.00113065,-.00103593,-923004e-9,-794713e-9,-654109e-9,-504434e-9,-348993e-9,-191141e-9,-34153e-9,118783e-9,264684e-9,400774e-9,524591e-9,633969e-9,727134e-9,802671e-9,859599e-9,89732e-8,915677e-9,914889e-9,895589e-9,858741e-9,805671e-9,737963e-9,657486e-9,566278e-9,466564e-9,360643e-9,250896e-9,139674e-9,293155e-10,-779681e-10,-180072e-9,-275096e-9,-36132e-8,-437293e-9,-501794e-9,-553906e-9,-592975e-9,-618662e-9,-630889e-9,-629888e-9,-616123e-9,-590338e-9,-55347e-8,-506679e-9,-451262e-9,-388675e-9,-320445e-9,-248186e-9,-173512e-9,-980559e-10,-233785e-10,49002e-9,1177e-7,181428e-9,239078e-9,289679e-9,332472e-9,366861e-9,392473e-9,409101e-9,416764e-9,415637e-9,406099e-9,388658e-9,364e-6,332899e-9,296268e-9,255066e-9,210339e-9,163136e-9,114544e-9,656064e-10,17363e-9,-292375e-10,-732844e-10,-113991e-9,-150641e-9,-182665e-9,-209579e-9,-231064e-9,-246888e-9,-256988e-9,-261384e-9,-260249e-9,-253834e-9,-24252e-8,-226744e-9,-207047e-9,-183998e-9,-158243e-9,-130421e-9,-101224e-9,-713046e-10,-413339e-10,-119213e-10,163287e-10,429026e-10,673065e-10,891544e-10,108095e-9,123891e-9,136351e-9,145392e-9,150979e-9,153183e-9,152112e-9,147969e-9,14098e-8,131456e-9,119709e-9,10612e-8,910539e-10,749231e-10,581043e-10,410102e-10,239982e-10,744068e-11,-835327e-11,-230746e-10,-36488e-9,-483644e-10,-585581e-10,-66927e-9,-734184e-10,-77983e-9,-806573e-10,-814732e-10,-805453e-10,-779792e-10,-739498e-10,-686119e-10,-62184e-9,-548516e-10,-468512e-10,-383809e-10,-296744e-10,-209139e-10,-123191e-10,-404254e-11,372931e-11,108856e-10,172867e-10,228666e-10,275361e-10,3128e-8,340571e-10,358972e-10,368059e-10,368576e-10,360915e-10,346105e-10,324832e-10,298325e-10,267365e-10,233315e-10,196938e-10,159551e-10,121908e-10,851578e-11,498942e-11,170391e-11,-130241e-11,-395754e-11,-62506e-10,-81375e-10,-96319e-10,-107102e-10,-11411e-9,-117327e-10,-117261e-10,-114032e-10,-108363e-10,-100437e-10,-909724e-11,-802588e-11,-689271e-11,-57266e-10,-459061e-11,-349917e-11,-250807e-11,-161798e-11,-8.77065e-7,-2.72688e-7,1.64896e-7,4.63822e-7,6.00178e-7,6.08201e-7,4.79295e-7,2.59792e-7,-5.91837e-8,-4.25592e-7,-8.3278e-7,-123962e-11,-164394e-11,-199142e-11,-229634e-11,-250027e-11,-262734e-11,-263356e-11,-254783e-11,-23325e-10,-201853e-11,-157985e-11,-106147e-11,-4.44764e-7,2.26399e-7,9.65171e-7,171068e-11,247342e-11,320917e-11,392622e-11,455825e-11,514288e-11,560613e-11,597466e-11,620469e-11,631631e-11,628229e-11,61258e-10,581906e-11,538979e-11,481973e-11,415372e-11,338173e-11,254431e-11,162429e-11,6.77418e-7,-2.89094e-7,-122558e-11,-216484e-11,-303319e-11,-382748e-11,-455573e-11,-517216e-11,-568387e-11,-607486e-11,-632703e-11,-644364e-11,-640934e-11,-624373e-11,-594715e-11,-554715e-11,-504289e-11,-444368e-11,-374283e-11,-295921e-11,-214109e-11,-132249e-11,-5.09591e-7,4.07231e-7,121513e-11,19833e-10,277465e-11,343557e-11,409421e-11,463898e-11,515935e-11,558116e-11,598502e-11,631753e-11,666185e-11,6982e-9,736965e-11,780699e-11,839983e-11,915214e-11,101914e-10,115506e-10,133903e-10,-38039e-9],c=[137812e-9,-132492e-10,-129344e-10,-126581e-10,-126653e-10,-126772e-10,-129437e-10,-131811e-10,-136475e-10,-140497e-10,-146594e-10,-151664e-10,-158666e-10,-164166e-10,-171632e-10,-176733e-10,-18465e-9,-189821e-10,-193402e-10,-200022e-10,-204791e-10,-208155e-10,-210554e-10,-211532e-10,-212042e-10,-210971e-10,-209444e-10,-206024e-10,-202028e-10,-195855e-10,-189048e-10,-179838e-10,-170152e-10,-157554e-10,-145236e-10,-129938e-10,-113676e-10,-960308e-11,-776749e-11,-573549e-11,-36382e-10,-13684e-10,9.2401e-7,335803e-11,578631e-11,833597e-11,10857e-9,134741e-10,160327e-10,186537e-10,211663e-10,237401e-10,261137e-10,285168e-10,307419e-10,329064e-10,348427e-10,36697e-9,383039e-10,397938e-10,409949e-10,420374e-10,42759e-9,432934e-10,434873e-10,434688e-10,430966e-10,424864e-10,415007e-10,402938e-10,386688e-10,368245e-10,345967e-10,321413e-10,293041e-10,262564e-10,228584e-10,19277e-9,153725e-10,113111e-10,696285e-11,249885e-11,-219978e-11,-696714e-11,-119036e-10,-168632e-10,-219344e-10,-26946e-9,-32027e-9,-369807e-10,-419178e-10,-466589e-10,-513198e-10,-557171e-10,-599588e-10,-638636e-10,-675439e-10,-708235e-10,-73816e-9,-76345e-9,-785239e-10,-801866e-10,-814352e-10,-821338e-10,-823776e-10,-820231e-10,-811976e-10,-797531e-10,-778125e-10,-752399e-10,-721727e-10,-684826e-10,-643096e-10,-595314e-10,-542975e-10,-484951e-10,-422843e-10,-355551e-10,-284763e-10,-209483e-10,-131329e-10,-496114e-11,341078e-11,120533e-10,207912e-10,296916e-10,385838e-10,475304e-10,563528e-10,651076e-10,736175e-10,819397e-10,898974e-10,975467e-10,104708e-9,111446e-9,11758e-8,123178e-9,128075e-9,132327e-9,135783e-9,138512e-9,140364e-9,141414e-9,141529e-9,140793e-9,139083e-9,136487e-9,132898e-9,128416e-9,122948e-9,116606e-9,109305e-9,101178e-9,921448e-10,823534e-10,717447e-10,60466e-9,484747e-10,359329e-10,228079e-10,926784e-11,-470631e-11,-18936e-9,-334316e-10,-480119e-10,-626792e-10,-772487e-10,-917127e-10,-105886e-9,-119762e-9,-133148e-9,-146047e-9,-158264e-9,-1698e-7,-180473e-9,-190287e-9,-199067e-9,-206823e-9,-213393e-9,-218798e-9,-222886e-9,-225689e-9,-227074e-9,-227086e-9,-225613e-9,-22271e-8,-218286e-9,-212413e-9,-205017e-9,-196196e-9,-185893e-9,-174221e-9,-161146e-9,-146803e-9,-131175e-9,-114414e-9,-965252e-10,-776773e-10,-578917e-10,-373531e-10,-160996e-10,567034e-11,279018e-10,503919e-10,730707e-10,957286e-10,118292e-9,140539e-9,162394e-9,18364e-8,204197e-9,223849e-9,242523e-9,260009e-9,276242e-9,291021e-9,304293e-9,315872e-9,325722e-9,333673e-9,339705e-9,343676e-9,345582e-9,345308e-9,342878e-9,338196e-9,331314e-9,322169e-9,310838e-9,297287e-9,281621e-9,263838e-9,244071e-9,222346e-9,198825e-9,17356e-8,146745e-9,118454e-9,889023e-10,581933e-10,265599e-10,-587333e-11,-38854e-9,-722444e-10,-105781e-9,-139311e-9,-172562e-9,-205377e-9,-237481e-9,-268714e-9,-298804e-9,-327595e-9,-354825e-9,-38035e-8,-403915e-9,-425397e-9,-444561e-9,-461302e-9,-475412e-9,-486812e-9,-495322e-9,-500893e-9,-503382e-9,-502773e-9,-498959e-9,-491963e-9,-481716e-9,-468282e-9,-451634e-9,-431876e-9,-409024e-9,-383223e-9,-354529e-9,-323131e-9,-289124e-9,-252732e-9,-214092e-9,-173463e-9,-131012e-9,-870333e-10,-417232e-10,459833e-11,517116e-10,992764e-10,147054e-9,194693e-9,241941e-9,288441e-9,333939e-9,378076e-9,420606e-9,461178e-9,499557e-9,535411e-9,568525e-9,59859e-8,625421e-9,648741e-9,668398e-9,684155e-9,695902e-9,703446e-9,706727e-9,705598e-9,70005e-8,689996e-9,675476e-9,656459e-9,633047e-9,605263e-9,573267e-9,53714e-8,497099e-9,453279e-9,405952e-9,355309e-9,301669e-9,245269e-9,186477e-9,125572e-9,629601e-10,-10463e-10,-660105e-10,-131591e-9,-197332e-9,-262874e-9,-327749e-9,-39159e-8,-453926e-9,-514396e-9,-572536e-9,-628e-6,-680343e-9,-729244e-9,-774287e-9,-815188e-9,-85157e-8,-883195e-9,-909735e-9,-931004e-9,-946736e-9,-956804e-9,-961007e-9,-959287e-9,-951514e-9,-937703e-9,-917797e-9,-891888e-9,-859996e-9,-822292e-9,-778874e-9,-729985e-9,-675801e-9,-616641e-9,-552751e-9,-48452e-8,-412259e-9,-336421e-9,-257376e-9,-175632e-9,-91607e-9,-585399e-11,811694e-10,168878e-9,256786e-9,34429e-8,43089e-8,515973e-9,599039e-9,679485e-9,756825e-9,830474e-9,899977e-9,964783e-9,.00102448,.00107856,.00112668,.00116838,.00120339,.00123133,.00125198,.00126507,.00127048,.00126799,.00125759,.00123917,.00121281,.0011785,.00113642,.00108666,.0010295,96514e-8,893945e-9,816218e-9,732416e-9,642929e-9,548302e-9,449005e-9,345655e-9,238792e-9,129096e-9,171632e-10,-962781e-10,-210593e-9,-325021e-9,-438902e-9,-551461e-9,-662031e-9,-76984e-8,-874234e-9,-97446e-8,-.0010699,-.00115983,-.00124368,-.0013208,-.00139067,-.00145271,-.0015065,-.00155153,-.00158748,-.00161396,-.00163074,-.00163753,-.00163424,-.00162071,-.00159694,-.00156292,-.00151879,-.00146464,-.00140076,-.00132736,-.00124485,-.00115359,-.00105409,-946824e-9,-832425e-9,-711473e-9,-584699e-9,-452774e-9,-316515e-9,-176672e-9,-341281e-10,110308e-9,255705e-9,401216e-9,545882e-9,688842e-9,82913e-8,96589e-8,.00109818,.00122517,.00134596,.00145976,.00156576,.00166323,.00175144,.00182977,.00189757,.00195436,.0019996,.00203294,.00205399,.00206252,.0020583,.00204127,.00201134,.0019686,.00191313,.0018452,.00176503,.00167305,.00156966,.00145541,.00133088,.00119675,.00105373,90266e-8,744347e-9,579747e-9,409778e-9,235486e-9,578681e-10,-121957e-9,-302937e-9,-48391e-8,-663791e-9,-841404e-9,-.00101566,-.0011854,-.00134955,-.001507,-.00165673,-.0017977,-.00192897,-.00204958,-.00215872,-.00225555,-.00233937,-.00240951,-.00246541,-.00250656,-.00253258,-.00254312,-.002538,-.00251706,-.0024803,-.00242777,-.00235968,-.00227625,-.00217789,-.00206503,-.00193827,-.00179822,-.00164567,-.00148141,-.00130638,-.00112154,-927967e-9,-726757e-9,-519124e-9,-306264e-9,-894873e-10,12993e-8,350609e-9,571226e-9,790369e-9,.0010067,.0012188,.00142536,.00162499,.00181643,.00199837,.00216963,.00232901,.00247544,.00260785,.00272533,.00282698,.00291205,.00297982,.00302976,.00306136,.00307428,.00306825,.00304316,.00299896,.0029358,.00285387,.00275353,.00263522,.00249955,.00234717,.00217891,.00199566,.00179845,.00158835,.00136659,.00113441,89321e-8,644366e-9,389394e-9,129797e-9,-132822e-9,-396884e-9,-660733e-9,-922754e-9,-.00118127,-.00143469,-.00168134,-.00191968,-.00214812,-.00236519,-.00256942,-.00275945,-.00293397,-.00309178,-.00323174,-.00335285,-.00345419,-.00353499,-.00359456,-.00363236,-.00364797,-.00364114,-.0036117,-.00355967,-.00348518,-.00338852,-.00327011,-.00313051,-.00297041,-.00279067,-.00259221,-.00237615,-.00214367,-.00189611,-.00163486,-.00136146,-.00107748,-784647e-9,-48467e-8,-179386e-9,129376e-9,4397e-7,749697e-9,.00105741,.00136095,.00165836,.00194778,.00222733,.00249522,.00274967,.00298904,.00321169,.00341615,.00360099,.00376493,.00390679,.00402554,.00412026,.00419019,.00423471,.00425338,.00424587,.00421205,.00415193,.00406572,.00395373,.0038165,.00365468,.00346912,.00326078,.00303081,.00278047,.00251119,.00222448,.00192202,.00160556,.00127698,93822e-8,591326e-9,238374e-9,-118467e-9,-477033e-9,-835089e-9,-.00119043,-.00154082,-.00188407,-.00221798,-.00254044,-.00284935,-.00314273,-.00341864,-.00367526,-.00391085,-.00412385,-.00431276,-.00447627,-.00461317,-.00472248,-.0048033,-.00485498,-.00487699,-.00486902,-.0048309,-.00476269,-.00466462,-.00453712,-.00438076,-.00419636,-.00398487,-.00374744,-.00348536,-.00320012,-.00289333,-.00256677,-.00222232,-.00186204,-.00148802,-.00110254,-707879e-9,-306454e-9,99311e-9,506907e-9,913841e-9,.00131757,.00171558,.00210537,.00248449,.00285051,.00320109,.00353397,.00384699,.00413807,.00440532,.00464691,.00486121,.00504673,.00520217,.00532637,.00541841,.00547751,.00550314,.00549493,.00545277,.00537669,.00526701,.00512419,.00494896,.0047422,.00450503,.00423874,.00394483,.00362496,.00328099,.00291488,.00252882,.00212505,.00170602,.0012742,832222e-9,382751e-9,-714506e-10,-527619e-9,-982919e-9,-.00143455,-.00187967,-.00231552,-.00273933,-.00314844,-.00354021,-.00391216,-.00426186,-.00458705,-.00488558,-.00515548,-.00539493,-.0056023,-.00577613,-.0059152,-.00601846,-.00608511,-.00611454,-.00610641,-.00606055,-.0059771,-.00585637,-.00569894,-.00550559,-.00527736,-.00501549,-.00472144,-.00439688,-.00404367,-.00366386,-.00325969,-.00283351,-.0023879,-.00192549,-.0014491,-961565e-9,-465891e-9,349211e-10,537774e-9,.00103959,.00153724,.00202764,.00250771,.00297447,.00342493,.00385626,.0042657,.00465064,.00500856,.00533716,.00563425,.0058979,.0061263,.00631791,.00647138,.0065856,.00665969,.00669305,.00668528,.00663628,.00654615,.00641531,.00624438,.00603428,.00578612,.0055013,.00518142,.00482833,.00444407,.0040309,.00359125,.00312776,.00264316,.0021404,.00162249,.00109259,553923e-9,979192e-11,-536475e-9,-.00108149,-.00162191,-.00215434,-.00267549,-.00318208,-.00367094,-.00413897,-.00458321,-.00500082,-.00538914,-.00574564,-.00606802,-.00635416,-.00660217,-.00681037,-.00697735,-.00710192,-.00718318,-.00722045,-.00721337,-.00716183,-.00706599,-.0069263,-.00674347,-.00651847,-.00625258,-.00594728,-.00560435,-.00522576,-.00481375,-.00437075,-.0038994,-.0034025,-.00288308,-.00234423,-.00178925,-.00122151,-644467e-9,-616612e-10,523318e-9,.00110688,.00168539,.00225529,.00281302,.00335509,.00387812,.00437882,.00485402,.00530073,.00571609,.00609746,.00644237,.0067486,.00701414,.00723725,.00741641,.0075504,.00763828,.00767936,.00767327,.00761992,.00751951,.00737253,.00717976,.00694228,.00666143,.00633883,.00597636,.00557617,.00514062,.00467232,.00417406,.00364886,.00309988,.00253046,.00194406,.00134426,734734e-9,119218e-9,-498506e-9,-.00111462,-.00172533,-.00232685,-.00291544,-.00348744,-.00403928,-.00456751,-.00506882,-.00554004,-.00597822,-.00638056,-.00674451,-.00706773,-.00734815,-.00758394,-.00777355,-.00791572,-.00800947,-.00805412,-.00804929,-.00799491,-.00789123,-.00773877,-.00753839,-.00729122,-.00699871,-.00666256,-.00628477,-.0058676,-.00541353,-.00492531,-.00440589,-.00385841,-.0032862,-.00269274,-.00208167,-.00145671,-821711e-9,-18056e-8,462793e-9,.00110438,.00174025,.00236646,.00297913,.00357446,.00414875,.00469843,.00522006,.00571038,.00616633,.00658503,.00696384,.00730037,.00759249,.00783832,.00803628,.00818508,.00828374,.00833158,.00832823,.00827364,.00816809,.00801216,.00780674,.00755303,.00725255,.00690708,.00651871,.00608977,.00562286,.00512081,.00458669,.00402375,.00343543,.00282533,.00219718,.00155485,902281e-9,243481e-9,-417489e-9,-.00107656,-.00172965,-.00237275,-.00300186,-.0036131,-.00420269,-.00476696,-.00530241,-.00580573,-.00627377,-.00670362,-.00709259,-.00743827,-.00773847,-.00799132,-.00819521,-.00834887,-.00845129,-.00850182,-.00850011,-.00844612,-.00834017,-.00818287,-.00797515,-.00771828,-.0074138,-.00706356,-.0066697,-.00623462,-.00576098,-.00525169,-.00470986,-.00413883,-.00354209,-.00292332,-.00228632,-.00163501,-973404e-9,-305573e-9,364368e-9,.00103229,.00169407,.00234564,.00298296,.00360211,.00419927,.00477076,.00531303,.00582275,.00629676,.00673214,.0071262,.0074765,.00778089,.00803747,.00824466,.00840119,.00850608,.00855869,.00855869,.00850608,.00840119,.00824466,.00803747,.00778089,.0074765,.0071262,.00673214,.00629676,.00582275,.00531303,.00477076,.00419927,.00360211,.00298296,.00234564,.00169407,.00103229,364368e-9,-305573e-9,-973404e-9,-.00163501,-.00228632,-.00292332,-.00354209,-.00413883,-.00470986,-.00525169,-.00576098,-.00623462,-.0066697,-.00706356,-.0074138,-.00771828,-.00797515,-.00818287,-.00834017,-.00844612,-.00850011,-.00850182,-.00845129,-.00834887,-.00819521,-.00799132,-.00773847,-.00743827,-.00709259,-.00670362,-.00627377,-.00580573,-.00530241,-.00476696,-.00420269,-.0036131,-.00300186,-.00237275,-.00172965,-.00107656,-417489e-9,243481e-9,902281e-9,.00155485,.00219718,.00282533,.00343543,.00402375,.00458669,.00512081,.00562286,.00608977,.00651871,.00690708,.00725255,.00755303,.00780674,.00801216,.00816809,.00827364,.00832823,.00833158,.00828374,.00818508,.00803628,.00783832,.00759249,.00730037,.00696384,.00658503,.00616633,.00571038,.00522006,.00469843,.00414875,.00357446,.00297913,.00236646,.00174025,.00110438,462793e-9,-18056e-8,-821711e-9,-.00145671,-.00208167,-.00269274,-.0032862,-.00385841,-.00440589,-.00492531,-.00541353,-.0058676,-.00628477,-.00666256,-.00699871,-.00729122,-.00753839,-.00773877,-.00789123,-.00799491,-.00804929,-.00805412,-.00800947,-.00791572,-.00777355,-.00758394,-.00734815,-.00706773,-.00674451,-.00638056,-.00597822,-.00554004,-.00506882,-.00456751,-.00403928,-.00348744,-.00291544,-.00232685,-.00172533,-.00111462,-498506e-9,119218e-9,734734e-9,.00134426,.00194406,.00253046,.00309988,.00364886,.00417406,.00467232,.00514062,.00557617,.00597636,.00633883,.00666143,.00694228,.00717976,.00737253,.00751951,.00761992,.00767327,.00767936,.00763828,.0075504,.00741641,.00723725,.00701414,.0067486,.00644237,.00609746,.00571609,.00530073,.00485402,.00437882,.00387812,.00335509,.00281302,.00225529,.00168539,.00110688,523318e-9,-616612e-10,-644467e-9,-.00122151,-.00178925,-.00234423,-.00288308,-.0034025,-.0038994,-.00437075,-.00481375,-.00522576,-.00560435,-.00594728,-.00625258,-.00651847,-.00674347,-.0069263,-.00706599,-.00716183,-.00721337,-.00722045,-.00718318,-.00710192,-.00697735,-.00681037,-.00660217,-.00635416,-.00606802,-.00574564,-.00538914,-.00500082,-.00458321,-.00413897,-.00367094,-.00318208,-.00267549,-.00215434,-.00162191,-.00108149,-536475e-9,979192e-11,553923e-9,.00109259,.00162249,.0021404,.00264316,.00312776,.00359125,.0040309,.00444407,.00482833,.00518142,.0055013,.00578612,.00603428,.00624438,.00641531,.00654615,.00663628,.00668528,.00669305,.00665969,.0065856,.00647138,.00631791,.0061263,.0058979,.00563425,.00533716,.00500856,.00465064,.0042657,.00385626,.00342493,.00297447,.00250771,.00202764,.00153724,.00103959,537774e-9,349211e-10,-465891e-9,-961565e-9,-.0014491,-.00192549,-.0023879,-.00283351,-.00325969,-.00366386,-.00404367,-.00439688,-.00472144,-.00501549,-.00527736,-.00550559,-.00569894,-.00585637,-.0059771,-.00606055,-.00610641,-.00611454,-.00608511,-.00601846,-.0059152,-.00577613,-.0056023,-.00539493,-.00515548,-.00488558,-.00458705,-.00426186,-.00391216,-.00354021,-.00314844,-.00273933,-.00231552,-.00187967,-.00143455,-982919e-9,-527619e-9,-714506e-10,382751e-9,832222e-9,.0012742,.00170602,.00212505,.00252882,.00291488,.00328099,.00362496,.00394483,.00423874,.00450503,.0047422,.00494896,.00512419,.00526701,.00537669,.00545277,.00549493,.00550314,.00547751,.00541841,.00532637,.00520217,.00504673,.00486121,.00464691,.00440532,.00413807,.00384699,.00353397,.00320109,.00285051,.00248449,.00210537,.00171558,.00131757,913841e-9,506907e-9,99311e-9,-306454e-9,-707879e-9,-.00110254,-.00148802,-.00186204,-.00222232,-.00256677,-.00289333,-.00320012,-.00348536,-.00374744,-.00398487,-.00419636,-.00438076,-.00453712,-.00466462,-.00476269,-.0048309,-.00486902,-.00487699,-.00485498,-.0048033,-.00472248,-.00461317,-.00447627,-.00431276,-.00412385,-.00391085,-.00367526,-.00341864,-.00314273,-.00284935,-.00254044,-.00221798,-.00188407,-.00154082,-.00119043,-835089e-9,-477033e-9,-118467e-9,238374e-9,591326e-9,93822e-8,.00127698,.00160556,.00192202,.00222448,.00251119,.00278047,.00303081,.00326078,.00346912,.00365468,.0038165,.00395373,.00406572,.00415193,.00421205,.00424587,.00425338,.00423471,.00419019,.00412026,.00402554,.00390679,.00376493,.00360099,.00341615,.00321169,.00298904,.00274967,.00249522,.00222733,.00194778,.00165836,.00136095,.00105741,749697e-9,4397e-7,129376e-9,-179386e-9,-48467e-8,-784647e-9,-.00107748,-.00136146,-.00163486,-.00189611,-.00214367,-.00237615,-.00259221,-.00279067,-.00297041,-.00313051,-.00327011,-.00338852,-.00348518,-.00355967,-.0036117,-.00364114,-.00364797,-.00363236,-.00359456,-.00353499,-.00345419,-.00335285,-.00323174,-.00309178,-.00293397,-.00275945,-.00256942,-.00236519,-.00214812,-.00191968,-.00168134,-.00143469,-.00118127,-922754e-9,-660733e-9,-396884e-9,-132822e-9,129797e-9,389394e-9,644366e-9,89321e-8,.00113441,.00136659,.00158835,.00179845,.00199566,.00217891,.00234717,.00249955,.00263522,.00275353,.00285387,.0029358,.00299896,.00304316,.00306825,.00307428,.00306136,.00302976,.00297982,.00291205,.00282698,.00272533,.00260785,.00247544,.00232901,.00216963,.00199837,.00181643,.00162499,.00142536,.0012188,.0010067,790369e-9,571226e-9,350609e-9,12993e-8,-894873e-10,-306264e-9,-519124e-9,-726757e-9,-927967e-9,-.00112154,-.00130638,-.00148141,-.00164567,-.00179822,-.00193827,-.00206503,-.00217789,-.00227625,-.00235968,-.00242777,-.0024803,-.00251706,-.002538,-.00254312,-.00253258,-.00250656,-.00246541,-.00240951,-.00233937,-.00225555,-.00215872,-.00204958,-.00192897,-.0017977,-.00165673,-.001507,-.00134955,-.0011854,-.00101566,-841404e-9,-663791e-9,-48391e-8,-302937e-9,-121957e-9,578681e-10,235486e-9,409778e-9,579747e-9,744347e-9,90266e-8,.00105373,.00119675,.00133088,.00145541,.00156966,.00167305,.00176503,.0018452,.00191313,.0019686,.00201134,.00204127,.0020583,.00206252,.00205399,.00203294,.0019996,.00195436,.00189757,.00182977,.00175144,.00166323,.00156576,.00145976,.00134596,.00122517,.00109818,96589e-8,82913e-8,688842e-9,545882e-9,401216e-9,255705e-9,110308e-9,-341281e-10,-176672e-9,-316515e-9,-452774e-9,-584699e-9,-711473e-9,-832425e-9,-946824e-9,-.00105409,-.00115359,-.00124485,-.00132736,-.00140076,-.00146464,-.00151879,-.00156292,-.00159694,-.00162071,-.00163424,-.00163753,-.00163074,-.00161396,-.00158748,-.00155153,-.0015065,-.00145271,-.00139067,-.0013208,-.00124368,-.00115983,-.0010699,-97446e-8,-874234e-9,-76984e-8,-662031e-9,-551461e-9,-438902e-9,-325021e-9,-210593e-9,-962781e-10,171632e-10,129096e-9,238792e-9,345655e-9,449005e-9,548302e-9,642929e-9,732416e-9,816218e-9,893945e-9,96514e-8,.0010295,.00108666,.00113642,.0011785,.00121281,.00123917,.00125759,.00126799,.00127048,.00126507,.00125198,.00123133,.00120339,.00116838,.00112668,.00107856,.00102448,964783e-9,899977e-9,830474e-9,756825e-9,679485e-9,599039e-9,515973e-9,43089e-8,34429e-8,256786e-9,168878e-9,811694e-10,-585399e-11,-91607e-9,-175632e-9,-257376e-9,-336421e-9,-412259e-9,-48452e-8,-552751e-9,-616641e-9,-675801e-9,-729985e-9,-778874e-9,-822292e-9,-859996e-9,-891888e-9,-917797e-9,-937703e-9,-951514e-9,-959287e-9,-961007e-9,-956804e-9,-946736e-9,-931004e-9,-909735e-9,-883195e-9,-85157e-8,-815188e-9,-774287e-9,-729244e-9,-680343e-9,-628e-6,-572536e-9,-514396e-9,-453926e-9,-39159e-8,-327749e-9,-262874e-9,-197332e-9,-131591e-9,-660105e-10,-10463e-10,629601e-10,125572e-9,186477e-9,245269e-9,301669e-9,355309e-9,405952e-9,453279e-9,497099e-9,53714e-8,573267e-9,605263e-9,633047e-9,656459e-9,675476e-9,689996e-9,70005e-8,705598e-9,706727e-9,703446e-9,695902e-9,684155e-9,668398e-9,648741e-9,625421e-9,59859e-8,568525e-9,535411e-9,499557e-9,461178e-9,420606e-9,378076e-9,333939e-9,288441e-9,241941e-9,194693e-9,147054e-9,992764e-10,517116e-10,459833e-11,-417232e-10,-870333e-10,-131012e-9,-173463e-9,-214092e-9,-252732e-9,-289124e-9,-323131e-9,-354529e-9,-383223e-9,-409024e-9,-431876e-9,-451634e-9,-468282e-9,-481716e-9,-491963e-9,-498959e-9,-502773e-9,-503382e-9,-500893e-9,-495322e-9,-486812e-9,-475412e-9,-461302e-9,-444561e-9,-425397e-9,-403915e-9,-38035e-8,-354825e-9,-327595e-9,-298804e-9,-268714e-9,-237481e-9,-205377e-9,-172562e-9,-139311e-9,-105781e-9,-722444e-10,-38854e-9,-587333e-11,265599e-10,581933e-10,889023e-10,118454e-9,146745e-9,17356e-8,198825e-9,222346e-9,244071e-9,263838e-9,281621e-9,297287e-9,310838e-9,322169e-9,331314e-9,338196e-9,342878e-9,345308e-9,345582e-9,343676e-9,339705e-9,333673e-9,325722e-9,315872e-9,304293e-9,291021e-9,276242e-9,260009e-9,242523e-9,223849e-9,204197e-9,18364e-8,162394e-9,140539e-9,118292e-9,957286e-10,730707e-10,503919e-10,279018e-10,567034e-11,-160996e-10,-373531e-10,-578917e-10,-776773e-10,-965252e-10,-114414e-9,-131175e-9,-146803e-9,-161146e-9,-174221e-9,-185893e-9,-196196e-9,-205017e-9,-212413e-9,-218286e-9,-22271e-8,-225613e-9,-227086e-9,-227074e-9,-225689e-9,-222886e-9,-218798e-9,-213393e-9,-206823e-9,-199067e-9,-190287e-9,-180473e-9,-1698e-7,-158264e-9,-146047e-9,-133148e-9,-119762e-9,-105886e-9,-917127e-10,-772487e-10,-626792e-10,-480119e-10,-334316e-10,-18936e-9,-470631e-11,926784e-11,228079e-10,359329e-10,484747e-10,60466e-9,717447e-10,823534e-10,921448e-10,101178e-9,109305e-9,116606e-9,122948e-9,128416e-9,132898e-9,136487e-9,139083e-9,140793e-9,141529e-9,141414e-9,140364e-9,138512e-9,135783e-9,132327e-9,128075e-9,123178e-9,11758e-8,111446e-9,104708e-9,975467e-10,898974e-10,819397e-10,736175e-10,651076e-10,563528e-10,475304e-10,385838e-10,296916e-10,207912e-10,120533e-10,341078e-11,-496114e-11,-131329e-10,-209483e-10,-284763e-10,-355551e-10,-422843e-10,-484951e-10,-542975e-10,-595314e-10,-643096e-10,-684826e-10,-721727e-10,-752399e-10,-778125e-10,-797531e-10,-811976e-10,-820231e-10,-823776e-10,-821338e-10,-814352e-10,-801866e-10,-785239e-10,-76345e-9,-73816e-9,-708235e-10,-675439e-10,-638636e-10,-599588e-10,-557171e-10,-513198e-10,-466589e-10,-419178e-10,-369807e-10,-32027e-9,-26946e-9,-219344e-10,-168632e-10,-119036e-10,-696714e-11,-219978e-11,249885e-11,696285e-11,113111e-10,153725e-10,19277e-9,228584e-10,262564e-10,293041e-10,321413e-10,345967e-10,368245e-10,386688e-10,402938e-10,415007e-10,424864e-10,430966e-10,434688e-10,434873e-10,432934e-10,42759e-9,420374e-10,409949e-10,397938e-10,383039e-10,36697e-9,348427e-10,329064e-10,307419e-10,285168e-10,261137e-10,237401e-10,211663e-10,186537e-10,160327e-10,134741e-10,10857e-9,833597e-11,578631e-11,335803e-11,9.2401e-7,-13684e-10,-36382e-10,-573549e-11,-776749e-11,-960308e-11,-113676e-10,-129938e-10,-145236e-10,-157554e-10,-170152e-10,-179838e-10,-189048e-10,-195855e-10,-202028e-10,-206024e-10,-209444e-10,-210971e-10,-212042e-10,-211532e-10,-210554e-10,-208155e-10,-204791e-10,-200022e-10,-193402e-10,-189821e-10,-18465e-9,-176733e-10,-171632e-10,-164166e-10,-158666e-10,-151664e-10,-146594e-10,-140497e-10,-136475e-10,-131811e-10,-129437e-10,-126772e-10,-126653e-10,-126581e-10,-129344e-10,-132492e-10,137812e-9];window.addEventListener("load",(async()=>{let o=.1,i=1e3,l=1,m=null,u=null,r=null;const d=await t({init:e=>({audioCtx:e,set maskeeGain(e){m&&m.gain.linearRampToValueAtTime(e,d.currentTime+.05),o=e},set maskeeFrequency(e){u&&u.frequency.exponentialRampToValueAtTime(e,d.currentTime+.05),i=e},set maskerGain(e){r&&r.gain.linearRampToValueAtTime(e,d.currentTime+.05),l=e}}),setup:(e,t,n)=>{u=e.audioCtx.createOscillator(),u.type="sine",u.frequency.value=i,u.start(),m=e.audioCtx.createGain(),m.gain.value=o,r=e.audioCtx.createGain(),r.gain.value=l,u.connect(m),m.connect(n),t.connect(r),r.connect(n)},teardown:()=>{u&&(u.disconnect(),u=null),m&&(m.disconnect(),m=null),r&&(r.disconnect(),r=null)}});d.proc.maskeeGain=.01,n(d,[{type:"noise",filter:a,label:"Noise @ 1kHz"},{type:"noise",filter:c,label:"Noise @ 550Hz"},{type:"sine"}]);const s=new e(d,document.getElementById("funccanvas")),g=document.getElementById("linear");g.checked=!1,g.onchange=function(e){s.freqLinear=e.target.checked};const k=e=>{s.drawWave=e,g.style.visibility=g.labels[0].style.visibility=e?"hidden":"visible"};document.getElementById("spectrum").onchange=e=>{k(!e.target.checked)},document.getElementById("waveform").onchange=e=>{k(e.target.checked)},document.getElementById("maskee").checked=!0,document.getElementById("maskee").onchange=function(e){e.target.checked?d.proc.maskeeGain=Math.pow(10,document.getElementById("maskeegain").value/20):d.proc.maskeeGain=0},document.getElementById("maskeegain").value="-40",document.getElementById("maskeegain").oninput=function(e){document.getElementById("maskee").checked&&(d.proc.maskeeGain=Math.pow(10,e.target.value/20)),e.target.labels[0].textContent=`${e.target.value} dB`},document.getElementById("maskeefrequency").value="1000",document.getElementById("maskeefrequency").oninput=function(e){d.proc.maskeeFrequency=e.target.value,e.target.labels[0].textContent=`${e.target.value} Hz`},document.getElementById("masker").checked=!0,document.getElementById("masker").onchange=function(e){e.target.checked?d.proc.maskerGain=1:d.proc.maskerGain=0}})); \ No newline at end of file diff --git a/preview/813/noisesourceproc.js b/preview/813/noisesourceproc.js new file mode 100644 index 00000000..a8700edf --- /dev/null +++ b/preview/813/noisesourceproc.js @@ -0,0 +1 @@ +class t extends AudioWorkletProcessor{constructor(){super(),this._idx=0,this._statesFrom=new Float32Array(0),this._statesTo=new Float32Array(0)}static get parameterDescriptors(){return[{name:"fadePeriod",defaultValue:0}]}static parameterAt(t,s){return t[1===t.length?0:s]}setChannelCount(t){this._statesFrom.length!==t&&(this._statesFrom=new Float32Array(t)),this._statesTo.length!==t&&(this._statesTo=new Float32Array(t))}process(s,e,r){this.setChannelCount(e[0].length);for(let s=0;s=a){for(let t=0;t Oversampling

Oversampling

Predefined
Local files
Browse...
Quantization word length
Up-sampling factor L

This script demonstrates the influence of oversampling on the power spectral density and quantization error. For a given quantization word length the noise level can be reduced with the oversampling factor. This applet allows to experiment this noise reduction effect, acoustically by modifying the oversampling and quantization factors, and visually with the spectral representation.

The following options can be set in the lower part of the user interface

  • Quantizer
    • word length w leads to quantization step size Q=2⁻⁽ʷ⁻¹⁾
  • Dither
    • rect dither - uniform probability density function
    • tri dither - triangular probability density function
    • high-pass dither - triangular probability density function and high-pass power spectral density
  • Noise shaping
    • first-order H(z)=z⁻¹
  • Up Sampling Factor
    • Factors from 4 up to 64 can be tested depending on the cpu performance of your machine.

You can choose between two predefined audio signals or your own local audio file to be processed.

Predefined music signal is licensed under CC-BY-3.0 by unfinite.

\ No newline at end of file diff --git a/preview/813/ovs.js b/preview/813/ovs.js new file mode 100644 index 00000000..2144759b --- /dev/null +++ b/preview/813/ovs.js @@ -0,0 +1 @@ +import{SignalGraph as e,setupAudio as t,setupPlayerControls as n}from"./common.js";window.addEventListener("load",(async()=>{const c=await t("ovsproc.js","ovs-processor");c.proc.w=16,c.proc.dithertype="rect",c.proc.noiseshapingfilter=1,c.proc.oversamplingfactor=4,n(c,[{type:"sine"},{type:"remote",label:"Music",url:"audio/unfinite_function.mp3"}]);const o=new e(c,document.getElementById("funccanvas")),d=document.getElementById("linear");d.checked=!1,d.onchange=function(e){o.freqLinear=e.target.checked};const i=e=>{o.drawWave=e,d.style.visibility=d.labels[0].style.visibility=e?"hidden":"visible"};function m(){document.getElementById("dither").checked?document.getElementById("noiseshaping").checked?document.getElementById("diagram").src="images/ovs/ns5.png":document.getElementById("diagram").src="images/ovs/ns5b.png":document.getElementById("noiseshaping").checked?document.getElementById("diagram").src="images/ovs/ns5c.png":document.getElementById("diagram").src="images/ovs/ns5d.png"}function g(){document.getElementById("dither").checked?c.proc.dithertype=document.getElementById("dithertype").value:c.proc.dithertype="none",m()}function a(){document.getElementById("noiseshaping").checked?c.proc.noiseshapingfilter=document.getElementById("noiseshapingfilter").value:c.proc.noiseshapingfilter=0,m()}document.getElementById("spectrum").onchange=e=>{i(!e.target.checked)},document.getElementById("waveform").onchange=e=>{i(e.target.checked)},document.getElementById("wordlength").value=16,document.getElementById("wordlength").onchange=function(e){c.proc.w=e.target.value},document.getElementById("dither").checked=!0,document.getElementById("dither").onchange=g,document.getElementById("noiseshaping").checked=!0,document.getElementById("noiseshaping").onchange=a,document.getElementById("dithertype").value="rect",document.getElementById("dithertype").onchange=g,document.getElementById("noiseshapingfilter").value=1,document.getElementById("noiseshapingfilter").onchange=a,document.getElementById("oversamplingfactor").value=4,document.getElementById("oversamplingfactor").onchange=e=>{c.proc.oversamplingfactor=e.target.value}})); \ No newline at end of file diff --git a/preview/813/ovsproc.js b/preview/813/ovsproc.js new file mode 100644 index 00000000..0e19bf86 --- /dev/null +++ b/preview/813/ovsproc.js @@ -0,0 +1 @@ +class A extends AudioWorkletProcessor{constructor(A){super();const g=this;this.port.onmessage=I=>{"set-property"===I.data.action?g[I.data.param]=I.data.value:"list-properties"===I.data.action&&g.port.postMessage({response:"list-properties",properties:A})}}}var g=void 0!==g?g:{},I=Object.assign({},g),t="object"==typeof window,B="function"==typeof importScripts;"object"==typeof process&&"object"==typeof process.versions&&process.versions.node;var e,r="";(t||B)&&(B?r=self.location.href:"undefined"!=typeof document&&document.currentScript&&(r=document.currentScript.src),r=0!==r.indexOf("blob:")?r.substr(0,r.replace(/[?#].*/,"").lastIndexOf("/")+1):"",B&&(e=A=>{try{var g=new XMLHttpRequest;return g.open("GET",A,!1),g.responseType="arraybuffer",g.send(null),new Uint8Array(g.response)}catch(g){var I=tg(A);if(I)return I;throw g}})),console.log.bind(console);var C,Q=console.warn.bind(console);Object.assign(g,I),I=null,"object"!=typeof WebAssembly&&M("no native wasm support detected");var n=!1;var i="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function E(A,g){return A?function(A,g,I){for(var t=g+I,B=g;A[B]&&!(B>=t);)++B;if(B-g>16&&A.buffer&&i)return i.decode(A.subarray(g,B));for(var e="";g>10,56320|1023&n)}}else e+=String.fromCharCode((31&r)<<6|C)}else e+=String.fromCharCode(r)}return e}(s,A,g):""}var o,a,s,c,u,l,h,f,d,y,D="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0;function p(A,g){for(var I=A,t=I>>1,B=t+g/2;!(t>=B)&&u[t];)++t;if((I=t<<1)-A>32&&D)return D.decode(s.subarray(A,I));for(var e="",r=0;!(r>=g/2);++r){var C=c[A+2*r>>1];if(0==C)break;e+=String.fromCharCode(C)}return e}function w(A,g,I){if(void 0===I&&(I=2147483647),I<2)return 0;for(var t=g,B=(I-=2)<2*A.length?I/2:A.length,e=0;e>1]=r,g+=2}return c[g>>1]=0,g-t}function F(A){return 2*A.length}function N(A,g){for(var I=0,t="";!(I>=g/4);){var B=l[A+4*I>>2];if(0==B)break;if(++I,B>=65536){var e=B-65536;t+=String.fromCharCode(55296|e>>10,56320|1023&e)}else t+=String.fromCharCode(B)}return t}function G(A,g,I){if(void 0===I&&(I=2147483647),I<4)return 0;for(var t=g,B=t+I-4,e=0;e=55296&&r<=57343)r=65536+((1023&r)<<10)|1023&A.charCodeAt(++e);if(l[g>>2]=r,(g+=4)+4>B)break}return l[g>>2]=0,g-t}function R(A){for(var g=0,I=0;I=55296&&t<=57343&&++I,g+=4}return g}var U=[],m=[],Y=[];var v=0,H=null;function M(A){throw Q(A="Aborted("+A+")"),n=!0,A+=". Build with -sASSERTIONS for more info.",new WebAssembly.RuntimeError(A)}var b,k="data:application/octet-stream;base64,";function J(A){return A.startsWith(k)}function S(A,g){var I,t,B;try{B=function(A){try{var g=tg(A);if(g)return g;if(e)return e(A);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(A){M(A)}}(A),t=new WebAssembly.Module(B),I=new WebAssembly.Instance(t,g)}catch(A){var r=A.toString();throw Q("failed to compile wasm module: "+r),(r.includes("imported Memory")||r.includes("memory import"))&&Q("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),A}return[I,t]}function W(A){for(;A.length>0;){var I=A.shift();if("function"!=typeof I){var t=I.func;"number"==typeof t?void 0===I.arg?K(t)():K(t)(I.arg):t(void 0===I.arg?null:I.arg)}else I(g)}}J(b="data:application/octet-stream;base64,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wPo/H4XLvxZqHT81XhpAFK5XwM/3e0BokYXAjZdWQLgeDcDP96M//KkRvzJ3rT11bnNpZ25lZCBzaG9ydAB1bnNpZ25lZCBpbnQAZmxvYXQAdWludDY0X3QAdmVjdG9yAGRpdGhlcgB3b3JrYnVmZmVyAHVuc2lnbmVkIGNoYXIAcQBzdGQ6OmV4Y2VwdGlvbgBPdnNJbXBsAGJvb2wAZW1zY3JpcHRlbjo6dmFsAHByb2Nlc3NCbG9jawBiYWRfYXJyYXlfbmV3X2xlbmd0aAB1bnNpZ25lZCBsb25nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBkb3VibGUAdm9pZABzdGQ6OmJhZF9hbGxvYwBuc04ATABlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgc2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgaW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxmbG9hdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MTZfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDMyX3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDMyX3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIGNoYXI+AHN0ZDo6YmFzaWNfc3RyaW5nPHVuc2lnbmVkIGNoYXI+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBsb25nPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxkb3VibGU+AE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWZFRQAAzA0AAKAHAAA3T3ZzSW1wbAAAAADMDQAAyAcAAFA3T3ZzSW1wbAAAAFAOAADcBwAAAAAAANQHAABQSzdPdnNJbXBsAABQDgAA+AcAAAEAAADUBwAAaWkAdgB2aQDoBwAACA0AAOgHAABoDQAAaA0AAHZpaWlpAAAAWAgAAOgHAABoDQAATjEwZW1zY3JpcHRlbjN2YWxFAADMDQAARAgAAGlpaWkAaWlpAHZpaWkAZmlpAHZpaWYAAAEAAAACAAAAAwAAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAADMDQAAhAgAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0loTlNfMTFjaGFyX3RyYWl0c0loRUVOU185YWxsb2NhdG9ySWhFRUVFAADMDQAAzAgAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0l3TlNfMTFjaGFyX3RyYWl0c0l3RUVOU185YWxsb2NhdG9ySXdFRUVFAADMDQAAFAkAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0lEc05TXzExY2hhcl90cmFpdHNJRHNFRU5TXzlhbGxvY2F0b3JJRHNFRUVFAAAAzA0AAFwJAABOU3QzX18yMTJiYXNpY19zdHJpbmdJRGlOU18xMWNoYXJfdHJhaXRzSURpRUVOU185YWxsb2NhdG9ySURpRUVFRQAAAMwNAACoCQAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJY0VFAADMDQAA9AkAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWFFRQAAzA0AABwKAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0loRUUAAMwNAABECgAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJc0VFAADMDQAAbAoAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SXRFRQAAzA0AAJQKAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lpRUUAAMwNAAC8CgAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJakVFAADMDQAA5AoAAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWxFRQAAzA0AAAwLAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0ltRUUAAMwNAAA0CwAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJZEVFAADMDQAAXAsAAE4xMF9fY3h4YWJpdjExNl9fc2hpbV90eXBlX2luZm9FAAAAAPQNAACECwAAcA8AAE4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQAAAPQNAAC0CwAAqAsAAE4xMF9fY3h4YWJpdjExN19fcGJhc2VfdHlwZV9pbmZvRQAAAPQNAADkCwAAqAsAAE4xMF9fY3h4YWJpdjExOV9fcG9pbnRlcl90eXBlX2luZm9FAPQNAAAUDAAACAwAAE4xMF9fY3h4YWJpdjEyMF9fZnVuY3Rpb25fdHlwZV9pbmZvRQAAAAD0DQAARAwAAKgLAABOMTBfX2N4eGFiaXYxMjlfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mb0UAAAD0DQAAeAwAAAgMAAAAAAAA+AwAABkAAAAaAAAAGwAAABwAAAAdAAAATjEwX19jeHhhYml2MTIzX19mdW5kYW1lbnRhbF90eXBlX2luZm9FAPQNAADQDAAAqAsAAHYAAAC8DAAABA0AAERuAAC8DAAAEA0AAGIAAAC8DAAAHA0AAGMAAAC8DAAAKA0AAGgAAAC8DAAANA0AAGEAAAC8DAAAQA0AAHMAAAC8DAAATA0AAHQAAAC8DAAAWA0AAGkAAAC8DAAAZA0AAGoAAAC8DAAAcA0AAGwAAAC8DAAAfA0AAG0AAAC8DAAAiA0AAHgAAAC8DAAAlA0AAHkAAAC8DAAAoA0AAGYAAAC8DAAArA0AAGQAAAC8DAAAuA0AAAAAAADYCwAAGQAAAB4AAAAbAAAAHAAAAB8AAAAgAAAAIQAAACIAAAAAAAAAPA4AABkAAAAjAAAAGwAAABwAAAAfAAAAJAAAACUAAAAmAAAATjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FAAAAAPQNAAAUDgAA2AsAAAAAAAA4DAAAGQAAACcAAAAbAAAAHAAAACgAAAAAAAAAyA4AABcAAAApAAAAKgAAAAAAAADwDgAAFwAAACsAAAAsAAAAAAAAALAOAAAXAAAALQAAAC4AAABTdDlleGNlcHRpb24AAAAAzA0AAKAOAABTdDliYWRfYWxsb2MAAAAA9A0AALgOAACwDgAAU3QyMGJhZF9hcnJheV9uZXdfbGVuZ3RoAAAAAPQNAADUDgAAyA4AAAAAAAAgDwAAGAAAAC8AAAAwAAAAU3QxMWxvZ2ljX2Vycm9yAPQNAAAQDwAAsA4AAAAAAABUDwAAGAAAADEAAAAwAAAAU3QxMmxlbmd0aF9lcnJvcgAAAAD0DQAAQA8AACAPAABTdDl0eXBlX2luZm8AAAAAzA0AAGAPAEH4HgsDgBFQ")||(b=r+b);var T=[];function K(A){var g=T[A];return g||(A>=T.length&&(T.length=A+1),T[A]=g=y.get(A)),g}function L(A){this.excPtr=A,this.ptr=A-24,this.set_type=function(A){h[this.ptr+4>>2]=A},this.get_type=function(){return h[this.ptr+4>>2]},this.set_destructor=function(A){h[this.ptr+8>>2]=A},this.get_destructor=function(){return h[this.ptr+8>>2]},this.set_refcount=function(A){l[this.ptr>>2]=A},this.set_caught=function(A){A=A?1:0,a[this.ptr+12|0]=A},this.get_caught=function(){return 0!=a[this.ptr+12|0]},this.set_rethrown=function(A){A=A?1:0,a[this.ptr+13|0]=A},this.get_rethrown=function(){return 0!=a[this.ptr+13|0]},this.init=function(A,g){this.set_adjusted_ptr(0),this.set_type(A),this.set_destructor(g),this.set_refcount(0),this.set_caught(!1),this.set_rethrown(!1)},this.add_ref=function(){var A=l[this.ptr>>2];l[this.ptr>>2]=A+1},this.release_ref=function(){var A=l[this.ptr>>2];return l[this.ptr>>2]=A-1,1===A},this.set_adjusted_ptr=function(A){h[this.ptr+16>>2]=A},this.get_adjusted_ptr=function(){return h[this.ptr+16>>2]},this.get_exception_ptr=function(){if(ig(this.get_type()))return h[this.excPtr>>2];var A=this.get_adjusted_ptr();return 0!==A?A:this.excPtr}}function Z(A){switch(A){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+A)}}var X=void 0;function x(A){for(var g="",I=A;s[I];)g+=X[s[I++]];return g}var P={},V={},j={};function q(A){if(void 0===A)return"_unknown";var g=(A=A.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return g>=48&&g<=57?"_"+A:A}function $(A,g){return A=q(A),new Function("body","return function "+A+'() {\n "use strict"; return body.apply(this, arguments);\n};\n')(g)}function O(A,g){var I=$(g,(function(A){this.name=g,this.message=A;var I=new Error(A).stack;void 0!==I&&(this.stack=this.toString()+"\n"+I.replace(/^Error(:[^\n]*)?\n/,""))}));return I.prototype=Object.create(A.prototype),I.prototype.constructor=I,I.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message},I}var z=void 0;function _(A){throw new z(A)}var AA=void 0;function gA(A){throw new AA(A)}function IA(A,g,I){function t(g){var t=I(g);t.length!==A.length&&gA("Mismatched type converter count");for(var B=0;B{V.hasOwnProperty(A)?B[g]=V[A]:(e.push(A),P.hasOwnProperty(A)||(P[A]=[]),P[A].push((()=>{B[g]=V[A],++r===e.length&&t(B)})))})),0===e.length&&t(B)}function tA(A,g,I={}){if(!("argPackAdvance"in g))throw new TypeError("registerType registeredInstance requires argPackAdvance");var t=g.name;if(A||_('type "'+t+'" must have a positive integer typeid pointer'),V.hasOwnProperty(A)){if(I.ignoreDuplicateRegistrations)return;_("Cannot register type '"+t+"' twice")}if(V[A]=g,delete j[A],P.hasOwnProperty(A)){var B=P[A];delete P[A],B.forEach((A=>A()))}}function BA(A){if(!(this instanceof NA))return!1;if(!(A instanceof NA))return!1;for(var g=this.$$.ptrType.registeredClass,I=this.$$.ptr,t=A.$$.ptrType.registeredClass,B=A.$$.ptr;g.baseClass;)I=g.upcast(I),g=g.baseClass;for(;t.baseClass;)B=t.upcast(B),t=t.baseClass;return g===t&&I===B}function eA(A){_(A.$$.ptrType.registeredClass.name+" instance already deleted")}var rA=!1;function CA(A){}function QA(A){A.count.value-=1,0===A.count.value&&function(A){A.smartPtr?A.smartPtrType.rawDestructor(A.smartPtr):A.ptrType.registeredClass.rawDestructor(A.ptr)}(A)}function nA(A,g,I){if(g===I)return A;if(void 0===I.baseClass)return null;var t=nA(A,g,I.baseClass);return null===t?null:I.downcast(t)}var iA={};function EA(){return Object.keys(lA).length}function oA(){var A=[];for(var g in lA)lA.hasOwnProperty(g)&&A.push(lA[g]);return A}var aA=[];function sA(){for(;aA.length;){var A=aA.pop();A.$$.deleteScheduled=!1,A.delete()}}var cA=void 0;function uA(A){cA=A,aA.length&&cA&&cA(sA)}var lA={};function hA(A,g){return g=function(A,g){for(void 0===g&&_("ptr should not be undefined");A.baseClass;)g=A.upcast(g),A=A.baseClass;return g}(A,g),lA[g]}function fA(A,g){return g.ptrType&&g.ptr||gA("makeClassHandle requires ptr and ptrType"),!!g.smartPtrType!==!!g.smartPtr&&gA("Both smartPtrType and smartPtr must be specified"),g.count={value:1},yA(Object.create(A,{$$:{value:g}}))}function dA(A){var g=this.getPointee(A);if(!g)return this.destructor(A),null;var I=hA(this.registeredClass,g);if(void 0!==I){if(0===I.$$.count.value)return I.$$.ptr=g,I.$$.smartPtr=A,I.clone();var t=I.clone();return this.destructor(A),t}function B(){return this.isSmartPointer?fA(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:g,smartPtrType:this,smartPtr:A}):fA(this.registeredClass.instancePrototype,{ptrType:this,ptr:A})}var e,r=this.registeredClass.getActualType(g),C=iA[r];if(!C)return B.call(this);e=this.isConst?C.constPointerType:C.pointerType;var Q=nA(g,this.registeredClass,e.registeredClass);return null===Q?B.call(this):this.isSmartPointer?fA(e.registeredClass.instancePrototype,{ptrType:e,ptr:Q,smartPtrType:this,smartPtr:A}):fA(e.registeredClass.instancePrototype,{ptrType:e,ptr:Q})}function yA(A){return"undefined"==typeof FinalizationRegistry?(yA=A=>A,A):(rA=new FinalizationRegistry((A=>{QA(A.$$)})),yA=A=>{var g=A.$$;if(!!g.smartPtr){var I={$$:g};rA.register(A,I,A)}return A},CA=A=>rA.unregister(A),yA(A))}function DA(){if(this.$$.ptr||eA(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var A,g=yA(Object.create(Object.getPrototypeOf(this),{$$:{value:(A=this.$$,{count:A.count,deleteScheduled:A.deleteScheduled,preservePointerOnDelete:A.preservePointerOnDelete,ptr:A.ptr,ptrType:A.ptrType,smartPtr:A.smartPtr,smartPtrType:A.smartPtrType})}}));return g.$$.count.value+=1,g.$$.deleteScheduled=!1,g}function pA(){this.$$.ptr||eA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&_("Object already scheduled for deletion"),CA(this),QA(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)}function wA(){return!this.$$.ptr}function FA(){return this.$$.ptr||eA(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&_("Object already scheduled for deletion"),aA.push(this),1===aA.length&&cA&&cA(sA),this.$$.deleteScheduled=!0,this}function NA(){}function GA(A,g,I){if(void 0===A[g].overloadTable){var t=A[g];A[g]=function(){return A[g].overloadTable.hasOwnProperty(arguments.length)||_("Function '"+I+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+A[g].overloadTable+")!"),A[g].overloadTable[arguments.length].apply(this,arguments)},A[g].overloadTable=[],A[g].overloadTable[t.argCount]=t}}function RA(A,g,I,t,B,e,r,C){this.name=A,this.constructor=g,this.instancePrototype=I,this.rawDestructor=t,this.baseClass=B,this.getActualType=e,this.upcast=r,this.downcast=C,this.pureVirtualFunctions=[]}function UA(A,g,I){for(;g!==I;)g.upcast||_("Expected null or instance of "+I.name+", got an instance of "+g.name),A=g.upcast(A),g=g.baseClass;return A}function mA(A,g){if(null===g)return this.isReference&&_("null is not a valid "+this.name),0;g.$$||_('Cannot pass "'+_A(g)+'" as a '+this.name),g.$$.ptr||_("Cannot pass deleted object as a pointer of type "+this.name);var I=g.$$.ptrType.registeredClass;return UA(g.$$.ptr,I,this.registeredClass)}function YA(A,g){var I;if(null===g)return this.isReference&&_("null is not a valid "+this.name),this.isSmartPointer?(I=this.rawConstructor(),null!==A&&A.push(this.rawDestructor,I),I):0;g.$$||_('Cannot pass "'+_A(g)+'" as a '+this.name),g.$$.ptr||_("Cannot pass deleted object as a pointer of type "+this.name),!this.isConst&&g.$$.ptrType.isConst&&_("Cannot convert argument of type "+(g.$$.smartPtrType?g.$$.smartPtrType.name:g.$$.ptrType.name)+" to parameter type "+this.name);var t=g.$$.ptrType.registeredClass;if(I=UA(g.$$.ptr,t,this.registeredClass),this.isSmartPointer)switch(void 0===g.$$.smartPtr&&_("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:g.$$.smartPtrType===this?I=g.$$.smartPtr:_("Cannot convert argument of type "+(g.$$.smartPtrType?g.$$.smartPtrType.name:g.$$.ptrType.name)+" to parameter type "+this.name);break;case 1:I=g.$$.smartPtr;break;case 2:if(g.$$.smartPtrType===this)I=g.$$.smartPtr;else{var B=g.clone();I=this.rawShare(I,zA.toHandle((function(){B.delete()}))),null!==A&&A.push(this.rawDestructor,I)}break;default:_("Unsupporting sharing policy")}return I}function vA(A,g){if(null===g)return this.isReference&&_("null is not a valid "+this.name),0;g.$$||_('Cannot pass "'+_A(g)+'" as a '+this.name),g.$$.ptr||_("Cannot pass deleted object as a pointer of type "+this.name),g.$$.ptrType.isConst&&_("Cannot convert argument of type "+g.$$.ptrType.name+" to parameter type "+this.name);var I=g.$$.ptrType.registeredClass;return UA(g.$$.ptr,I,this.registeredClass)}function HA(A){return this.fromWireType(h[A>>2])}function MA(A){return this.rawGetPointee&&(A=this.rawGetPointee(A)),A}function bA(A){this.rawDestructor&&this.rawDestructor(A)}function kA(A){null!==A&&A.delete()}function JA(A,g,I,t,B,e,r,C,Q,n,i){this.name=A,this.registeredClass=g,this.isReference=I,this.isConst=t,this.isSmartPointer=B,this.pointeeType=e,this.sharingPolicy=r,this.rawGetPointee=C,this.rawConstructor=Q,this.rawShare=n,this.rawDestructor=i,B||void 0!==g.baseClass?this.toWireType=YA:t?(this.toWireType=mA,this.destructorFunction=null):(this.toWireType=vA,this.destructorFunction=null)}function SA(A,I,t){return A.includes("j")?function(A,I,t){var B=g["dynCall_"+A];return t&&t.length?B.apply(null,[I].concat(t)):B.call(null,I)}(A,I,t):K(I).apply(null,t)}function WA(A,g){var I,t,B,e=(A=x(A)).includes("j")?(I=A,t=g,B=[],function(){return B.length=0,Object.assign(B,arguments),SA(I,t,B)}):K(g);return"function"!=typeof e&&_("unknown function pointer with signature "+A+": "+g),e}var TA=void 0;function KA(A){var g=rg(A),I=x(g);return ng(g),I}function LA(A,g){var I=[],t={};throw g.forEach((function A(g){t[g]||V[g]||(j[g]?j[g].forEach(A):(I.push(g),t[g]=!0))})),new TA(A+": "+I.map(KA).join([", "]))}function ZA(A,g){for(var I=[],t=0;t>2)+t]);return I}function XA(A){for(;A.length;){var g=A.pop();A.pop()(g)}}function xA(A,g,I,t,B){var e=g.length;e<2&&_("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var r=null!==g[1]&&null!==I,C=!1,Q=1;Q0?", ":"")+E),o+=(n?"var rv = ":"")+"invoker(fn"+(E.length>0?", ":"")+E+");\n",C)o+="runDestructors(destructors);\n";else for(Q=r?1:2;Q4&&0==--jA[A].refcount&&(jA[A]=void 0,VA.push(A))}function $A(){for(var A=0,g=5;g(A||_("Cannot use deleted val. handle = "+A),jA[A].value),toHandle:A=>{switch(A){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var g=VA.length?VA.pop():jA.length;return jA[g]={refcount:1,value:A},g}}};function _A(A){if(null===A)return"null";var g=typeof A;return"object"===g||"array"===g||"function"===g?A.toString():""+A}function Ag(A,g){switch(g){case 2:return function(A){return this.fromWireType(f[A>>2])};case 3:return function(A){return this.fromWireType(d[A>>3])};default:throw new TypeError("Unknown float type: "+A)}}function gg(A,g,I){switch(g){case 0:return I?function(A){return a[A]}:function(A){return s[A]};case 1:return I?function(A){return c[A>>1]}:function(A){return u[A>>1]};case 2:return I?function(A){return l[A>>2]}:function(A){return h[A>>2]};default:throw new TypeError("Unknown integer type: "+A)}}!function(){for(var A=new Array(256),g=0;g<256;++g)A[g]=String.fromCharCode(g);X=A}(),z=g.BindingError=O(Error,"BindingError"),AA=g.InternalError=O(Error,"InternalError"),NA.prototype.isAliasOf=BA,NA.prototype.clone=DA,NA.prototype.delete=pA,NA.prototype.isDeleted=wA,NA.prototype.deleteLater=FA,g.getInheritedInstanceCount=EA,g.getLiveInheritedInstances=oA,g.flushPendingDeletes=sA,g.setDelayFunction=uA,JA.prototype.getPointee=MA,JA.prototype.destructor=bA,JA.prototype.argPackAdvance=8,JA.prototype.readValueFromPointer=HA,JA.prototype.deleteObject=kA,JA.prototype.fromWireType=dA,TA=g.UnboundTypeError=O(Error,"UnboundTypeError"),g.count_emval_handles=$A,g.get_first_emval=OA;var Ig="function"==typeof atob?atob:function(A){var g,I,t,B,e,r,C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",Q="",n=0;A=A.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{g=C.indexOf(A.charAt(n++))<<2|(B=C.indexOf(A.charAt(n++)))>>4,I=(15&B)<<4|(e=C.indexOf(A.charAt(n++)))>>2,t=(3&e)<<6|(r=C.indexOf(A.charAt(n++))),Q+=String.fromCharCode(g),64!==e&&(Q+=String.fromCharCode(I)),64!==r&&(Q+=String.fromCharCode(t))}while(n>e])},destructorFunction:null})},u:function(A,I,t,B,e,r,C,Q,n,i,E,o,a){E=x(E),r=WA(e,r),Q&&(Q=WA(C,Q)),i&&(i=WA(n,i)),a=WA(o,a);var s=q(E);!function(A,I,t){g.hasOwnProperty(A)?(_("Cannot register public name '"+A+"' twice"),GA(g,A,A),g.hasOwnProperty(t)&&_("Cannot register multiple overloads of a function with the same number of arguments ("+t+")!"),g[A].overloadTable[t]=I):g[A]=I}(s,(function(){LA("Cannot construct "+E+" due to unbound types",[B])})),IA([A,I,t],B?[B]:[],(function(I){var t,e;I=I[0],e=B?(t=I.registeredClass).instancePrototype:NA.prototype;var C=$(s,(function(){if(Object.getPrototypeOf(this)!==n)throw new z("Use 'new' to construct "+E);if(void 0===o.constructor_body)throw new z(E+" has no accessible constructor");var A=o.constructor_body[arguments.length];if(void 0===A)throw new z("Tried to invoke ctor of "+E+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(o.constructor_body).toString()+") parameters instead!");return A.apply(this,arguments)})),n=Object.create(e,{constructor:{value:C}});C.prototype=n;var o=new RA(E,C,n,a,t,r,Q,i),c=new JA(E,o,!0,!1,!1),u=new JA(E+"*",o,!1,!1,!1),l=new JA(E+" const*",o,!1,!0,!1);return iA[A]={pointerType:u,constPointerType:l},function(A,I,t){g.hasOwnProperty(A)||gA("Replacing nonexistant public symbol"),void 0!==g[A].overloadTable&&void 0!==t||(g[A]=I,g[A].argCount=t)}(s,C),[c,u,l]}))},t:function(A,g,I,t,B,e){var r;g>0||M(r);var C=ZA(g,I);B=WA(t,B),IA([],[A],(function(A){var I="constructor "+(A=A[0]).name;if(void 0===A.registeredClass.constructor_body&&(A.registeredClass.constructor_body=[]),void 0!==A.registeredClass.constructor_body[g-1])throw new z("Cannot register multiple constructors with identical number of parameters ("+(g-1)+") for class '"+A.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return A.registeredClass.constructor_body[g-1]=()=>{LA("Cannot construct "+A.name+" due to unbound types",C)},IA([],C,(function(t){return t.splice(1,0,null),A.registeredClass.constructor_body[g-1]=xA(I,t,null,B,e),[]})),[]}))},g:function(A,g,I,t,B,e,r,C){var Q=ZA(I,t);g=x(g),e=WA(B,e),IA([],[A],(function(A){var t=(A=A[0]).name+"."+g;function B(){LA("Cannot call "+t+" due to unbound types",Q)}g.startsWith("@@")&&(g=Symbol[g.substring(2)]),C&&A.registeredClass.pureVirtualFunctions.push(g);var n=A.registeredClass.instancePrototype,i=n[g];return void 0===i||void 0===i.overloadTable&&i.className!==A.name&&i.argCount===I-2?(B.argCount=I-2,B.className=A.name,n[g]=B):(GA(n,g,t),n[g].overloadTable[I-2]=B),IA([],Q,(function(B){var C=xA(t,B,A,e,r);return void 0===n[g].overloadTable?(C.argCount=I-2,n[g]=C):n[g].overloadTable[I-2]=C,[]})),[]}))},c:function(A,g,I,t,B,e,r,C,Q,n){g=x(g),B=WA(t,B),IA([],[A],(function(A){var t=(A=A[0]).name+"."+g,i={get:function(){LA("Cannot access "+t+" due to unbound types",[I,r])},enumerable:!0,configurable:!0};return i.set=Q?()=>{LA("Cannot access "+t+" due to unbound types",[I,r])}:A=>{_(t+" is a read-only property")},Object.defineProperty(A.registeredClass.instancePrototype,g,i),IA([],Q?[I,r]:[I],(function(I){var r=I[0],i={get:function(){var g=PA(this,A,t+" getter");return r.fromWireType(B(e,g))},enumerable:!0};if(Q){Q=WA(C,Q);var E=I[1];i.set=function(g){var I=PA(this,A,t+" setter"),B=[];Q(n,I,E.toWireType(B,g)),XA(B)}}return Object.defineProperty(A.registeredClass.instancePrototype,g,i),[]})),[]}))},r:function(A,g){tA(A,{name:g=x(g),fromWireType:function(A){var g=zA.toValue(A);return qA(A),g},toWireType:function(A,g){return zA.toHandle(g)},argPackAdvance:8,readValueFromPointer:HA,destructorFunction:null})},i:function(A,g,I){var t=Z(I);tA(A,{name:g=x(g),fromWireType:function(A){return A},toWireType:function(A,g){return g},argPackAdvance:8,readValueFromPointer:Ag(g,t),destructorFunction:null})},b:function(A,g,I,t,B){g=x(g);var e=Z(I),r=A=>A;if(0===t){var C=32-8*I;r=A=>A<>>C}var Q=g.includes("unsigned");tA(A,{name:g,fromWireType:r,toWireType:Q?function(A,g){return this.name,g>>>0}:function(A,g){return this.name,g},argPackAdvance:8,readValueFromPointer:gg(g,e,0!==t),destructorFunction:null})},a:function(A,g,I){var t=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][g];function B(A){var g=h,I=g[A>>=2],B=g[A+1];return new t(o,B,I)}tA(A,{name:I=x(I),fromWireType:B,argPackAdvance:8,readValueFromPointer:B},{ignoreDuplicateRegistrations:!0})},h:function(A,g){var I="std::string"===(g=x(g));tA(A,{name:g,fromWireType:function(A){var g,t=h[A>>2];if(I)for(var B=A+4,e=0;e<=t;++e){var r=A+4+e;if(e==t||0==s[r]){var C=E(B,r-B);void 0===g?g=C:(g+=String.fromCharCode(0),g+=C),B=r+1}}else{var Q=new Array(t);for(e=0;efunction(A){for(var g=0,I=0;I=55296&&t<=57343&&(t=65536+((1023&t)<<10)|1023&A.charCodeAt(++I)),t<=127?++g:g+=t<=2047?2:t<=65535?3:4}return g}(g):()=>g.length;var e=t(),r=Qg(4+e+1);if(h[r>>2]=e,I&&B)(function(A,g,I,t){if(!(t>0))return 0;for(var B=I,e=I+t-1,r=0;r=55296&&C<=57343&&(C=65536+((1023&C)<<10)|1023&A.charCodeAt(++r)),C<=127){if(I>=e)break;g[I++]=C}else if(C<=2047){if(I+1>=e)break;g[I++]=192|C>>6,g[I++]=128|63&C}else if(C<=65535){if(I+2>=e)break;g[I++]=224|C>>12,g[I++]=128|C>>6&63,g[I++]=128|63&C}else{if(I+3>=e)break;g[I++]=240|C>>18,g[I++]=128|C>>12&63,g[I++]=128|C>>6&63,g[I++]=128|63&C}}g[I]=0})(g,s,r+4,e+1);else if(B)for(var C=0;C255&&(ng(r),_("String has UTF-16 code units that do not fit in 8 bits")),s[r+4+C]=Q}else for(C=0;Cu,C=1):4===g&&(t=N,B=G,r=R,e=()=>h,C=2),tA(A,{name:I,fromWireType:function(A){for(var I,B=h[A>>2],r=e(),Q=A+4,n=0;n<=B;++n){var i=A+4+n*g;if(n==B||0==r[i>>C]){var E=t(Q,i-Q);void 0===I?I=E:(I+=String.fromCharCode(0),I+=E),Q=i+g}}return ng(A),I},toWireType:function(A,t){"string"!=typeof t&&_("Cannot pass non-string to C++ string type "+I);var e=r(t),Q=Qg(4+e+g);return h[Q>>2]=e>>C,B(t,Q+4,e+g),null!==A&&A.push(ng,Q),Q},argPackAdvance:8,readValueFromPointer:HA,destructorFunction:function(A){ng(A)}})},j:function(A,g){tA(A,{isVoid:!0,name:g=x(g),argPackAdvance:0,fromWireType:function(){},toWireType:function(A,g){}})},k:qA,l:function(A){A>4&&(jA[A].refcount+=1)},m:function(A,g){var I,t,B;t="_emval_take_value",void 0===(B=V[I=A])&&_(t+" has unknown type "+KA(I));var e=(A=B).readValueFromPointer(g);return zA.toHandle(e)},o:function(){M("")},q:function(A,g,I){s.copyWithin(A,g,g+I)},p:function(A){s.length,M("OOM")}},eg=function(){var A={a:Bg};function I(A,I){var t,B,e=A.exports;g.asm=e,C=g.asm.v,t=C.buffer,o=t,g.HEAP8=a=new Int8Array(t),g.HEAP16=c=new Int16Array(t),g.HEAP32=l=new Int32Array(t),g.HEAPU8=s=new Uint8Array(t),g.HEAPU16=u=new Uint16Array(t),g.HEAPU32=h=new Uint32Array(t),g.HEAPF32=f=new Float32Array(t),g.HEAPF64=d=new Float64Array(t),y=g.asm.x,B=g.asm.w,m.unshift(B),function(){if(0==--v&&H){var A=H;H=null,A()}}()}if(v++,g.instantiateWasm)try{return g.instantiateWasm(A,I)}catch(A){return Q("Module.instantiateWasm callback failed with error: "+A),!1}return I(S(b,A)[0]),g.asm}();g.___wasm_call_ctors=eg.w;var rg=g.___getTypeName=eg.y;g.___embind_register_native_and_builtin_types=eg.z;var Cg,Qg=g._malloc=eg.A,ng=g._free=eg.B,ig=g.___cxa_is_pointer_type=eg.C;function Eg(A){v>0||(W(U),v>0||Cg||(Cg=!0,g.calledRun=!0,n||(W(m),W(Y))))}H=function A(){Cg||Eg(),Cg||(H=A)},g.run=Eg,Eg();registerProcessor("ovs-processor",class extends A{constructor(){super(["w","dithertype","noiseshapingfilter","oversamplingfactor"]),this.procimpl=new g.OvsImpl}set w(A){this.procimpl.q=Math.pow(2,1-A)}set dithertype(A){this.procimpl.dither="rect"===A?1:"tri"===A?2:"hp"===A?3:0}set noiseshapingfilter(A){this.procimpl.nsN=0|A}set oversamplingfactor(A){this.procimpl.L=0|A}process(A,g){for(let I=0;I Quantization, Dithering, and Noise Shaping

Quantization, Dithering, and Noise Shaping

Predefined
Local files
Browse...
Quantization word length

This script demonstrates audio effects resulting from Quantization. It is designed for a first insight into the perceptual effects of quantizing an audio signal.

The following options can be set in the lower part of the user interface

  • Quantizer 
    • word length w leads to quantization step size Q=2⁻⁽ʷ⁻¹⁾
  • Dither
    • rect dither - uniform probability density function
    • tri dither - triangular probability density function
    • high-pass dither - triangular probability density function and high-pass power spectral density
  • Noise shaping
    • first-order H(z)=z⁻¹
    • second-order H(z)=-2z⁻¹+z⁻²
    • psychoacoustic noise shaping

You can choose between two predefined audio signals or your own local audio file to be processed.

Predefined music signal is licensed under CC-BY-3.0 by unfinite.

\ No newline at end of file diff --git a/preview/813/qds.js b/preview/813/qds.js new file mode 100644 index 00000000..d6ca0e1d --- /dev/null +++ b/preview/813/qds.js @@ -0,0 +1 @@ +import{SignalGraph as e,setupAudio as t,setupPlayerControls as n}from"./common.js";window.addEventListener("load",(async()=>{const c=await t("qdsproc.js","qds-processor");c.proc.w=16,c.proc.dither=!0,c.proc.dithertype="rect",c.proc.noiseshaping=!0,c.proc.noiseshapingfilter=1,n(c,[{type:"sine"},{type:"remote",label:"Music",url:"audio/unfinite_function.mp3"}]);const d=new e(c,document.getElementById("funccanvas")),o=document.getElementById("linear");o.checked=!1,o.onchange=function(e){d.freqLinear=e.target.checked};const i=e=>{d.drawWave=e,o.style.visibility=o.labels[0].style.visibility=e?"hidden":"visible"};function g(){document.getElementById("dither").checked?document.getElementById("noiseshaping").checked?document.getElementById("diagram").src="images/qds/ns5.png":document.getElementById("diagram").src="images/qds/ns5b.png":document.getElementById("noiseshaping").checked?document.getElementById("diagram").src="images/qds/ns5c.png":document.getElementById("diagram").src="images/qds/ns5d.png"}document.getElementById("spectrum").onchange=e=>{i(!e.target.checked)},document.getElementById("waveform").onchange=e=>{i(e.target.checked)},document.getElementById("wordlength").value=16,document.getElementById("wordlength").onchange=function(e){c.proc.w=e.target.value},document.getElementById("dither").checked=!0,document.getElementById("dither").onchange=function(e){c.proc.dither=e.target.checked,g()},document.getElementById("noiseshaping").checked=!0,document.getElementById("noiseshaping").onchange=function(e){c.proc.noiseshaping=e.target.checked,g()},document.getElementById("dithertype").value="rect",document.getElementById("dithertype").onchange=function(e){c.proc.dithertype=e.target.value},document.getElementById("noiseshapingfilter").value=1,document.getElementById("noiseshapingfilter").onchange=function(e){c.proc.noiseshapingfilter=e.target.value}})); \ No newline at end of file diff --git a/preview/813/qdsproc.js b/preview/813/qdsproc.js new file mode 100644 index 00000000..2e3858f1 --- /dev/null +++ b/preview/813/qdsproc.js @@ -0,0 +1 @@ +class t extends AudioWorkletProcessor{constructor(t){super();const e=this;this.port.onmessage=s=>{"set-property"===s.data.action?e[s.data.param]=s.data.value:"list-properties"===s.data.action&&e.port.postMessage({response:"list-properties",properties:t})}}}registerProcessor("qds-processor",class extends t{constructor(){super(["w","dither","dithertype","noiseshaping","noiseshapingfilter"]),this.qt=.25,this.withDither=!1,this.ditherstate=new Float32Array(0),this.dithergen=this.rectDither,this.withNoiseShaping=!0,this.h=Float32Array.from([1]),this.nsState=new Array(0)}setChannelCount(t){if(this.ditherstate.length!==t&&(this.ditherstate=new Float32Array(t)),this.nsState.length!==t){this.nsState=new Array(t);for(let t=0;t=0;t--)this.nsState[s][t]=this.nsState[s][t-1];this.nsState[s][0]=a-e,r[t]=a}}return!0}}); \ No newline at end of file diff --git a/preview/813/sw.js b/preview/813/sw.js new file mode 100644 index 00000000..9c8866b1 --- /dev/null +++ b/preview/813/sw.js @@ -0,0 +1 @@ +const s="jsdafx-9f7539978ee5454caa9f14d37751c18992a0603d400aa8170808a79c9ea1bc80",a=["index.html","install-sw.js","noisesourceproc.js","common.js","audio/434013__mrpearch__drum-patern.mp3","audio/Ada_Lovelace_(As_Told_By_U.S._Chief_Technology_Officer_Megan_Smith).mp3","audio/BluesHawk1.wav","audio/Burns1.wav","audio/DittersdorfOvid2.ogx","audio/captain-pretzel_ghost-gulping.wav","audio/unfinite_function.mp3","images/ant_logo.png","images/delays/chorus1.png","images/delays/flanger1.png","images/delays/tremolo1.png","images/delays/vibrato1.png","images/drc/diag1.png","images/drc/diag2.png","images/home.png","images/ovs/ns5.png","images/ovs/ns5b.png","images/ovs/ns5c.png","images/ovs/ns5d.png","images/qds/ns5.png","images/qds/ns5b.png","images/qds/ns5c.png","images/qds/ns5d.png","qdsproc.js","qds.html","qds.js","ovsproc.js","ovs.html","ovs.js","eqproc.js","eq.html","eq.js","distortionproc.js","distortion.html","distortion.js","masking.html","masking.js","delays.html","delays.js","fastconv.html","fastconv.js","drcproc.js","drc.html","drc.js","images/eq.png","images/distortion.png","images/masking.png","images/fastconv.png"];self.addEventListener("install",(e=>{e.waitUntil((async()=>(await caches.open(s)).addAll(a))())}));self.addEventListener("fetch",(s=>{s.respondWith((async s=>await caches.match(s)||(console.warn("Missing from cache: ",s.url),fetch(s)))(s.request))}));self.addEventListener("activate",(a=>{a.waitUntil((async()=>{const a=(await caches.keys()).filter((a=>a!==s));return Promise.all(a.map((s=>caches.delete(s))))})())})); \ No newline at end of file