diff --git a/.gitignore b/.gitignore index 9020b72..096746c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -/node_modules/ -/build/ \ No newline at end of file +/node_modules/ \ No newline at end of file diff --git a/.gitignore.ghpages b/.gitignore.ghpages deleted file mode 100644 index 096746c..0000000 --- a/.gitignore.ghpages +++ /dev/null @@ -1 +0,0 @@ -/node_modules/ \ No newline at end of file diff --git a/build/main.js b/build/main.js new file mode 100644 index 0000000..5fdbb17 --- /dev/null +++ b/build/main.js @@ -0,0 +1,2 @@ +(()=>{"use strict";const e={context:void 0,registry:void 0};function t(t){e.context=t}const n=(Symbol("solid-proxy"),Symbol("solid-track"),Symbol("solid-dev-component"),{equals:(e,t)=>e===t});let o=null,s=B;const r=1,i=2,l={owned:null,cleanups:null,context:null,owner:null};var a=null;let c=null,u=null,f=null,h=null,d=null,m=null,g=0;const[p,y]=x(!1);function x(e,t){const o={value:e,observers:null,observerSlots:null,comparator:(t=t?Object.assign({},n,t):n).equals||void 0};return[M.bind(o),e=>("function"==typeof e&&(e=c&&c.running&&c.sources.has(o)?e(o.tValue):e(o.value)),T(o,e))]}function v(e,t,n){const o=k(e,t,!1,r);u&&c&&c.running?d.push(o):q(o)}function w(e,t,n){s=O;const o=k(e,t,!1,r),i=P&&(l=P,a&&a.context&&void 0!==a.context[l.id]?a.context[l.id]:l.defaultValue);var l;i&&(o.suspense=i),n&&n.render||(o.user=!0),m?m.push(o):q(o)}function b(e,t,o){o=o?Object.assign({},n,o):n;const s=k(e,t,!0,0);return s.observers=null,s.observerSlots=null,s.comparator=o.equals||void 0,u&&c&&c.running?(s.tState=r,d.push(s)):q(s),M.bind(s)}function S(e){if(null===h)return e();const t=h;h=null;try{return e()}finally{h=t}}function F(e){w((()=>S(e)))}function A(e){const t=b(e),n=b((()=>V(t())));return n.toArray=()=>{const e=n();return Array.isArray(e)?e:null!=e?[e]:[]},n}let P;function M(){const e=c&&c.running;if(this.sources&&(e?this.tState:this.state))if((e?this.tState:this.state)===r)q(this);else{const e=d;d=null,N((()=>E(this)),!1),d=e}if(h){const e=this.observers?this.observers.length:0;h.sources?(h.sources.push(this),h.sourceSlots.push(e)):(h.sources=[this],h.sourceSlots=[e]),this.observers?(this.observers.push(h),this.observerSlots.push(h.sources.length-1)):(this.observers=[h],this.observerSlots=[h.sources.length-1])}return e&&c.sources.has(this)?this.tValue:this.value}function T(e,t,n){let o=c&&c.running&&c.sources.has(e)?e.tValue:e.value;if(!e.comparator||!e.comparator(o,t)){if(c){const o=c.running;(o||!n&&c.sources.has(e))&&(c.sources.add(e),e.tValue=t),o||(e.value=t)}else e.value=t;e.observers&&e.observers.length&&N((()=>{for(let t=0;t1e6)throw d=[],new Error}),!1)}return t}function q(e){if(!e.fn)return;G(e);const t=a,n=h,o=g;h=a=e,D(e,c&&c.running&&c.sources.has(e)?e.tValue:e.value,o),c&&!c.running&&c.sources.has(e)&&queueMicrotask((()=>{N((()=>{c&&(c.running=!0),h=a=e,D(e,e.tValue,o),h=a=null}),!1)})),h=n,a=t}function D(e,t,n){let o;try{o=e.fn(t)}catch(t){return e.pure&&(c&&c.running?(e.tState=r,e.tOwned&&e.tOwned.forEach(G),e.tOwned=void 0):(e.state=r,e.owned&&e.owned.forEach(G),e.owned=null)),e.updatedAt=n+1,L(t)}(!e.updatedAt||e.updatedAt<=n)&&(null!=e.updatedAt&&"observers"in e?T(e,o,!0):c&&c.running&&e.pure?(c.sources.add(e),e.tValue=o):e.value=o,e.updatedAt=n)}function k(e,t,n,o=r,s){const i={fn:e,state:o,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:a,context:a?a.context:null,pure:n};if(c&&c.running&&(i.state=0,i.tState=o),null===a||a!==l&&(c&&c.running&&a.pure?a.tOwned?a.tOwned.push(i):a.tOwned=[i]:a.owned?a.owned.push(i):a.owned=[i]),f){const[e,t]=x(void 0,{equals:!1}),n=f(i.fn,t);!function(e){null===a||(null===a.cleanups?a.cleanups=[e]:a.cleanups.push(e))}((()=>n.dispose()));const o=()=>function(e){if(c&&c.running)return e(),c.done;const t=h,n=a;return Promise.resolve().then((()=>{let o;return h=t,a=n,(u||P)&&(o=c||(c={sources:new Set,effects:[],promises:new Set,disposed:new Set,queue:new Set,running:!0}),o.done||(o.done=new Promise((e=>o.resolve=e))),o.running=!0),N(e,!1),h=a=null,o?o.done:void 0}))}(t).then((()=>s.dispose())),s=f(i.fn,o);i.fn=t=>(e(),c&&c.running?s.track(t):n.track(t))}return i}function C(e){const t=c&&c.running;if(0===(t?e.tState:e.state))return;if((t?e.tState:e.state)===i)return E(e);if(e.suspense&&S(e.suspense.inFallback))return e.suspense.effects.push(e);const n=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt=0;o--){if(e=n[o],t){let t=e,s=n[o+1];for(;(t=t.owner)&&t!==s;)if(c.disposed.has(t))return}if((t?e.tState:e.state)===r)q(e);else if((t?e.tState:e.state)===i){const t=d;d=null,N((()=>E(e,n[0])),!1),d=t}}}function N(e,t){if(d)return e();let n=!1;t||(d=[]),m?n=!0:m=[],g++;try{const t=e();return function(e){if(d&&(u&&c&&c.running?function(e){for(let t=0;t{o.delete(n),N((()=>{c.running=!0,C(n)}),!1),c&&(c.running=!1)})))}}(d):B(d),d=null),e)return;let t;if(c)if(c.promises.size||c.queue.size){if(c.running)return c.running=!1,c.effects.push.apply(c.effects,m),m=null,void y(!0)}else{const e=c.sources,n=c.disposed;m.push.apply(m,c.effects),t=c.resolve;for(const e of m)"tState"in e&&(e.state=e.tState),delete e.tState;c=null,N((()=>{for(const e of n)G(e);for(const t of e){if(t.value=t.tValue,t.owned)for(let e=0,n=t.owned.length;es(n)),!1),t&&t()}(n),t}catch(e){n||(m=null),d=null,L(e)}}function B(e){for(let t=0;t=0;t--)G(e.tOwned[t]);delete e.tOwned}$(e,!0)}else if(e.owned){for(t=e.owned.length-1;t>=0;t--)G(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}c&&c.running?e.tState=0:e.state=0}function $(e,t){if(t||(e.tState=0,c.disposed.add(e)),e.owned)for(let t=0;tn=S((()=>(a.context={...a.context,[e]:t.value},A((()=>t.children)))))),void 0),n}}Symbol("fallback");function j(e,t){return S((()=>e(t||{})))}!function(e,t){const n=Symbol("context");H(n)}(),Object.create(null),Object.create(null);const W="_$DX_DELEGATE";function I(e,t,n){let o;const s=()=>{const t=document.createElement("template");return t.innerHTML=e,n?t.content.firstChild.firstChild:t.content.firstChild},r=t?()=>S((()=>document.importNode(o||(o=s()),!0))):()=>(o||(o=s())).cloneNode(!0);return r.cloneNode=r,r}function U(e,t,n){return S((()=>e(t,n)))}function _(e,t,n,o){if(void 0===n||o||(o=[]),"function"!=typeof t)return X(e,t,o,n);v((o=>X(e,t(),o,n)),o)}function Q(t){const n=`$$${t.type}`;let o=t.composedPath&&t.composedPath()[0]||t.target;for(t.target!==o&&Object.defineProperty(t,"target",{configurable:!0,value:o}),Object.defineProperty(t,"currentTarget",{configurable:!0,get:()=>o||document}),e.registry&&!e.done&&(e.done=_$HY.done=!0);o;){const e=o[n];if(e&&!o.disabled){const s=o[`${n}Data`];if(void 0!==s?e.call(o,s,t):e.call(o,t),t.cancelBubble)return}o=o._$host||o.parentNode||o.host}}function X(t,n,o,s,r){if(e.context){!o&&(o=[...t.childNodes]);let e=[];for(let t=0;t{let e=n();for(;"function"==typeof e;)e=e();o=X(t,e,o,s)})),()=>o;if(Array.isArray(n)){const i=[],a=o&&Array.isArray(o);if(Y(i,n,o,r))return v((()=>o=X(t,i,o,s,!0))),()=>o;if(e.context){if(!i.length)return o;for(let e=0;eo-l){const s=t[i];for(;l=0;r--){const i=t[r];if(s!==i){const t=i.parentNode===e;o||r?t&&i.remove():t?e.replaceChild(s,i):e.insertBefore(s,n)}else o=!0}}else e.insertBefore(s,n);return[s]}class Z{constructor(){this.ctx=new AudioContext,this.nodeAnalyser=this.ctx.createAnalyser(),this.nodeAnalyser.fftSize=2048,this.nodeAnalyser.maxDecibels=-20,this.nodeAnalyser.minDecibels=-90,this.nodeAnalyser.smoothingTimeConstant=.8,this.nodeAnalyserData=new Uint8Array(this.nodeAnalyser.frequencyBinCount),this.nodeAnalyserTimeDomainData=new Float32Array(this.nodeAnalyser.frequencyBinCount),this.nodeMicFilter=this.ctx.createBiquadFilter(),this.nodeMicFilter.type="lowpass",this.nodeMicFilter.frequency.value=3e3,this.nodeMicFilter.Q.value=25,this.nodeMicFilter.connect(this.nodeAnalyser),this.nodeFormant1Gain=this.ctx.createGain(),this.nodeFormant1Gain.gain.value=0,this.nodeFormant1Gain.connect(this.nodeAnalyser),this.nodeFormant1Gain.connect(this.ctx.destination),this.nodeFormant1Filter=this.ctx.createBiquadFilter(),this.nodeFormant1Filter.type="bandpass",this.nodeFormant1Filter.frequency.value=0,this.nodeFormant1Filter.Q.value=5,this.nodeFormant1Filter.connect(this.nodeFormant1Gain),this.nodeFormant2Gain=this.ctx.createGain(),this.nodeFormant2Gain.gain.value=0,this.nodeFormant2Gain.connect(this.nodeAnalyser),this.nodeFormant2Gain.connect(this.ctx.destination),this.nodeFormant2Filter=this.ctx.createBiquadFilter(),this.nodeFormant2Filter.type="bandpass",this.nodeFormant2Filter.frequency.value=0,this.nodeFormant2Filter.Q.value=5,this.nodeFormant2Filter.connect(this.nodeFormant2Gain),this.nodeSource=this.ctx.createOscillator(),this.nodeSource.type="sawtooth",this.nodeSource.frequency.value=120,this.nodeSource.connect(this.nodeFormant1Filter),this.nodeSource.connect(this.nodeFormant2Filter),this.nodeSource.start()}resume(){this.ctx.resume()}setGain(e){this.nodeFormant1Gain.gain.value=.25*e,this.nodeFormant2Gain.gain.value=.25*e*.8}setFrequencies(e,t){this.nodeFormant1Filter.frequency.value=e,this.nodeFormant2Filter.frequency.value=t}getAnalyserData(){return this.nodeAnalyser.getByteFrequencyData(this.nodeAnalyserData),this.nodeAnalyserData}getAnalyserTimeData(){return this.nodeAnalyser.getFloatTimeDomainData(this.nodeAnalyserTimeDomainData),this.nodeAnalyserTimeDomainData}async openMic(){if(!this.nodeMicSrc)try{const e=await navigator.mediaDevices.getUserMedia({audio:!0});this.nodeMicSrc=this.ctx.createMediaStreamSource(e),this.nodeMicSrc.connect(this.nodeMicFilter)}catch(e){throw window.alert("Could not open the microphone.\n\n"+e),e}}}const ee=200,te=1200,ne=500,oe=3500,se=I(""),re=10;function ie(e){const t={canvas:void 0,ctx:void 0,synth:e.synth,mouseDown:!1,mousePosNormalized:{x:0,y:0},mousePosFormants:{f1:0,f2:0},mousePath:[]},[n,o]=x(700),[s,r]=x(400);return F((()=>{t.ctx=t.canvas.getContext("2d"),t.canvas.addEventListener("mousedown",(e=>ue(t,e))),window.addEventListener("mousemove",(e=>fe(t,e))),window.addEventListener("mouseup",(e=>he(t,e))),t.canvas.addEventListener("touchstart",(e=>ue(t,e))),window.addEventListener("touchend",(e=>he(t,e))),window.addEventListener("touchcancel",(e=>he(t,e))),window.addEventListener("touchmove",(e=>fe(t,e))),window.requestAnimationFrame((()=>me(t)))})),(()=>{const e=se(),n=t.canvas;return"function"==typeof n?U(n,e):t.canvas=e,e.style.setProperty("width","min(700px, calc(100dvw - 2em))"),e.style.setProperty("height","min(400px, 60dvh)"),e.style.setProperty("border-radius","0.5em"),e})()}function le(e,t){const n=e.canvas.getBoundingClientRect(),[o,s]="touches"in t?[t.touches.item(0)?.clientX??0,t.touches.item(0)?.clientY??0]:[t.clientX,t.clientY],r=(o-n.x)/n.width,i=(s-n.y)/n.height;if(e.mousePosNormalized={x:r,y:i},e.mousePosFormants={f1:Math.floor(ae(i,ee,te)),f2:Math.floor(ae(1-r,ne,oe))},console.log("mouse:","F1 = ",e.mousePosFormants.f1,"Hz","F2 = ",e.mousePosFormants.f2,"Hz"),e.mouseDown)for(e.mousePath.push({...e.mousePosNormalized,timer:1});e.mousePath.length>200;)e.mousePath.splice(0,1);e.synth.setFrequencies(e.mousePosFormants.f1,e.mousePosFormants.f2)}function ae(e,t,n){return t+(n-t)*((Math.pow(re,e)-1)/(re-1))}function ce(e,t,n){const o=(e-t)/(n-t);return Math.log((re-1)*o+1)/Math.log(re)}function ue(e,t){t.preventDefault(),e.mouseDown=!0,e.synth.resume(),e.synth.setGain(1),e.mousePath=[],le(e,t)}function fe(e,t){t.preventDefault(),le(e,t)}function he(e,t){t.preventDefault(),e.mouseDown=!1,e.synth.setGain(0),le(e,t)}const de=[{symbol:"i",f1:255,f2:2890},{symbol:"u",f1:260,f2:593},{symbol:"a",f1:1072,f2:1449},{symbol:"o",f1:500,f2:800},{symbol:"ɔ",f1:664,f2:907},{symbol:"ɛ",f1:709,f2:2105},{symbol:"e",f1:408,f2:2253},{symbol:"ə",f1:600,f2:1200},{symbol:"ɪ",f1:347,f2:2629},{symbol:"ʊ",f1:434,f2:1024},{symbol:"ʌ",f1:731,f2:1127},{symbol:"ɑ",f1:970,f2:984},{symbol:"æ",f1:902,f2:1730},{symbol:"y",f1:252,f2:2120}];function me(e){window.requestAnimationFrame((()=>me(e)));const t=window.devicePixelRatio,n=e.canvas.getBoundingClientRect(),o=Math.round(t*n.right)-Math.round(t*n.left),s=Math.round(t*n.bottom)-Math.round(t*n.top);e.canvas.width=o,e.canvas.height=s;const r=window.matchMedia("(pointer: coarse)").matches;e.ctx.save(),e.ctx.translate(.5,.5),e.ctx.clearRect(0,0,o,s),e.ctx.fillStyle="#eee",e.ctx.fillRect(0,0,o,s),e.ctx.fillStyle="#ccc",e.ctx.beginPath(),e.ctx.moveTo(o,s);for(let t=ne;t<=te;t+=100){const n=o-ce(t,ne,oe)*o,r=ce(t,ee,te)*s;e.ctx.lineTo(n,r)}e.ctx.fill(),e.ctx.lineWidth=1,e.ctx.strokeStyle="#aaa",e.ctx.fillStyle="#aaa",e.ctx.font=(r?"1.5em":"0.75em")+" Times New Roman",e.ctx.fillStyle="#000",e.ctx.textAlign="left",e.ctx.textBaseline="top";for(let t=ne+500;te.timer-=1/30)),e.mouseDown&&(e.ctx.strokeStyle="#048",e.ctx.lineWidth=2,e.ctx.beginPath(),e.ctx.arc(e.mousePosNormalized.x*o,e.mousePosNormalized.y*s,5,0,2*Math.PI),e.ctx.stroke(),e.ctx.font=(r?"1.5em":"0.75em")+" Times New Roman",e.ctx.textAlign="center",e.ctx.textBaseline="bottom",e.ctx.fillText(`(${e.mousePosFormants.f1}, ${e.mousePosFormants.f2} Hz)`,e.mousePosNormalized.x*o,e.mousePosNormalized.y*s+(r?-120:-10))),e.ctx.restore()}function ge(e,t,n){const o=t*t-4*e*n;if(o<0){const n=-t/(2*e),s=Math.sqrt(-o)/(2*e);return[{real:n,imag:s},{real:n,imag:-s}]}{const n=Math.sqrt(o);return[{real:(-t+n)/(2*e),imag:0},{real:(-t-n)/(2*e),imag:0}]}}const pe=I("");function ye(e){let t,n;return F((()=>{n=t.getContext("2d"),window.requestAnimationFrame((()=>ve(e.synth,n)))})),(()=>{const e=pe();return"function"==typeof t?U(t,e):t=e,e.style.setProperty("width","min(700px, calc(100dvw - 2em))"),e.style.setProperty("height","120px"),e.style.setProperty("border-radius","0.5em"),e})()}function xe(e,t){const n=ee-100,o=(e-n)/(oe+500-n);return 10+(t-20)*(Math.log(9*o+1)/Math.log(10))}function ve(e,t){requestAnimationFrame((()=>ve(e,t)));const n=window.devicePixelRatio,o=t.canvas.getBoundingClientRect(),s=Math.round(n*o.right)-Math.round(n*o.left),r=Math.round(n*o.bottom)-Math.round(n*o.top);t.canvas.width=s,t.canvas.height=r;const i=e.getAnalyserData();t.save(),t.translate(.5,.5),t.fillStyle="#eee",t.fillRect(0,0,s,r),t.lineWidth=1,t.strokeStyle="#aaa",t.fillStyle="#aaa",t.font="0.75em Times New Roman",t.fillStyle="#000",t.textAlign="left",t.textBaseline="top";for(let e=ne+500;e<=oe;e+=500){const n=Math.floor(xe(e,s));t.beginPath(),t.moveTo(n,0),t.lineTo(n,r),t.stroke(),t.fillText(e+" Hz",n+2,2)}t.lineWidth=2,t.strokeStyle="#f20",t.beginPath();for(let n=0;noe+500)break;const l=r-i[n]/255*r,a=xe(o,s);t.moveTo(a,r),t.lineTo(a,l)}t.stroke();const l=e.getAnalyserTimeData();t.lineWidth=2,t.strokeStyle="#000",t.beginPath(),t.moveTo(0,r/2);for(let e=0;e3;){const i=e.length;n[i-1]=1,n[i-2]=1;let l=100;for(;Math.abs(n[i-1])+Math.abs(n[i-2])>1e-6&&l>0;){l--,n[0]=e[0],n[1]=e[1]+s*n[0];for(let t=2;tt*function(e,t){const n=25/46;return n-(1-n)*Math.cos(2*Math.PI*e/t)}(n,e.length)))))).filter((e=>e.imag>=0)),o=n.map((e=>Math.atan2(e.imag,e.real))),s=o.map((e=>e*(t/(2*Math.PI)))),r=n.map((e=>{return t/(2*Math.PI)*-.5*Math.log((n=e,Math.sqrt(n.real*n.real+n.imag*n.imag)));var n})),i=[];for(let e=0;ee-t)),i}(l,e.ctx.sampleRate);t.lineWidth=2,t.strokeStyle="#02f",t.globalAlpha=.75,t.beginPath();for(let e=0;e

Click and drag to synthesize vowel sounds via formant frequencies.

The blue bars on the bottom chart shows formant frequencies extracted from the waveform data. (Not working properly)



\n \n}\n\n\nSolidWeb.render(\n Page,\n document.getElementById(\"app\")!)"],"names":["context","undefined","registry","setHydrateContext","signalOptions","Symbol","equals","a","b","ERROR","runEffects","runQueue","STALE","PENDING","UNOWNED","owned","cleanups","owner","Owner","Transition","Scheduler","ExternalSourceFactory","Listener","Updates","Effects","ExecCount","transPending","setTransPending","value","options","s","observers","observerSlots","comparator","Object","assign","readSignal","bind","running","sources","has","tValue","writeSignal","fn","c","createComputation","push","updateComputation","runUserEffects","SuspenseContext","id","defaultValue","suspense","render","user","tState","listener","onMount","children","memo","resolveChildren","toArray","Array","isArray","runningTransition","this","state","updates","runUpdates","lookUpstream","sSlot","length","sourceSlots","node","isComp","current","TransitionRunning","add","i","o","disposed","pure","markDownstream","Error","cleanNode","time","runComputation","queueMicrotask","nextValue","err","tOwned","forEach","updatedAt","handleError","init","track","trigger","ordinary","dispose","triggerInTransition","done","l","Promise","resolve","then","t","Set","effects","promises","queue","res","startTransition","inTransition","x","runTop","inFallback","ancestors","top","prev","wait","item","tasks","delete","scheduleQueue","size","apply","e","d","v","len","completeUpdates","userLength","count","slice","ignore","source","pop","index","obs","n","runErrors","fns","f","error","cause","castError","results","result","createProvider","props","createComponent","Comp","createContext","create","$$EVENTS","template","html","isCE","isSVG","document","createElement","innerHTML","content","firstChild","importNode","cloneNode","use","element","arg","insert","parent","accessor","marker","initial","insertExpression","eventHandler","key","type","composedPath","target","defineProperty","configurable","get","_$HY","handler","disabled","data","call","cancelBubble","_$host","parentNode","host","unwrapArray","childNodes","cleaned","nodeType","remove","multi","toString","createTextNode","cleanChildren","textContent","array","currentArray","normalizeIncomingArray","appendNodes","bLength","aEnd","bEnd","aStart","bStart","after","nextSibling","map","insertBefore","Map","set","sequence","replaceChild","reconcileArrays","appendChild","console","warn","normalized","unwrap","dynamic","String","replacement","inserted","el","isParent","VowelSynth","constructor","ctx","AudioContext","nodeAnalyser","createAnalyser","fftSize","maxDecibels","minDecibels","smoothingTimeConstant","nodeAnalyserData","Uint8Array","frequencyBinCount","nodeAnalyserTimeDomainData","Float32Array","nodeMicFilter","createBiquadFilter","frequency","Q","connect","nodeFormant1Gain","createGain","gain","destination","nodeFormant1Filter","nodeFormant2Gain","nodeFormant2Filter","nodeSource","createOscillator","start","resume","setGain","setFrequencies","formant1Freq","formant2Freq","getAnalyserData","getByteFrequencyData","getAnalyserTimeData","getFloatTimeDomainData","openMic","nodeMicSrc","stream","navigator","mediaDevices","getUserMedia","audio","createMediaStreamSource","window","alert","f1Min","f1Max","f2Min","f2Max","logScale","VowelChart","canvas","synth","mouseDown","mousePosNormalized","y","mousePosFormants","f1","f2","mousePath","width","setWidth","Solid","height","setHeight","getContext","addEventListener","ev","mouseMove","mouseUp","requestAnimationFrame","draw","_el$","_tmpl$","_ref$","_$use","style","setProperty","updateMousePos","rect","getBoundingClientRect","clientX","clientY","touches","Math","floor","mapViewToValue","Data","log","timer","splice","min","max","pow","mapValueToView","p","preventDefault","ipaVowels","symbol","pixelRatio","devicePixelRatio","w","round","right","left","h","bottom","isMobile","matchMedia","matches","save","translate","clearRect","fillStyle","fillRect","beginPath","moveTo","freq","lineTo","fill","lineWidth","strokeStyle","font","textAlign","textBaseline","stroke","fillText","vowel","pA","pB","vecX","vecY","vecMagn","sqrt","vecXN","vecYN","crossSize","arc","PI","restore","solveQuadratic","det","real","imag","detSqrRoot","AnalysisChart","canvasCtx","xMargin","freqData","sampleRate","timeData","formants","sample","samplingFrequency","roots","coeff","r","budget","abs","findRoots","numCoeffs","j","ak","ek","k","lambda","temp","forwardLinearPrediction","preemphasisFilter","nMax","a0","cos","hammingWindow","filter","angles","atan2","frequencies","bandwidths","sort","extractFormants","globalAlpha","code","disposer","detachedOwner","unowned","root","updateFn","SolidWeb","_el$10","_el$11","_el$12","_$insert","_$createComponent","$$click","getElementById","eventNames","name","_$delegateEvents"],"sourceRoot":""} \ No newline at end of file