audio-inspect
Version:
Lightweight yet powerful audio analysis library
1 lines • 57.4 kB
JavaScript
var w=class e extends Error{name="AudioInspectError";code;cause;details;constructor(r,n,t,a){super(n,{cause:t}),this.code=r,this.cause=t,this.details=a,Error.captureStackTrace&&Error.captureStackTrace(this,e)}};function O(){if(typeof performance<"u"&&performance.now)return performance.now();if(typeof process<"u"&&process.hrtime){let[e,r]=process.hrtime();return e*1e3+r/1e6}return Date.now()}function Xe(e){return Array.isArray(e)}function z(e,r="mix"){if(e.numberOfChannels<=0)throw new w("INVALID_INPUT","No channels available");let n=Array.from({length:e.numberOfChannels},(o,i)=>i),t;if(r==="mix")t=n;else{if(r==="all")throw new w("INVALID_INPUT",'Channel selector "all" is not supported for scalar results; use "mix" or a single channel index');if(Xe(r)){if(r.length===0)throw new w("INVALID_INPUT","Channel selection array cannot be empty");if(r.length>1)throw new w("INVALID_INPUT",'Multi-channel selector arrays are not supported for scalar results; use "mix" or a single channel index');t=r.slice()}else if(typeof r=="number"){if(!Number.isInteger(r))throw new w("INVALID_INPUT",`Invalid channel number: ${r}`);t=[r]}else throw new w("INVALID_INPUT",`Invalid channel selector: ${String(r)}`)}for(let o of t){if(o<0||o>=e.numberOfChannels)throw new w("INVALID_INPUT",`Invalid channel number: ${o}`);if(!e.channelData[o])throw new w("INVALID_INPUT",`Channel ${o} data does not exist`)}if(t.length===1){let o=t[0];return e.channelData[o]}let a=new Float32Array(e.length);for(let o=0;o<e.length;o++){let i=0;for(let s of t){let l=e.channelData[s];l&&o<l.length&&(i+=l[o])}a[o]=i/t.length}return a}function Ye(e){return Number.isInteger(e)&&e>0&&(e&e-1)===0}function $(e){if(!Number.isFinite(e)||e<=1)return 1;if(Ye(e))return e;let r=1;for(;r<e&&r<Number.MAX_SAFE_INTEGER;)r*=2;return r}function ue(e,r,n){return r<0||r>=e.length?n:e[r]??n}function k(e,r=1,n=-1/0){return!Number.isFinite(e)||!Number.isFinite(r)||e<=0||r<=0?n:20*Math.log10(e/r)}function B(e,r=1,n=-1/0){return!Number.isFinite(e)||!Number.isFinite(r)||e<=0||r<=0?n:10*Math.log10(e/r)}function Je(e){if(![2,4,8].includes(e))throw new w("INVALID_INPUT","Oversampling factor must be 2, 4, or 8. Sinc interpolation quality is not guaranteed for other values.")}function j(e,r={}){if(e.length===0)return 0;let{factor:n=4,interpolation:t="cubic"}=r;Je(n);let a=0;if(n<=1||e.length===1){for(let i=0;i<e.length;i++){let s=Math.abs(e[i]);s>a&&(a=s)}return a}if(t==="sinc"){let i=l=>{if(Math.abs(l)<1e-10)return 1;let c=Math.PI*l;return Math.abs(l)<3?3*Math.sin(c/3)*Math.sin(c)/(c*c):0},s=(e.length-1)*n+1;for(let l=0;l<s;l++){let c=l/n,m=0;for(let u=-3;u<=3;u++){let h=Math.floor(c)+u;h>=0&&h<e.length&&(m+=e[h]*i(c-h))}let f=Math.abs(m);f>a&&(a=f)}return a}for(let i=0;i<e.length-1;i++){let s=e[i],l=e[i+1],c=s,m=l;t==="cubic"&&(c=e[Math.max(0,i-1)],m=e[Math.min(e.length-1,i+2)]);for(let f=0;f<n;f++){let u=f/n,h=t==="linear"?s+(l-s)*u:.5*(2*s+(-c+l)*u+(2*c-5*s+4*l-m)*u*u+(-c+3*s-3*l+m)*u*u*u),b=Math.abs(h);b>a&&(a=b)}}let o=Math.abs(e[e.length-1]);return o>a&&(a=o),a}var fe=Object.freeze([Object.freeze([.001708984375,.010986328125,-.0196533203125,.033203125,-.0594482421875,.1373291015625,.97216796875,-.102294921875,.047607421875,-.026611328125,.014892578125,-.00830078125]),Object.freeze([-.0291748046875,.029296875,-.0517578125,.089111328125,-.16650390625,.465087890625,.77978515625,-.2003173828125,.1015625,-.0582275390625,.0330810546875,-.0189208984375]),Object.freeze([-.0189208984375,.0330810546875,-.0582275390625,.1015625,-.2003173828125,.77978515625,.465087890625,-.16650390625,.089111328125,-.0517578125,.029296875,-.0291748046875]),Object.freeze([-.00830078125,.014892578125,-.026611328125,.047607421875,-.102294921875,.97216796875,.1373291015625,-.0594482421875,.033203125,-.0196533203125,.010986328125,.001708984375])]);function et(e){if(e!==2&&e!==4)throw new w("INVALID_INPUT","BS.1770 true peak supports oversampling factor 2 or 4")}function tt(e){let r=0;for(let n=0;n<e.length;n++){let t=Math.abs(e[n]);t>r&&(r=t)}return r}function nt(e,r){let n=fe[0];if(!n||n.length===0)return 0;let t=n.length,a=new Float64Array(t),o=0,i=0;for(let s=0;s<e.length;s++){a[o]=e[s];for(let l of r){let c=fe[l];if(!c)continue;let m=0;for(let u=0;u<t;u++){let h=o-u;h<0&&(h+=t),m+=a[h]*c[u]}let f=Math.abs(m);f>i&&(i=f)}o=(o+1)%t}return i}function he(e,r={}){if(e.length===0)return 0;let n=r.factor??4;et(n);let t=tt(e),o=nt(e,n===2?[0,2]:[0,1,2,3]);return o>t&&(t=o),t}function pe(e,r,n=!1){let t=[],a=e.length;if(a<3)return t;for(let o=1;o<a-1;o++){let i=Math.abs(e[o]),s=Math.abs(e[o-1]),l=Math.abs(e[o+1]);if(i>s&&i>l&&i>r){let c={position:o,amplitude:i};n&&(c.prominence=rt(e,o,i)),t.push(c)}}return t}function rt(e,r,n){let t=n;for(let o=r-1;o>=0;o--){let i=Math.abs(e[o]);if(i>n)break;t=Math.min(t,i)}let a=n;for(let o=r+1;o<e.length;o++){let i=Math.abs(e[o]);if(i>n)break;a=Math.min(a,i)}return n-Math.max(t,a)}function at(e,r={}){let{count:n=100,threshold:t=.1,channel:a="mix",minDistance:o=Math.floor(e.sampleRate/100)}=r;if(n<=0)throw new w("INVALID_INPUT","Peak count must be a positive integer");if(t<0||t>1)throw new w("INVALID_INPUT","Threshold must be in the range [0, 1]");let i=z(e,a);if(i.length===0)return{peaks:[],maxAmplitude:0,averageAmplitude:0};let s=pe(i,t);if(s.length===0)return{peaks:[],maxAmplitude:0,averageAmplitude:0};s.sort((u,h)=>h.amplitude-u.amplitude);let l=[],c=[];for(let u of s){if(l.length>=n)break;let h=u.position-o,b=u.position+o;c.some(([d,F])=>!(b<d||h>F))||(l.push({position:u.position,time:u.position/e.sampleRate,amplitude:u.amplitude}),c.push([h,b]))}l.sort((u,h)=>u.position-h.position);let m=s.length>0?s[0]?.amplitude??0:0,f=s.length>0?s.reduce((u,h)=>u+h.amplitude,0)/s.length:0;return{peaks:l,maxAmplitude:m,averageAmplitude:f}}var X=-1/0;function Y(e,r={}){if(typeof r!="object"||r===null||Array.isArray(r))throw new w("INVALID_INPUT","RMS options must be an object");let n={channel:r.channel??"mix",asDB:r.asDB??!1,reference:r.reference??1,truePeak:r.truePeak??!1,oversamplingFactor:r.oversamplingFactor??4,interpolation:r.interpolation??"cubic"},t=z(e,n.channel);if(t.length===0)return n.asDB?X:0;let a=0,o=0;for(let s=0;s<t.length;s++){let l=t[s];Number.isFinite(l)&&(a+=l*l,o++)}if(o===0)return n.asDB?X:0;let i=Math.sqrt(a/o);return n.asDB?k(i,n.reference):i}function Q(e,r={}){let n={channel:r.channel??"mix",asDB:r.asDB??!1,reference:r.reference??1,truePeak:r.truePeak??!1,oversamplingFactor:r.oversamplingFactor??4,interpolation:r.interpolation??"cubic"},t=z(e,n.channel);if(t.length===0)return n.asDB?X:0;let a;if(n.truePeak)a=j(t,{factor:n.oversamplingFactor,interpolation:n.interpolation});else{a=0;for(let o=0;o<t.length;o++)a=Math.max(a,Math.abs(t[o]))}return n.asDB?k(a,n.reference):a}function ot(e,r="mix"){let n=z(e,r);if(n.length<2)return 0;let t=0;for(let a=1;a<n.length;a++){let o=n[a-1],i=n[a];(o>=0&&i<0||o<0&&i>=0)&&t++}return t/(n.length-1)}function it(e,r={}){let{framesPerSecond:n=60,channel:t="mix",method:a="rms"}=r,o=z(e,t),i=Math.ceil(e.duration*n),s=e.length>0?e.length:i>0?1:0,l=Math.min(i,s),c=l>0?Math.max(1,Math.floor(e.length/l)):0,m=[],f=0,u=0;for(let b=0;b<l;b++){let p=b*c,d=Math.min(p+c,o.length);if(d<=p){let S=m.length>0?ue(m,m.length-1,{time:0,amplitude:0}).amplitude:0;m.push({time:(p+c/2)/e.sampleRate,amplitude:S});continue}let F=o.subarray(p,d),y;switch(a){case"peak":y=be(F);break;case"average":y=ge(F);break;case"rms":default:y=de(F);break}let g=(p+(d-p)/2)/e.sampleRate;m.push({time:g,amplitude:y}),f=Math.max(f,y),u+=y}let h=l>0?u/l:0;return{waveform:m,maxAmplitude:f,averageAmplitude:h,frameCount:l,samplesPerFrame:c}}function de(e){if(e.length===0)return 0;let r=0;for(let n=0;n<e.length;n++){let t=e[n];r+=t*t}return Math.sqrt(r/e.length)}function be(e){let r=0;for(let n=0;n<e.length;n++){let t=Math.abs(e[n]);r=Math.max(r,t)}return r}function ge(e){if(e.length===0)return 0;let r=0;for(let n=0;n<e.length;n++)r+=Math.abs(e[n]);return r/e.length}function st(e,r={}){let n=O(),{framesPerSecond:t=60,channel:a="mix",method:o="rms",onProgress:i}=r;i?.(0,"Starting waveform analysis");let s=z(e,a),l=Math.ceil(e.duration*t),c=e.length>0?e.length:l>0?1:0,m=Math.min(l,c),f=m>0?Math.max(1,Math.floor(e.length/m)):0;i?.(25,"Frame configuration complete");let u=new Float32Array(m),h=new Float32Array(m),b=0,p=0;i?.(50,"Starting amplitude calculation");for(let y=0;y<m;y++){let g=y*f,S=Math.min(g+f,s.length);if(S<=g){let I=y>0?u[y-1]:0;u[y]=I,h[y]=(g+f/2)/e.sampleRate;continue}let x=s.subarray(g,S),A;switch(o){case"peak":A=be(x);break;case"average":A=ge(x);break;case"rms":default:A=de(x);break}if(u[y]=A,h[y]=(g+(S-g)/2)/e.sampleRate,b=Math.max(b,A),p+=A,y%Math.max(1,Math.floor(m/20))===0){let I=50+y/m*45;i?.(Math.round(I),`Processing frame ${y+1}/${m}`)}}let d=m>0?p/m:0,F=O()-n;return i?.(100,"Processing complete"),{amplitudes:u,timestamps:h,frameCount:m,samplesPerFrame:f,framesPerSecond:t,maxAmplitude:b,averageAmplitude:d,sampleRate:e.sampleRate,duration:e.duration,processingTime:F}}function lt(e,r={}){let n=O(),{count:t=100,threshold:a=.1,channel:o="mix",minDistance:i=Math.floor(e.sampleRate/100),onProgress:s}=r;if(s?.(0,"Starting peaks analysis"),t<=0)throw new w("INVALID_INPUT","Peak count must be a positive integer");if(a<0||a>1)throw new w("INVALID_INPUT","Threshold must be in the range [0, 1]");let l=z(e,o);if(l.length===0)return{positions:new Float32Array(0),amplitudes:new Float32Array(0),times:new Float32Array(0),maxAmplitude:0,averageAmplitude:0,count:0,sampleRate:e.sampleRate,duration:e.duration,processingTime:O()-n};s?.(25,"Detecting peak candidates");let c=pe(l,a);if(c.length===0)return{positions:new Float32Array(0),amplitudes:new Float32Array(0),times:new Float32Array(0),maxAmplitude:0,averageAmplitude:0,count:0,sampleRate:e.sampleRate,duration:e.duration,processingTime:O()-n};s?.(50,"Sorting peaks"),c.sort((y,g)=>g.amplitude-y.amplitude),s?.(75,"Selecting peaks");let m=[],f=[];for(let y of c){if(m.length>=t)break;let g=y.position-i,S=y.position+i;f.some(([A,I])=>!(S<A||g>I))||(m.push({position:y.position,time:y.position/e.sampleRate,amplitude:y.amplitude}),f.push([g,S]))}m.sort((y,g)=>y.position-g.position);let u=new Float32Array(m.length),h=new Float32Array(m.length),b=new Float32Array(m.length);for(let y=0;y<m.length;y++){let g=m[y];g&&(u[y]=g.position,h[y]=g.amplitude,b[y]=g.time)}let p=c.length>0?c[0]?.amplitude??0:0,d=c.length>0?c.reduce((y,g)=>y+g.amplitude,0)/c.length:0,F=O()-n;return s?.(100,"Processing complete"),{positions:u,amplitudes:h,times:b,maxAmplitude:p,averageAmplitude:d,count:m.length,sampleRate:e.sampleRate,duration:e.duration,processingTime:F}}function ct(e,r={}){let n=O(),{channel:t="mix",asDB:a=!1,reference:o=1,onProgress:i}=r,s=typeof t=="number"?t:-1;i?.(0,"Starting RMS analysis");let l=z(e,t);if(l.length===0)return{value:a?-1/0:0,channel:s,sampleRate:e.sampleRate,duration:e.duration,processingTime:O()-n};i?.(50,"Computing RMS value");let c=0,m=0;for(let h=0;h<l.length;h++){let b=l[h];Number.isFinite(b)&&(c+=b*b,m++)}if(m===0){let h=a?-1/0:0,b=O()-n;return i?.(100,"Processing complete"),a?{value:h,channel:s,sampleRate:e.sampleRate,duration:e.duration,processingTime:b}:{value:h,valueDB:-1/0,channel:s,sampleRate:e.sampleRate,duration:e.duration,processingTime:b}}let f=Math.sqrt(c/m),u=O()-n;return i?.(100,"Processing complete"),a?{value:k(f,o),channel:s,sampleRate:e.sampleRate,duration:e.duration,processingTime:u}:{value:f,valueDB:k(f,o),channel:s,sampleRate:e.sampleRate,duration:e.duration,processingTime:u}}function ye(e,r){let n=new Float32Array(e/2+1),t=r/e;for(let a=0;a<n.length;a++)n[a]=a*t;return n}var J=class{constructor(r,n,t=!1){this.size=r;this.sampleRate=n;this.enableProfiling=t;this.complexInput=new Float32Array(this.size*2),this.frequencyBins=ye(this.size,this.sampleRate),this.initializationPromise=this.initializeWebFFT()}fftInstance=null;initializationPromise=null;complexInput;frequencyBins;get name(){return"WebFFT"}async waitForInitialization(){this.initializationPromise&&await this.initializationPromise}async initializeWebFFT(){try{let n=(await import("webfft")).default;this.fftInstance=new n(this.size),this.enableProfiling&&this.fftInstance?.profile&&await this.fftInstance.profile()}catch(r){throw new w("UNSUPPORTED_FORMAT",`Failed to initialize WebFFT: ${r instanceof Error?r.message:String(r)}`)}}async fft(r){if(this.initializationPromise&&await this.initializationPromise,!this.fftInstance)throw new w("UNSUPPORTED_FORMAT","WebFFT initialization failed");if(r.length!==this.size)throw new w("INVALID_INPUT",`Invalid input size. Expected: ${this.size}, Actual: ${r.length}`);for(let o=0;o<this.size;o++)this.complexInput[o*2]=r[o],this.complexInput[o*2+1]=0;let n=this.fftInstance.fft(this.complexInput),t=new Float32Array(this.size/2+1),a=new Float32Array(this.size/2+1);for(let o=0;o<t.length;o++){let i=n[o*2],s=n[o*2+1];t[o]=Math.sqrt(i*i+s*s),a[o]=Math.atan2(s,i)}return{complex:n,magnitude:t,phase:a,frequencies:this.frequencyBins}}async profile(){if(this.initializationPromise&&await this.initializationPromise,!this.fftInstance||!this.fftInstance.profile)throw new w("UNSUPPORTED_FORMAT","WebFFT is not initialized");await this.fftInstance.profile()}dispose(){if(this.fftInstance)try{this.fftInstance.dispose&&this.fftInstance.dispose()}catch(r){console.warn("FFT instance disposal failed:",r)}finally{this.fftInstance=null,this.initializationPromise=null}}},ee=class{constructor(r,n){this.size=r;this.sampleRate=n;if(!this.isPowerOfTwo(r))throw new w("INVALID_INPUT","FFT size must be a power of two");this.precomputeTables()}bitReversalTable;twiddleFactorsReal;twiddleFactorsImag;scratchReal;scratchImag;frequencyBins;get name(){return"Native FFT (Cooley-Tukey)"}isPowerOfTwo(r){return r>0&&(r&r-1)===0}precomputeTables(){this.bitReversalTable=new Uint32Array(this.size);let r=Math.log2(this.size);for(let t=0;t<this.size;t++){let a=0;for(let o=0;o<r;o++)a=a<<1|t>>o&1;this.bitReversalTable[t]=a}let n=this.size/2;this.twiddleFactorsReal=new Float32Array(n),this.twiddleFactorsImag=new Float32Array(n);for(let t=0;t<n;t++){let a=-2*Math.PI*t/this.size;this.twiddleFactorsReal[t]=Math.cos(a),this.twiddleFactorsImag[t]=Math.sin(a)}this.scratchReal=new Float32Array(this.size),this.scratchImag=new Float32Array(this.size),this.frequencyBins=ye(this.size,this.sampleRate)}fft(r){if(r.length!==this.size)throw new w("INVALID_INPUT",`Invalid input size. Expected: ${this.size}, Actual: ${r.length}`);let n=this.scratchReal,t=this.scratchImag;for(let s=0;s<this.size;s++){let l=this.bitReversalTable[s];n[l]=r[s],t[l]=0}for(let s=1;s<this.size;s*=2){let l=s*2,c=this.size/l;for(let m=0;m<this.size;m+=l)for(let f=0;f<s;f++){let u=f*c,h=this.twiddleFactorsReal[u],b=this.twiddleFactorsImag[u],p=m+f,d=m+f+s,F=n[p],y=t[p],g=n[d],S=t[d],x=g*h-S*b,A=g*b+S*h;n[p]=F+x,t[p]=y+A,n[d]=F-x,t[d]=y-A}}let a=new Float32Array(this.size*2),o=new Float32Array(this.size/2+1),i=new Float32Array(this.size/2+1);for(let s=0;s<this.size;s++)if(a[s*2]=n[s],a[s*2+1]=t[s],s<=this.size/2){let l=n[s],c=t[s];o[s]=Math.sqrt(l*l+c*c),i[s]=Math.atan2(c,l)}return{complex:a,magnitude:o,phase:i,frequencies:this.frequencyBins}}dispose(){this.scratchReal=new Float32Array(0),this.scratchImag=new Float32Array(0),this.bitReversalTable=new Uint32Array(0),this.twiddleFactorsReal=new Float32Array(0),this.twiddleFactorsImag=new Float32Array(0),this.frequencyBins=new Float32Array(0)}},K=class{static async createProvider(r){switch(r.type){case"webfft":{let n=new J(r.fftSize,r.sampleRate,r.enableProfiling);return await n.waitForInitialization(),n}case"native":return new ee(r.fftSize,r.sampleRate);case"custom":if(!r.customProvider)throw new w("INVALID_INPUT","Custom provider is not specified");return r.customProvider;default:{let n=r.type;throw new w("UNSUPPORTED_FORMAT",`Unsupported FFT provider: ${String(n)}`)}}}static getAvailableProviders(){return["webfft","native"]}};function mt(e){let r=e.provider??"native",n=e.enableProfiling?1:0,t=e.fallbackToNative?1:0;return`${r}|${e.fftSize}|${e.sampleRate}|${n}|${t}`}var te=class{providers=new Map;async getOrCreate(r){let n=mt(r),t=this.providers.get(n);if(t)return t;let a=await Fe(r);return this.providers.set(n,a),a}clear(){for(let r of this.providers.values())r.dispose();this.providers.clear()}},ut=new te;async function E(e){let{cache:r,useSharedCache:n=!1,...t}=e,a=r??(n?ut:void 0);if(a)return{provider:await a.getOrCreate(t),release:()=>{}};let o=await Fe(t);return{provider:o,release:()=>{o.dispose()}}}async function Fe(e){let{fftSize:r,sampleRate:n,provider:t="native",enableProfiling:a=!1,fallbackToNative:o=t==="webfft",resolver:i=K}=e,s=o&&t!=="native"?[t,"native"]:[t],l;for(let c of s)try{return await i.createProvider({type:c,fftSize:r,sampleRate:n,enableProfiling:a})}catch(m){l=m}throw new w("INITIALIZATION_FAILED","Failed to create FFT provider",l)}function we(e){return e==="none"?"rectangular":e}function ft(e,r,n){let t=n?.kaiserBeta??8.6,a=n?.tukeyAlpha??.5;return`${r}|${e}|${t}|${a}`}function Ae(e){let r=1,n=1,t=e*e/4;for(let a=1;a<50&&(n*=t/(a*a),r+=n,!(n<1e-10*r));a++);return r}function ht(e,r,n){if(!Number.isInteger(e)||e<0)throw new w("INVALID_INPUT",`Invalid window length: ${e}`);if(e===0)return new Float32Array(0);let t=new Float32Array(e);if(e===1||r==="rectangular")return t.fill(1),t;switch(r){case"hann":{for(let a=0;a<e;a++)t[a]=.5*(1-Math.cos(2*Math.PI*a/(e-1)));return t}case"hamming":{for(let a=0;a<e;a++)t[a]=.54-.46*Math.cos(2*Math.PI*a/(e-1));return t}case"blackman":{for(let a=0;a<e;a++)t[a]=.42-.5*Math.cos(2*Math.PI*a/(e-1))+.08*Math.cos(4*Math.PI*a/(e-1));return t}case"bartlett":{for(let a=0;a<e;a++)t[a]=1-Math.abs((a-(e-1)/2)/((e-1)/2));return t}case"kaiser":{let a=n?.kaiserBeta??8.6,o=Ae(a);for(let i=0;i<e;i++){let s=2*i/(e-1)-1;t[i]=Ae(a*Math.sqrt(1-s*s))/o}return t}case"tukey":{let a=n?.tukeyAlpha??.5;if(a<=0)return t.fill(1),t;if(a>=1){for(let i=0;i<e;i++)t[i]=.5*(1-Math.cos(2*Math.PI*i/(e-1)));return t}let o=a*(e-1)/2;for(let i=0;i<e;i++)i<o?t[i]=.5*(1+Math.cos(Math.PI*(2*i/(a*(e-1))-1))):i<=(e-1)*(1-a/2)?t[i]=1:t[i]=.5*(1+Math.cos(Math.PI*(2*i/(a*(e-1))-2/a+1)));return t}default:throw new w("INVALID_INPUT",`Unknown window type: ${String(r)}`)}}var ne=class{cache=new Map;getOrCreate(r,n,t){let a=we(n),o=ft(r,a,t),i=this.cache.get(o);if(i)return i;let s=ht(r,a,t);return this.cache.set(o,s),s}clear(){this.cache.clear()}},Se=new ne;function H(e,r,n){return Se.getOrCreate(e,r,n)}function L(e){let{src:r,srcStart:n,frameLength:t,dst:a,windowType:o,windowParams:i,cache:s=Se}=e;if(a.fill(0),a.length===0||t<=0||n>=r.length)return a;let l=Math.max(0,n),c=Math.min(t,a.length),m=Math.max(0,Math.min(c,r.length-l));if(m===0)return a;let f=we(o);if(f==="rectangular"||c===1)return a.set(r.subarray(l,l+m),0),a;let u=s.getOrCreate(c,f,i);for(let h=0;h<m;h++)a[h]=r[l+h]*u[h];return a}var re=new WeakMap;function pt(e){return Array.isArray(e)?`[${e.map(r=>String(r)).join(",")}]`:String(e)}function dt(e){return[e.fftSize,e.windowFunction,pt(e.channel),e.provider,e.enableProfiling?1:0,e.normalization].join("|")}function Me(e,r){if(!Number.isInteger(e)||e<=0||(e&e-1)!==0)throw new w("INVALID_INPUT",`${r} must be a power of two`)}function ae(e,r){if(!Number.isInteger(e)||e<=0)throw new w("INVALID_INPUT",`${r} must be a positive integer`)}function xe(e,r,n){if(!Number.isFinite(r)||!Number.isFinite(n)||r<0)throw new w("INVALID_INPUT",`Invalid frequency range: min=${r}, max=${n}`);let t=e/2;if(r>=n||n>t)throw new w("INVALID_INPUT",`Frequency range must satisfy 0 <= min < max <= Nyquist (${t})`)}function Ie(e,r,n){let t=e.findIndex(i=>i>=r);t<0&&(t=0);let a=e.findIndex(i=>i>n),o=a===-1?e.length:a;return t>=o?{startIndex:0,endIndex:0}:{startIndex:t,endIndex:o}}function bt(e,r){if(r<=1||e==="none")return 1;let n=H(r,e),t=0;for(let o=0;o<n.length;o++)t+=n[o]??0;let a=t/r;return a>0?a:1}function ve(e,r,n,t){if(r==="none")return e;if(n<=0||e.length===0)return e.fill(0),e;let a=bt(t,n),o=n*a;if(o<=0)return e.fill(0),e;let i=1/o,s=i*2,l=e.length-1;for(let c=0;c<e.length;c++){let m=c===0||c===l?i:s;e[c]=(e[c]??0)*m}return e}function Te(e,r){if(r==="amplitude")return e.slice();let n=new Float32Array(e.length);for(let t=0;t<e.length;t++)n[t]=k(e[t]??0,1);return n}function gt(e,r,n){return e===0?0:e<r?1:Math.floor((e-r)/n)+1}function Pe(e,r){if(e==="dbfs"&&r!=="amplitude")throw new w("INVALID_INPUT",'scale="dbfs" requires normalization="amplitude"')}async function V(e,r={}){let{fftSize:n=2048,windowFunction:t="hann",channel:a="mix",provider:o="native",enableProfiling:i=!1,providerCache:s,normalization:l="amplitude"}=r;Me(n,"FFT size");let c=dt({fftSize:n,windowFunction:t,channel:a,provider:o,enableProfiling:i,normalization:l}),m=re.get(e);m||(m=new Map,re.set(e,m));let f=m.get(c);if(f)return f;let u=(async()=>{let b=z(e,a),p=new Float32Array(n),d=Math.min(b.length,n);L({src:b,srcStart:0,frameLength:d,dst:p,windowType:t});let{provider:F,release:y}=await E({fftSize:n,sampleRate:e.sampleRate,provider:o,enableProfiling:i,fallbackToNative:o==="webfft",cache:s});try{let g=await F.fft(p),S=new Float32Array(g.magnitude);return ve(S,l,d,t),{...g,magnitude:S,fftSize:n,windowFunction:t,providerName:F.name,normalization:l}}finally{y()}})();m.set(c,u);let h=()=>{m.delete(c),m.size===0&&re.delete(e)};return u.then(h,h),u}async function yt(e,r={}){let{fftSize:n=2048,minFrequency:t=0,maxFrequency:a=e.sampleRate/2,scale:o="dbfs",normalization:i="amplitude",...s}=r;xe(e.sampleRate,t,a),Pe(o,i);let l=await V(e,{...s,fftSize:n,normalization:i}),{startIndex:c,endIndex:m}=Ie(l.frequencies,t,a),f=l.frequencies.slice(c,m),u=l.magnitude.slice(c,m);return{frequencies:f,values:Te(u,o),scale:o}}async function Ft(e,r={}){let{fftSize:n=2048,frameSize:t=n,hopSize:a=Math.max(1,Math.floor(t/2)),maxFrames:o,minFrequency:i=0,maxFrequency:s=e.sampleRate/2,scale:l="dbfs",normalization:c="amplitude",windowFunction:m="hann",channel:f="mix",provider:u="native",enableProfiling:h=!1,providerCache:b}=r;if(Me(n,"FFT size"),ae(t,"frameSize"),ae(a,"hopSize"),t>n)throw new w("INVALID_INPUT","frameSize must be <= fftSize");o!==void 0&&ae(o,"maxFrames"),xe(e.sampleRate,i,s),Pe(l,c);let p=z(e,f),d=gt(p.length,t,a),F=o===void 0?d:Math.min(d,o);if(F===0)return{times:new Float32Array(0),frequencies:new Float32Array(0),frames:[],frameCount:0,frequencyBins:0,scale:l,latest:new Float32Array(0)};let y=new Float32Array(F),g=new Array(F),S=new Float32Array(n),x=new Float32Array(0),A=0,I=0,{provider:C,release:R}=await E({fftSize:n,sampleRate:e.sampleRate,provider:u,enableProfiling:h,fallbackToNative:u==="webfft",cache:b});try{for(let M=0;M<F;M++){let v=M*a,T=Math.min(t,Math.max(0,p.length-v));L({src:p,srcStart:v,frameLength:T,dst:S,windowType:m});let D=await C.fft(S),q=new Float32Array(D.magnitude);if(ve(q,c,T,m),M===0){let _=Ie(D.frequencies,i,s);A=_.startIndex,I=_.endIndex,x=D.frequencies.slice(A,I)}let N=q.slice(A,I);g[M]=Te(N,l),y[M]=(v+t/2)/e.sampleRate}}finally{R()}let P=g[g.length-1]??new Float32Array(x.length);return{times:y,frequencies:x,frames:g,frameCount:g.length,frequencyBins:x.length,scale:l,latest:P}}function ke(e,r,n,t){let a=0,o=0;for(let i=0;i<e.length&&i<r.length;i++){let s=r[i],l=e[i];s>=n&&s<=t&&(a+=s*l,o+=l)}return o>1e-10?a/o:0}function Ne(e,r,n,t,a){let o=0,i=0;for(let s=0;s<e.length&&s<r.length;s++){let l=r[s],c=e[s];if(l>=t&&l<=a){let m=l-n;o+=m*m*c,i+=c}}return i>1e-10?Math.sqrt(o/i):0}function qe(e,r,n,t,a){let o=0;for(let l=0;l<e.length&&l<r.length;l++){let c=r[l],m=e[l];c>=t&&c<=a&&(o+=m*m)}let i=o*n,s=0;for(let l=0;l<e.length&&l<r.length;l++){let c=r[l],m=e[l];if(c>=t&&c<=a&&(s+=m*m,s>=i))return c}return a}function Oe(e,r,n){let t=0,a=0,o=0;for(let i=r;i<=n&&i<e.length;i++){let s=Math.max(e[i],1e-10);t+=Math.log(s),a+=s,o++}return o===0?0:(t=Math.exp(t/o),a=a/o,a>1e-10?t/a:0)}function Ee(e){if(e.length<2)return 0;let r=0;for(let n=1;n<e.length;n++){let t=e[n-1],a=e[n];(t>=0&&a<0||t<0&&a>=0)&&r++}return r/(e.length-1)}function At(e,r,n={normalize:!0}){if(!r||r.length===0)return 0;let t=Math.min(e.length,r.length);if(t===0)return 0;if(n.normalize!==!1){let o=0,i=0;for(let c=0;c<t;c++){let m=e[c],f=r[c];o+=m*m,i+=f*f}let s=Math.sqrt(o),l=Math.sqrt(i);if(s>1e-10&&l>1e-10){let c=1/s,m=1/l,f=0;for(let u=0;u<t;u++){let h=e[u]*c-r[u]*m;f+=h*h}return Math.sqrt(f)}}let a=0;for(let o=0;o<t;o++){let i=e[o]-r[o];a+=i*i}return Math.sqrt(a)}async function wt(e,r={}){let{fftSize:n=2048,windowFunction:t="hann",channel:a="mix",provider:o="native",enableProfiling:i=!1,providerCache:s,minFrequency:l=0,maxFrequency:c=e.sampleRate/2,rolloffThreshold:m=.85}=r,f=z(e,a),u=await V(e,{fftSize:n,windowFunction:t,channel:a,provider:o,enableProfiling:i,providerCache:s}),h=Math.max(0,Math.floor(l*n/e.sampleRate)),b=Math.min(u.frequencies.length-1,Math.floor(c*n/e.sampleRate)),p=ke(u.magnitude,u.frequencies,l,c),d=Ne(u.magnitude,u.frequencies,p,l,c),F=qe(u.magnitude,u.frequencies,m,l,c),y=Oe(u.magnitude,h,b),g=Ee(f);return{spectralCentroid:p,spectralBandwidth:d,spectralRolloff:F,spectralFlatness:y,spectralFlux:0,zeroCrossingRate:g,frequencyRange:{min:l,max:c}}}async function St(e,r={}){let{frameSize:n=2048,hopSize:t=n/2,fftSize:a=n,windowFunction:o="hann",channel:i="mix",provider:s="native",enableProfiling:l=!1,providerCache:c,minFrequency:m=0,maxFrequency:f=e.sampleRate/2,rolloffThreshold:u=.85,numFrames:h}=r,b=z(e,i),p=Math.floor((b.length-n)/t)+1,d=h??(b.length>0?Math.max(1,p):0);if(d<=0||b.length===0)throw new w("INVALID_INPUT","Invalid frame count");let F=new Float32Array(d),y=new Float32Array(d),g=new Float32Array(d),S=new Float32Array(d),x=new Float32Array(d),A=new Float32Array(d),I=new Float32Array(d),C=new Float32Array(a),R,{provider:P,release:M}=await E({fftSize:a,sampleRate:e.sampleRate,provider:s,enableProfiling:l,fallbackToNative:s==="webfft",cache:c});try{for(let v=0;v<d;v++){let T=v*t,D=Math.min(T+n,b.length);F[v]=T/e.sampleRate;let q=b.subarray(T,D);L({src:b,srcStart:T,frameLength:Math.min(n,Math.max(0,b.length-T)),dst:C,windowType:o});let N=await P.fft(C),_=Math.max(0,Math.floor(m*a/e.sampleRate)),Z=Math.min(N.frequencies.length-1,Math.floor(f*a/e.sampleRate)),U=ke(N.magnitude,N.frequencies,m,f);y[v]=U,g[v]=Ne(N.magnitude,N.frequencies,U,m,f),S[v]=qe(N.magnitude,N.frequencies,u,m,f),x[v]=Oe(N.magnitude,_,Z),I[v]=Ee(q),A[v]=At(N.magnitude,R),R=new Float32Array(N.magnitude)}}finally{M()}return{times:F,spectralCentroid:y,spectralBandwidth:g,spectralRolloff:S,spectralFlatness:x,spectralFlux:A,zeroCrossingRate:I,frameInfo:{frameSize:n,hopSize:t,numFrames:d}}}function Mt(e,r,n){let t=[],a=0;for(let c=r;c<=n&&c<e.length;c++){let m=e[c];if(m!==void 0){let f=m*m;t.push(f),a+=f}}if(t.length===0||a<=1e-10)return{entropy:0,entropyNorm:0};let o=t.map(c=>c/a),i=0;for(let c of o)c>1e-10&&(i-=c*Math.log2(c));let s=Math.log2(t.length),l=s>0?i/s:0;return{entropy:i,entropyNorm:l}}function xt(e,r,n){let t=0,a=0,o=0;for(let l=r;l<=n&&l<e.length;l++){let c=e[l];c!==void 0&&(t=Math.max(t,c),a+=c,o++)}if(o===0)return{crest:0,peak:0,average:0};let i=a/o;return{crest:i>1e-10?t/i:0,peak:t,average:i}}async function It(e,r={}){let{fftSize:n=2048,windowFunction:t="hann",channel:a="mix",provider:o="native",enableProfiling:i=!1,providerCache:s,minFrequency:l=0,maxFrequency:c=e.sampleRate/2}=r,m=await V(e,{fftSize:n,windowFunction:t,channel:a,provider:o,enableProfiling:i,providerCache:s}),f=Math.max(0,Math.floor(l*n/e.sampleRate)),u=Math.min(m.frequencies.length-1,Math.floor(c*n/e.sampleRate)),{entropy:h,entropyNorm:b}=Mt(m.magnitude,f,u);return{entropy:h,entropyNorm:b,frequencyRange:{min:l,max:c}}}async function vt(e,r={}){let{fftSize:n=2048,windowFunction:t="hann",channel:a="mix",provider:o="native",enableProfiling:i=!1,providerCache:s,minFrequency:l=0,maxFrequency:c=e.sampleRate/2,asDB:m=!1}=r,f=await V(e,{fftSize:n,windowFunction:t,channel:a,provider:o,enableProfiling:i,providerCache:s}),u=Math.max(0,Math.floor(l*n/e.sampleRate)),h=Math.min(f.frequencies.length-1,Math.floor(c*n/e.sampleRate)),{crest:b,peak:p,average:d}=xt(f.magnitude,u,h),F={crest:b,peak:p,average:d,frequencyRange:{min:l,max:c}};return m&&(F.crestDB=k(b,1)),F}var Re=new Map,Ce=new Map;function Tt(e,r,n,t,a){return`${e}|${r}|${n}|${t}|${a}`}function Pt(e,r,n,t,a){return`${e}|${r}|${n}|${t}|${a??"auto"}`}function De(e){return 2595*Math.log10(1+e/700)}function ze(e){return 700*(Math.pow(10,e/2595)-1)}function Le(e,r,n,t,a){let o=Tt(e,r,n,t,a),i=Re.get(o);if(i)return i;let s=[],l=n/2,c=Math.floor(r/2)+1,m=De(t),f=De(a),u=new Array(e+2);for(let d=0;d<e+2;d++)u[d]=m+(f-m)*d/(e+1);let h=new Float32Array(e),b=u.map(d=>{let F=ze(d);return Math.floor(F/l*(c-1))});for(let d=1;d<=e;d++){let F=new Float32Array(c),y=b[d-1],g=b[d],S=b[d+1];if(y===void 0||g===void 0||S===void 0)continue;let x=u[d];x!==void 0&&(h[d-1]=ze(x));for(let A=y;A<=S;A++)A<0||A>=c||A>=F.length||(A<g?g-y>0&&(F[A]=(A-y)/(g-y)):S-g>0&&(F[A]=(S-A)/(S-g)));s.push(F)}let p={filters:s,centerFrequencies:h};return Re.set(o,p),p}function oe(e,r,n,t){let a=n.frameSizeMs??25,o=n.hopSizeMs??10,i=Math.round(a/1e3*e.sampleRate),s=Math.round(o/1e3*e.sampleRate),l=n.fftSize??Math.max(1024,$(i));if(i<=0||s<=0)throw new w("INVALID_INPUT","Frame size or hop size is too small");if(l<=0||(l&l-1)!==0)throw new w("INVALID_INPUT","FFT size must be a power of two");let c=Math.floor((r-i)/s)+1,m=r>0?Math.max(1,c):0;if(m<=0)throw new w("INSUFFICIENT_DATA","Invalid frame count");return{frameSizeMs:a,hopSizeMs:o,frameSizeSamples:i,hopSizeSamples:s,fftSize:l,windowFunction:n.windowFunction??t,channel:n.channel??"mix",numFrames:m}}function Be(e){let r=e??2;if(!Number.isFinite(r)||r<=0)throw new w("INVALID_INPUT","power must be a positive finite number");return r}function _e(e,r){let n=new Float32Array(e.length);if(r===1)return n.set(e),n;if(r===2){for(let t=0;t<e.length;t++){let a=e[t];n[t]=a*a}return n}for(let t=0;t<e.length;t++){let a=e[t];n[t]=Math.pow(a,r)}return n}function Ve(e,r,n){let t=new Float32Array(r.length);for(let a=0;a<r.length;a++){let o=r[a];if(!o)continue;let i=0;for(let s=0;s<o.length&&s<e.length;s++)i+=e[s]*o[s];t[a]=Math.max(i,n)}return t}function Rt(e,r,n,t,a){let o=Pt(e,r,n,t,a),i=Ce.get(o);if(i)return i;let s=r/2,l=r/e,c=Math.floor(e/2);if(!Number.isFinite(n)||n<=0)throw new w("INVALID_INPUT","fMin must be a positive number");if(!Number.isFinite(t)||t<=0)throw new w("INVALID_INPUT","binsPerOctave must be a positive number");if(a!==void 0&&(!Number.isFinite(a)||a<=0))throw new w("INVALID_INPUT","numBins must be a positive number");let m=Math.max(1,Math.floor(t*Math.log2(s/n))),f=Math.min(a??m,m),u=1/(2*t),h=[];for(let b=0;b<f;b++){let p=n*Math.pow(2,b/t);if(p<=0||p>=s)break;let d=Math.max(0,p*Math.pow(2,-u)),F=Math.min(s,p*Math.pow(2,u)),y=Math.max(1,Math.floor(d/l)),g=Math.min(c,Math.ceil(F/l));g<y||h.push({centerFrequency:p,lowerFrequency:d,upperFrequency:F,startIndex:y,endIndex:g})}if(h.length===0)throw new w("INVALID_INPUT","Failed to build CQT frequency bins. Review fMin/numBins settings.");return Ce.set(o,h),h}function Ct(e,r,n,t,a,o){let i=1/(2*a),s=0,l=0;for(let f=r.startIndex;f<=r.endIndex;f++){let u=f*n/t;if(u<=0)continue;let h=Math.abs(Math.log2(u/r.centerFrequency));if(h>i)continue;let b=1-h/i,p=e[f],d=o===1?p:o===2?p*p:Math.pow(p,o);s+=d*b,l+=b}if(l>1e-10)return s/l;let c=Math.min(Math.floor(r.centerFrequency*t/n),e.length-1),m=c>=0?e[c]:0;return o===1?m:o===2?m*m:Math.pow(m,o)}function Dt(e,r){let n=e.length,t=new Array(r);for(let a=0;a<r;a++){let o=0;for(let s=0;s<n;s++){let l=e[s];l!==void 0&&(o+=l*Math.cos(Math.PI*a*(s+.5)/n))}let i=Math.sqrt(a===0?1/n:2/n);t[a]=o*i}return t}function ie(e,r){let n=new Float32Array(e.length);if(e.length===0)return n;n[0]=e[0];for(let t=1;t<e.length;t++)n[t]=e[t]-r*e[t-1];return n}async function zt(e,r={}){let{numMelFilters:n=80,minFrequency:t=0,maxFrequency:a=e.sampleRate/2,preEmphasis:o=.97,provider:i="native",enableProfiling:s=!1,providerCache:l,power:c,logScale:m=!0,logEpsilon:f=1e-10}=r,u=Be(c),h=z(e,r.channel??"mix"),b=ie(h,o),p=oe(e,b.length,r,"hamming"),d=Le(n,p.fftSize,e.sampleRate,t,a),F=[],y=new Float32Array(p.numFrames),g=new Float32Array(p.fftSize),{provider:S,release:x}=await E({fftSize:p.fftSize,sampleRate:e.sampleRate,provider:i,enableProfiling:s,fallbackToNative:i==="webfft",cache:l});try{for(let A=0;A<p.numFrames;A++){let I=A*p.hopSizeSamples;y[A]=I/e.sampleRate,L({src:b,srcStart:I,frameLength:Math.min(p.frameSizeSamples,Math.max(0,b.length-I)),dst:g,windowType:p.windowFunction});let C=await S.fft(g),R=_e(C.magnitude,u),P=Ve(R,d.filters,f),M=new Array(P.length);for(let v=0;v<P.length;v++){let T=P[v];M[v]=m?Math.log(Math.max(T,f)):T}F.push(M)}}finally{x()}return{melSpectrogram:F,times:y,melFrequencies:d.centerFrequencies,frameInfo:{frameSizeMs:p.frameSizeMs,hopSizeMs:p.hopSizeMs,numFrames:p.numFrames,numBins:d.filters.length},frequencyRange:{min:t,max:a}}}async function kt(e,r={}){let{fMin:n=32.70319566257483,binsPerOctave:t=12,numBins:a,preEmphasis:o=.97,provider:i="native",enableProfiling:s=!1,providerCache:l,power:c,logScale:m=!0,logEpsilon:f=1e-10}=r,u=Be(c),h=z(e,r.channel??"mix"),b=ie(h,o),p=oe(e,b.length,r,"hann"),d=Rt(p.fftSize,e.sampleRate,n,t,a),F=new Float32Array(d.length);for(let I=0;I<d.length;I++)F[I]=d[I].centerFrequency;let y=[],g=new Float32Array(p.numFrames),S=new Float32Array(p.fftSize),{provider:x,release:A}=await E({fftSize:p.fftSize,sampleRate:e.sampleRate,provider:i,enableProfiling:s,fallbackToNative:i==="webfft",cache:l});try{for(let I=0;I<p.numFrames;I++){let C=I*p.hopSizeSamples;g[I]=C/e.sampleRate,L({src:b,srcStart:C,frameLength:Math.min(p.frameSizeSamples,Math.max(0,b.length-C)),dst:S,windowType:p.windowFunction});let R=await x.fft(S),P=new Array(d.length);for(let M=0;M<d.length;M++){let v=d[M];if(!v)continue;let T=Ct(R.magnitude,v,e.sampleRate,p.fftSize,t,u);P[M]=m?Math.log(Math.max(T,f)):T}y.push(P)}}finally{A()}return{cqt:y,times:g,frequencies:F,frameInfo:{frameSizeMs:p.frameSizeMs,hopSizeMs:p.hopSizeMs,numFrames:p.numFrames,numBins:F.length,binsPerOctave:t},frequencyRange:{min:d[0]?.lowerFrequency??n,max:d[d.length-1]?.upperFrequency??e.sampleRate/2}}}function Nt(e,r){return e.map((n,t)=>{if(r===0)return n;let a=1+r/2*Math.sin(Math.PI*t/r);return n*a})}async function We(e,r={}){let{numMelFilters:n=40,numMfccCoeffs:t=13,minFrequency:a=0,maxFrequency:o=e.sampleRate/2,preEmphasis:i=.97,lifterCoeff:s=22,provider:l="native",enableProfiling:c=!1,providerCache:m}=r,f=z(e,r.channel??"mix"),u=ie(f,i),h=oe(e,u.length,r,"hamming"),b=Le(n,h.fftSize,e.sampleRate,a,o),p=[],d=new Float32Array(h.numFrames),F=new Float32Array(h.fftSize),{provider:y,release:g}=await E({fftSize:h.fftSize,sampleRate:e.sampleRate,provider:l,enableProfiling:c,fallbackToNative:l==="webfft",cache:m});try{for(let S=0;S<h.numFrames;S++){let x=S*h.hopSizeSamples;d[S]=x/e.sampleRate,L({src:u,srcStart:x,frameLength:Math.min(h.frameSizeSamples,Math.max(0,u.length-x)),dst:F,windowType:h.windowFunction});let A=await y.fft(F),I=_e(A.magnitude,2),C=Ve(I,b.filters,1e-10),R=new Array(C.length);for(let v=0;v<C.length;v++)R[v]=Math.log(Math.max(C[v],1e-10));let P=Dt(R,t),M=Nt(P,s);p.push(M)}}finally{g()}return{mfcc:p,times:d,frameInfo:{frameSizeMs:h.frameSizeMs,hopSizeMs:h.hopSizeMs,numFrames:h.numFrames,numCoeffs:t},frequencyRange:{min:a,max:o}}}function qt(e,r=2){let n=e.length,t=e[0]?.length||0,a=[],o=[];for(let i=0;i<n;i++){let s=[];for(let l=0;l<t;l++){let c=0,m=0;for(let f=-r;f<=r;f++){let u=Math.max(0,Math.min(n-1,i+f)),h=e[u]?.[l]||0;c+=f*h,m+=f*f}s[l]=m>0?c/m:0}a.push(s)}for(let i=0;i<n;i++){let s=[];for(let l=0;l<t;l++){let c=0,m=0;for(let f=-r;f<=r;f++){let u=Math.max(0,Math.min(n-1,i+f)),h=a[u]?.[l]||0;c+=f*h,m+=f*f}s[l]=m>0?c/m:0}o.push(s)}return{delta:a,deltaDelta:o}}async function Ot(e,r={}){let{deltaWindowSize:n=2,computeDelta:t=!0,computeDeltaDelta:a=!0,...o}=r,i=await We(e,o),s={...i};if(t||a){let l=qt(i.mfcc,n);t&&(s.delta=l.delta),a&&(s.deltaDelta=l.deltaDelta)}return s}function W(e,r){let{samples:n,frameSize:t,hopSize:a,sampleRate:o,padEnd:i=!0}=e;if(!Number.isInteger(t)||t<=0)throw new w("INVALID_INPUT","frameSize must be a positive integer");if(!Number.isInteger(a)||a<=0)throw new w("INVALID_INPUT","hopSize must be a positive integer");if(!Number.isFinite(o)||o<=0)throw new w("INVALID_INPUT","sampleRate must be positive");if(n.length===0)return 0;let s=new Float32Array(t),l=0,c=0;for(;c<n.length||l===0&&i;){let m=Math.min(c+t,n.length),f=Math.max(0,m-c);if(f<t&&!i&&l>0||(s.fill(0),f>0&&s.set(n.subarray(c,m),0),r({frame:s,frameIndex:l,startSample:c,timeSec:(c+t/2)/o}),l+=1,c+=a,!i&&c+t>n.length)||f<t&&i)break}return l}function Et(e,r){let n=0;for(let t=0;t<e.length;t++){let a=e[t],o=r?a*r[t]:a;n+=o*o}return n}function Lt(e,r={}){let{frameSize:n=Math.floor(e.sampleRate*.025),hopSize:t=Math.floor(e.sampleRate*.01),channel:a="mix",normalized:o=!1,windowFunction:i="rectangular"}=r;if(!Number.isInteger(n)||n<=0)throw new w("INVALID_INPUT","frameSize must be a positive integer");if(!Number.isInteger(t)||t<=0)throw new w("INVALID_INPUT","hopSize must be a positive integer");let s=z(e,a);if(s.length===0)return{times:new Float32Array(0),energies:new Float32Array(0),totalEnergy:0,statistics:{mean:0,std:0,max:0,min:0}};let l=i==="rectangular"||i==="none"?null:H(n,i),c=[],m=[],f=0,u=-1/0,h=1/0;W({samples:s,frameSize:n,hopSize:t,sampleRate:e.sampleRate,padEnd:!0},({frame:S,timeSec:x})=>{let A=Et(S,l);c.push(x),m.push(A),f+=A,u=Math.max(u,A),h=Math.min(h,A)});let b=new Float32Array(m),p=new Float32Array(c),d=b.length,F=d>0?f/d:0,y=0;for(let S=0;S<d;S++){let x=b[S]-F;y+=x*x}let g=d>0?Math.sqrt(y/d):0;if(o&&f>1e-10){for(let S=0;S<b.length;S++)b[S]=b[S]/f;return{times:p,energies:b,totalEnergy:1,statistics:{mean:F/f,std:g/f,max:u/f,min:h/f}}}return{times:p,energies:b,totalEnergy:f,statistics:{mean:F,std:g,max:Number.isFinite(u)?u:0,min:Number.isFinite(h)?h:0}}}var Ue=new Map;function Bt(e){if(e<=0||!isFinite(e))throw new w("INVALID_INPUT","Sample rate must be a positive finite value");if(e<8e3||e>384e3)throw new w("UNSUPPORTED_FORMAT",`Sample rate ${e} Hz is not supported`)}function _t(e){Bt(e);let r=Ue.get(e);if(r)return r;let n=20.598997,t=107.65265,a=737.86223,o=12194.217,i=1.9997,s=[],l=2*e*Math.tan(Math.PI*n/e),c=2*e*Math.tan(Math.PI*t/e),m=2*e*Math.tan(Math.PI*a/e),f=2*e*Math.tan(Math.PI*o/e),u=Math.pow(10,i/20);{let p=l,d=p*p,F=Math.SQRT2,y=4*e*e+2*F*p*e+d,g=2*(d-4*e*e)/y,S=(4*e*e-2*F*p*e+d)/y;s.push({b0:4*e*e*u/y,b1:-8*e*e*u/y,b2:4*e*e*u/y,a0:1,a1:g,a2:S})}{let p=c,d=2*e+p,F=(p-2*e)/d;s.push({b0:2*e/d,b1:-2*e/d,b2:0,a0:1,a1:F,a2:0})}{let p=m,d=2*e+p,F=(p-2*e)/d;s.push({b0:2*e/d,b1:-2*e/d,b2:0,a0:1,a1:F,a2:0})}{let p=f,d=p*p,F=Math.SQRT2,y=4*e*e+2*F*p*e+d,g=2*(d-4*e*e)/y,S=(4*e*e-2*F*p*e+d)/y;s.push({b0:d/y,b1:2*d/y,b2:d/y,a0:1,a1:g,a2:S})}let b=1/Vt(s,1e3,e).magnitude;return s.forEach(p=>{p.b0*=b,p.b1*=b,p.b2*=b}),Ue.set(e,s),s}function Vt(e,r,n){let t=2*Math.PI*r/n,a=1,o=0;for(let l of e){let c=Math.cos(t),m=Math.sin(t),f=Math.cos(2*t),u=Math.sin(2*t),h=l.b0+l.b1*c+l.b2*f,b=-l.b1*m-l.b2*u,p=l.a0+l.a1*c+l.a2*f,d=-l.a1*m-l.a2*u,F=p*p+d*d;if(F===0)throw new w("INVALID_INPUT","Division by zero occurred while calculating frequency response");let y=(h*p+b*d)/F,g=(b*p-h*d)/F,S=a*y-o*g,x=a*g+o*y;a=S,o=x}let i=Math.sqrt(a*a+o*o),s=Math.atan2(o,a);return{magnitude:i,phase:s}}function Wt(e,r,n={x1:0,x2:0,y1:0,y2:0}){let{x1:t,x2:a,y1:o,y2:i}=n;for(let s=0;s<e.length;s++){let l=e[s],c=r.b0*l+r.b1*t+r.b2*a-r.a1*o-r.a2*i;e[s]=c,a=t,t=l,i=o,o=c}n.x1=t,n.x2=a,n.y1=o,n.y2=i}function se(e,r){let n=_t(r),t=e.slice();for(let a of n)Wt(t,a);return t}function $e(e,r,n="simple"){if(e.length===0)return{peak:0,rms:0,cfDb:-1/0,cfLinear:0};let a=e;n==="weighted"&&(a=se(e,r));let o=0,i=0;for(let m=0;m<a.length;m++){let f=a[m],u=Math.abs(f);o=Math.max(o,u),i+=f*f}if(a.length===0)return{peak:0,rms:0,cfDb:-1/0,cfLinear:0};let s=Math.sqrt(i/a.length);if(o<1e-10&&s<1e-10)return{peak:0,rms:0,cfDb:-1/0,cfLinear:0};if(s<1e-10)return{peak:o,rms:s,cfDb:-1/0,cfLinear:0};let l=o/s,c=k(l,1);return{peak:o,rms:s,cfDb:c,cfLinear:l}}function Ut(e,r={}){let{channel:t="mix",windowSize:a,hopSize:o,method:i="simple"}=r,s,l;if(i==="weighted"){let u=z(e,t),h=se(u,e.sampleRate),b=0,p=0;for(let d=0;d<h.length;d++){let F=h[d],y=Math.abs(F);b=Math.max(b,y),p+=F*F}s=b,l=h.length>0?Math.sqrt(p/h.length):0}else{let u={channel:t,asDB:!1};s=Q(e,u),l=Y(e,u)}let c,m;s<1e-10&&l<1e-10||l<1e-10?(c=0,m=-1/0):(c=s/l,m=k(c,1));let f;if(typeof a=="number"&&typeof o=="number"){if(a<=0||o<=0)throw new w("INVALID_INPUT","windowSize and hopSize must be positive values");o>a&&console.warn("[audio-inspect] hopSize is larger than windowSize, so gaps will occur between analysis windows");let u=Math.floor(a*e.sampleRate),h=Math.floor(o*e.sampleRate);if(u===0||h===0)throw new w("INVALID_INPUT","Window size is too small for the sample rate");let b=z(e,t),p=b.length;if(p<u){let d=$e(b,e.sampleRate,i);f={times:new Float32Array([e.duration/2]),values:new Float32Array([d.cfDb]),valuesLinear:new Float32Array([d.cfLinear]),peaks:new Float32Array([d.peak]),rmsValues:new Float32Array([d.rms])}}else{let d=Math.floor((p-u)/h)+1,F=new Float32Array(d),y=new Float32Array(d),g=new Float32Array(d),S=new Float32Array(d),x=new Float32Array(d);for(let A=0;A<d;A++){let I=A*h,C=Math.min(I+u,p),R=b.subarray(I,C),P=$e(R,e.sampleRate,i);F[A]=(I+u/2)/e.sampleRate,y[A]=P.cfDb,g[A]=P.cfLinear,S[A]=P.peak,x[A]=P.rms}f={times:F,values:y,valuesLinear:g,peaks:S,rmsValues:x}}}return{crestFactor:m,crestFactorLinear:c,peak:s,rms:l,timeVarying:f}}function $t(e){let r=2*Math.PI,n=(e+Math.PI)%r;return n<0&&(n+=r),n-Math.PI}async function G(e,r,n,t,a){let o=a??new Float32Array(n);return L({src:e,srcStart:r,frameLength:Math.min(n,Math.max(0,e.length-r)),dst:o,windowType:"hann"}),t.fft(o)}function jt(e,r,n=44){let t=Math.min(e.length,r.length),a=-1/0,o=0;for(let i=-n;i<=n;i++){let s=0,l=0;for(let c=0;c<t;c++){let m=c+i;if(m>=0&&m<t){let f=e[c],u=r[m];s+=f*u,l++}}l>0&&(s/=l,s>a&&(a=s,o=i))}return o}function je(e,r,n){let t=Math.min(e.length,r.length),a=n?new Float32Array(t):void 0,o=n?new Float32Array(t):void 0;if(t===0)return{correlation:0,width:0,balance:0,midSideRatio:0,energyL:0,energyR:0,mid:a,side:o};let i=0,s=0,l=0,c=0,m=0,f=0,u=0,h=0,b=0;for(let R=0;R<t;R++){let P=e[R],M=r[R];i+=P,s+=M,l+=P*M,c+=P*P,m+=M*M,f+=P*P,u+=M*M;let v=(P+M)*.5,T=(P-M)*.5;h+=v*v,b+=T*T,a&&o&&(a[R]=v,o[R]=T)}let p=i/t,d=s/t,F=l/t-p*d,y=Math.sqrt(Math.max(0,c/t-p*p)),g=Math.sqrt(Math.max(0,m/t-d*d)),S=y>1e-10&&g>1e-10?F/(y*g):0,x=Math.max(-1,Math.min(1,S)),A=h+b>1e-10?b/(h+b):0,I=f+u>1e-10?(u-f)/(f+u):0,C=b>1e-10?B(h/b,1):h>1e-10?1/0:0;return{correlation:x,width:A,balance:I,midSideRatio:C,energyL:f,energyR:u,mid:a,side:o}}async function Qt(e,r,n,t,a){let o=Math.min(e.length,r.length),i=Math.floor(n/2)+1,s=new Float32Array(i),l=new Float32Array(i),c=new Float32Array(i),m=new Float32Array(i),f=new Float32Array(n),u=new Float32Array(n),h=0,b=0;for(;b<o||h===0;){let g=Math.min(b+n,o),[S,x]=await Promise.all([G(e,b,n,a,f),G(r,b,n,a,u)]);for(let A=0;A<i;A++){let I=S.complex[A*2]??0,C=S.complex[A*2+1]??0,R=x.complex[A*2]??0,P=x.complex[A*2+1]??0;s[A]=s[A]+I*R+C*P,l[A]=l[A]+C*R-I*P,c[A]=c[A]+I*I+C*C,m[A]=m[A]+R*R+P*P}if(h++,g>=o)break;b+=t}let p=new Float32Array(i),d=0;for(let g=0;g<i;g++){let S=c[g]*m[g];S>d&&(d=S)}let F=Math.max(1e-10,d*1e-4),y=Math.sqrt(F);for(let g=0;g<i;g++){let S=c[g]*m[g],x=s[g]**2+l[g]**2;if(S<=F){let I=Math.abs(c[g]??0)<=y,C=Math.abs(m[g]??0)<=y;p[g]=I&&C?1:0;continue}let A=x/S;p[g]=Math.min(1,Math.max(0,A))}return p}function Kt(e,r,n,t){let a=new Float32Array(e.length);for(let o=0;o<a.length;o++){let i=e[o],s=r[o],l=n[o],c=t[o],m=l-c,f=Math.abs(i+s)/2,u=Math.abs(i-s)/2,h=Math.abs(Math.sin(m/2)),b=u/(f+u+1e-10);a[o]=Math.max(b,h)}return a}async function Ht(e,r={}){if(e.numberOfChannels<2)throw new w("INVALID_INPUT","Stereo analysis requires audio with at least two channels");let{frameSize:n=Math.min(8192,e.length),calculatePhase:t=!1,calculateITD:a=!1,calculateILD:o=!1,provider:i="native",enableProfiling:s=!1,providerCache:l}=r,c=e.channelData[0],m=e.channelData[1];if(!c||!m)throw new w("INVALID_INPUT","L/R channel data is missing");let f=Math.min(c.length,m.length);if(f===0)return{correlation:0,width:0,balance:0,midSideRatio:0};let u=je(c,m,!0),h={correlation:u.correlation,width:u.width,balance:u.balance,midSideRatio:u.midSideRatio};if(u.side&&u.mid&&(h.goniometer={x:u.side,y:u.mid}),t){let b=Math.max(32,Math.min(n,f)),p=$(b),d=Math.max(1,Math.floor(b/2)),{provider:F,release:y}=await E({fftSize:p,sampleRate:e.sampleRate,provider:i,enableProfiling:s,fallbackToNative:i==="webfft",cache:l});try{let[g,S]=await Promise.all([G(c.subarray(0,b),0,p,F),G(m.subarray(0,b),0,p,F)]);h.coherence=await Qt(c.subarray(0,f),m.subarray(0,f),p,d,F),h.widthFrequency=Kt(g.magnitude,S.magnitude,g.phase,S.phase);let x=0,A=0,I=0;for(let C=1;C<g.phase.length;C++){let R=g.magnitude[C],P=S.magnitude[C],M=R*P;if(M<=0)continue;let v=$t(g.phase[C]-S.phase[C]);x+=v*M,A+=Math.cos(v)*M,I+=M}h.phaseDifference=I>1e-10?x/I*180/Math.PI:0,h.phaseCorrelation=I>1e-10?A/I:0}finally{y()}}if(a){let b=Math.max(1,Math.round(e.sampleRate*.001)),p=jt(c.subarray(0,Math.min(n,f)),m.subarray(0,Math.min(n,f)),b);h.itd=p/e.sampleRate*1e3}if(o){let b=Math.sqrt(u.energyL/f),p=Math.sqrt(u.energyR/f);h.ild=b>1e-10&&p>1e-10?k(p/b,1):0}return h}async function Gt(e,r={}){if(e.numberOfChannels<2)throw new w("INVALID_INPUT","Stereo analysis requires audio with at least two channels");let n=e.channelData[0],t=e.channelData[1];if(!n||!t)throw new w("INVALID_INPUT","L/R channel data is missing");let a=Math.min(n.length,t.length);if(a===0)return{times:new Float32Array(0),correlation:new Float32Array(0),width:new Float32Array(0),balance:new Float32Array(0)};let o=Math.max(32,Math.min(r.windowSize??r.frameSize??2048,a)),i=r.hopSize??Math.max(1,Math.floor(o/2));if(i<=0)throw new w("INVALID_INPUT","hopSize must be a positive integer");let s=a<=o?1:Math.floor((a-o)/i)+1,l=new Float32Array(s),c=new Float32Array(s),m=new Float32Array(s),f=new Float32Array(s);for(let u=0;u<s;u++){let h=u*i,b=Math.min(h+o,a),p=je(n.subarray(h,b),t.subarray(h,b),!1);l[u]=(h+(b-h)/2)/e.sampleRate,c[u]=p.correlation,m[u]=p.width,f[u]=p.balance}return{times:l,correlation:c,width:m,balance:f}}function Zt(e,r=.97){let n=new Float32Array(e.length);if(e.length===0)return n;n[0]=e[0];for(let t=1;t<e.length;t++)n[t]=e[t]-r*e[t-1];return n}function Xt(e,r,n,t,a=!1){let o=[],i=[];return e.length===0?{energies:new Float32Array(0),times:new Float32Array(0)}:(W({samples:e,frameSize:r,hopSize:n,sampleRate:t,padEnd:!0},({frame:s,timeSec:l})=>{let c=0;for(let m=0;m<s.length;m++){let f=s[m];c+=f*f}c/=s.length,o.push(a?B(c,1,-100):c),i.push(l)}),{energies:new Float32Array(o),times:new Float32Array(i)})}function Yt(e,r,n,t=!0){let a=[];return e.length===0?new Float32Array(0):(W({samples:e,frameSize:r,hopSize:n,sampleRate:1,padEnd:!0},({frame:o})=>{let i=0,s=Math.sign(o[0]??0);for(let l=1;l<o.length;l++){let c=Math.sign(o[l]??0);s!==c&&s!==0&&c!==0&&(i+=1),s=c}a.push(t?i/Math.max(1,o.length-1):i)}),new Float32Array(a))}function Jt(e,r,n,t=10){let a=new Float32Array(e.length),o=0,i=Math.min(t,e.length);for(let s=0;s<i;s++)o+=e[s];o=i>0?o/i:0;for(let s=0;s<e.length;s++){let l=e[s];if(s===0)a[s]=o*n;else{let c=a[s-1];c!==void 0&&l<c&&(o=r*o+(1-r)*l),a[s]=o*n}}return a}function en(e,r=5){let n=new Float32Array(e.length),t=Math.floor(r/2);for(let a=0;a<e.length;a++){let o=Math.max(0,a-t),i=Math.min(e.length,a+t+1),s=[];for(let l=o;l<i;l++)s.push(e[l]);if(s.sort((l,c)=>l-c),s.length>0){let l=Math.floor(s.length/2);n[a]=s[l]}else n[a]=0}return n}function tn(e,r,n=.5,t=.1,a=.3){let o=[],i=null;for(let s=0;s<e.length;s++){let l=e[s],c=r[s],m=l>=n;if(!i)i={start:c,end:c,type:m?"speech":"silence",confidence:Math.abs(l-.5)*2};else if(m&&i.type==="speech"||!m&&i.type==="silence"){i.end=c;let f=Math.abs(l-.5)*2;i.confidence=Math.max(i.confidence||0,f)}else o.push(i),i={start:c,end:c,type:m?"speech":"silence",confidence:Math.abs(l-.5)*2}}return i&&o.push(i),nn(o,t,a)}function nn(e,r,n){if(e.length===0)return[];let t=[],a=0;for(;a<e.length;){let o=e[a];if(!o){a++;continue}let i=o.end-o.start;if(o.type==="speech"&&i>=r||o.type==="silence"&&i>=n)t.push(o),a++;else{if(t.length>0&&a+1<e.length){let s=t[t.length-1],l=e[a+1];if(s&&l&&s.type===l.type){s.end=l.end,a+=2;continue}}if(t.length>0){let s=t[t.length-1];s&&(s.end=o.end)}a++}}return t}function rn(e,r={}){let{channel:n="mix",frameSizeMs:t=30,hopSizeMs:a=10,method:o="combined",energyThreshold:i=.02,zcrThresholdLow:s=.05,zcrThresholdHigh:l=.15,adaptiveAlpha:c=.99,noiseFactor:m=3,minSilenceDurationMs:f=300,minSpeechDurationMs:u=100,preEmphasis:h=!0,smoothing:b=!0}=r,p=z(e,n);h&&(p=Zt(p));let d=e.sampleRate,F=Math.floor(t/1e3*d),y=Math.floor(a/1e3*d);if(F===0||y===0)return{segments:[],speechRatio:0};let{energies:g,times:S}=Xt(p,F,y,d,!1),x=Yt(p,F,y,!0);if(g.length===0)return{segments:[],speechRatio:0};let A=new Float32Array(g.length);switch(o){case"energy":{for(let T=0;T<g.length;T++){let D=g[T];A[T]=D>i?1:0}break}case"zcr":{for(let T=0;T<x.length;T++){let D=x[T];A[T]=D>s&&D<l?1:0}break}case"combined":{for(let T=0;T<g.length;T++){let D=g[T],q=x[T],N=D>i?1:0,_=q>s&&q<l?1:0;A[T]=(N+_)/2}break}case"adaptive":{let T=Jt(g,c,m);for(let D=0;D<g.length;D++){let q=g[D],N=x[D],_=T[D],Z=q>_?1:0,U=N>s&&N<l?.5:0;A[D]=Math.min(1,Z+U)}break}}let I=b?en(A,5):A,C=u/1e3,R=f/1e3,P=tn(I,S,.5,C,R),M=0;for(let T of P)T.type==="speech"&&(M+=T.end-T.start);let v=e.duration>0?Math.min(1,M/e.duration):0;return{segments:P,speechRatio:v,features:{energies:g,zcrs:x,decisions:I,times:S}}}var Qe=new Map;function an(e){if(!isFinite(e)||e<=0)throw new w("INVALID_INPUT","Sample rate must be a positive finite value");if(e<8e3||e>384e3)throw new w("UNSUPPORTED_FORMAT",`Sample rate ${e} Hz is not supported`)}function on(e){an(e);let r=Qe.get(e);if(r)return r;let n=[];if(e===48e3)n.push({b0:1.53512485958697,b1:-2.69169618940638,b2:1.19839281085285,a0:1,a1:-1.69065929318241,a2:.73248077421585}),n.push({b0:1,b1:-2,b2:1,a0:1,a1:-1.99004745483398,a2:.99007225036621});else{let t=1681.974450955532,a=3.99984385397,o=.7071752369554193,i=Math.tan(Math.PI*t/