@jadujoel/web-audio-clip-node 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +61 -4
  2. package/dist/audio/ClipNode.js +1 -1
  3. package/dist/audio/processor-code.d.ts +1 -1
  4. package/dist/audio/processor-code.js +1 -1
  5. package/dist/audio/processor-kernel.js +1 -1
  6. package/dist/audio/processor.js +17 -3
  7. package/dist/audio/version.d.ts +1 -1
  8. package/dist/audio/version.js +1 -1
  9. package/dist/audio/workletUrl.js +2 -2
  10. package/dist/components/AudioControl.js +4 -4
  11. package/dist/components/ControlSection.js +1 -1
  12. package/dist/components/DetuneControl.js +2 -2
  13. package/dist/components/FilterControl.js +2 -2
  14. package/dist/components/GainControl.js +2 -2
  15. package/dist/components/PanControl.js +2 -2
  16. package/dist/components/PlaybackRateControl.js +2 -2
  17. package/dist/components/PlayheadSlider.js +2 -2
  18. package/dist/controls/controlDefs.js +3 -0
  19. package/dist/hooks/useClipNode.js +7 -7
  20. package/dist/lib-react.js +14 -14
  21. package/dist/lib.bundle.js +3 -3
  22. package/dist/lib.bundle.js.map +2 -2
  23. package/dist/lib.js +11 -11
  24. package/dist/processor.js +2 -2
  25. package/dist/processor.js.map +3 -3
  26. package/dist/store/clipStore.js +2 -2
  27. package/dist/styles.css.d.ts +3 -0
  28. package/examples/cdn-vanilla/index.html +2 -2
  29. package/examples/esm-bundler/package.json +1 -1
  30. package/examples/index.html +16 -0
  31. package/examples/react/README.md +1 -1
  32. package/examples/react/bun.lock +45 -0
  33. package/examples/react/package.json +1 -1
  34. package/examples/react/src/App.tsx +56 -6
  35. package/examples/react/src/css.d.ts +1 -0
  36. package/examples/react/tsconfig.json +15 -0
  37. package/examples/self-hosted/README.md +4 -4
  38. package/examples/self-hosted/package.json +4 -9
  39. package/examples/self-hosted/public/processor.js +4 -0
  40. package/examples/self-hosted/src/main.ts +1 -3
  41. package/package.json +6 -2
  42. package/examples/esm-bundler/bun.lock +0 -15
package/README.md CHANGED
@@ -43,16 +43,62 @@ clip.start();
43
43
  ## Quick Start (React)
44
44
 
45
45
  ```tsx
46
- import { useClipNode, useClipControls, TransportButtons, AudioControl } from "@jadujoel/web-audio-clip-node/react";
46
+ import {
47
+ GainControl,
48
+ PlaybackRateControl,
49
+ TransportButtons,
50
+ useClipControls,
51
+ useClipNode,
52
+ } from "@jadujoel/web-audio-clip-node/react";
47
53
  import "@jadujoel/web-audio-clip-node/styles.css";
48
54
 
49
55
  function Player() {
50
56
  const controls = useClipControls();
51
- const clip = useClipNode({ ...controls });
57
+ const clip = useClipNode({
58
+ values: controls.values,
59
+ enabled: controls.enabled,
60
+ loop: controls.loop,
61
+ setValue: controls.setValue,
62
+ });
63
+
52
64
  return (
53
65
  <>
54
- <TransportButtons />
55
- <AudioControl />
66
+ <TransportButtons
67
+ nodeState={clip.nodeState}
68
+ onStart={clip.start}
69
+ onStop={clip.stop}
70
+ onPause={clip.pause}
71
+ onResume={clip.resume}
72
+ onDispose={clip.dispose}
73
+ onLog={clip.logState}
74
+ onLoadSound={clip.loadSound}
75
+ />
76
+ <PlaybackRateControl
77
+ value={controls.values.playbackRate}
78
+ defaultValue={1}
79
+ enabled={controls.enabled.playbackRate}
80
+ onChange={(value) => {
81
+ controls.setValue("playbackRate", value);
82
+ clip.applyValue("playbackRate", value);
83
+ }}
84
+ onToggle={(enabled) => {
85
+ controls.setEnabled("playbackRate", enabled);
86
+ clip.applyToggle("playbackRate", enabled);
87
+ }}
88
+ />
89
+ <GainControl
90
+ value={controls.values.gain}
91
+ defaultValue={0}
92
+ enabled={controls.enabled.gain}
93
+ onChange={(value) => {
94
+ controls.setValue("gain", value);
95
+ clip.applyValue("gain", value);
96
+ }}
97
+ onToggle={(enabled) => {
98
+ controls.setEnabled("gain", enabled);
99
+ clip.applyToggle("gain", enabled);
100
+ }}
101
+ />
56
102
  </>
57
103
  );
58
104
  }
@@ -90,6 +136,17 @@ function Player() {
90
136
  | Processor | `@jadujoel/web-audio-clip-node/processor` | Standalone worklet script |
91
137
  | Styles | `@jadujoel/web-audio-clip-node/styles.css` | CSS for React components |
92
138
 
139
+ ## Examples
140
+
141
+ The [`examples/`](examples/) directory contains ready-to-run demos for different setups:
142
+
143
+ | Example | Description | Build step? |
144
+ |---------|-------------|-------------|
145
+ | [cdn-vanilla](examples/cdn-vanilla/) | Pure HTML + `<script type="module">` via jsDelivr CDN | No |
146
+ | [esm-bundler](examples/esm-bundler/) | Vite + TypeScript with `npm install` | Yes |
147
+ | [react](examples/react/) | Vite + React using the built-in hooks & components | Yes |
148
+ | [self-hosted](examples/self-hosted/) | Vite + self-hosted `processor.js` via `getProcessorModuleUrl()` | Yes |
149
+
93
150
  ## License
94
151
 
95
152
  MIT
@@ -1,4 +1,4 @@
1
- import { audioBufferFromFloat32Array } from "./utils";
1
+ import { audioBufferFromFloat32Array } from "./utils.js";
2
2
  export class ClipNode extends AudioWorkletNode {
3
3
  onscheduled;
4
4
  onstarted;
@@ -1 +1 @@
1
- export declare const processorCode = "var z={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var y=128;function i(V=[]){let A=V[0]?.length??0,T=A>0;return{totalLength:T?A:null,committedLength:T?A:0,streamEnded:T,streaming:!1,writtenSpans:T?[{startSample:0,endSample:A}]:[],pendingWrites:[],lowWaterThreshold:y*4,lowWaterNotified:!1,lastUnderrunSample:null}}function M0(V){return V[0]?.length??0}function o(V){return V.streamBuffer.totalLength??M0(V.buffer)}function G0(V,A){return Array.from({length:V},()=>new Float32Array(A))}function E0(V,A){let T=[...V,A].sort((Q,F)=>Q.startSample-F.startSample),J=[];for(let Q of T){let F=J[J.length-1];if(!F||Q.startSample>F.endSample){J.push({...Q});continue}F.endSample=Math.max(F.endSample,Q.endSample)}return J}function I0(V){let A=0;for(let T of V){if(T.startSample>A)break;A=Math.max(A,T.endSample)}return A}function w0(V,A){if(V.committedLength-Math.floor(A)>=V.lowWaterThreshold)V.lowWaterNotified=!1}function R0(V,A,T){let J=M0(V.buffer),Q=V.buffer.length;if(J>=T&&Q>=A)return;let F=Math.max(J,T),U=Math.max(Q,A),Y=G0(U,F);for(let X=0;X<Q;X++)Y[X].set(V.buffer[X].subarray(0,J));if(V.buffer=Y,V.streamBuffer.totalLength==null||V.streamBuffer.totalLength<F)V.streamBuffer.totalLength=F}function B0(V,A){let T=Math.max(Math.floor(A.startSample),0),J=A.channelData[0]?.length??0,Q=A.totalLength??null,F=Math.max(T+J,Q??0);R0(V,Math.max(A.channelData.length,V.buffer.length,1),F);for(let U=0;U<A.channelData.length;U++)V.buffer[U].set(A.channelData[U],T);if(Q!=null)V.streamBuffer.totalLength=Q;if(J>0)V.streamBuffer.writtenSpans=E0(V.streamBuffer.writtenSpans,{startSample:T,endSample:T+J}),V.streamBuffer.committedLength=I0(V.streamBuffer.writtenSpans);if(A.streamEnded===!0)V.streamBuffer.streamEnded=!0;w0(V.streamBuffer,V.playhead)}function _0(V){if(V.streamBuffer.pendingWrites.length===0)return;for(let A of V.streamBuffer.pendingWrites)B0(V,A);V.streamBuffer.pendingWrites=[]}function y0(V,A){V.buffer=A,V.streamBuffer=i(A)}function v0(V={},A){let{buffer:T=[],streamBuffer:J=i(T),duration:Q=-1,loop:F=!1,loopStart:U=0,loopEnd:Y=(T[0]?.length??0)/A,loopCrossfade:X=0,playhead:k=0,offset:H=0,startWhen:$=0,stopWhen:j=0,pauseWhen:P=0,resumeWhen:C=0,playedSamples:N=0,state:K=z.Initial,timesLooped:w=0,fadeInDuration:v=0,fadeOutDuration:Z=0,enableFadeIn:E=v>0,enableFadeOut:O=Z>0,enableLoopStart:R=!0,enableLoopEnd:h=!0,enableLoopCrossfade:b=X>0,enableHighpass:c=!0,enableLowpass:g=!0,enableGain:s=!0,enablePan:r=!0,enableDetune:t=!0,enablePlaybackRate:p=!0}=V;return{buffer:T,streamBuffer:J,loop:F,loopStart:U,loopEnd:Y,loopCrossfade:X,duration:Q,playhead:k,offset:H,startWhen:$,stopWhen:j,pauseWhen:P,resumeWhen:C,playedSamples:N,state:K,timesLooped:w,fadeInDuration:v,fadeOutDuration:Z,enableFadeIn:E,enableFadeOut:O,enableLoopStart:R,enableLoopEnd:h,enableHighpass:c,enableLowpass:g,enableGain:s,enablePan:r,enableDetune:t,enablePlaybackRate:p,enableLoopCrossfade:b}}function b0(V,A){return o(V)/A}function n(V,A){let T=b0(V,A);if(T<=0){V.loopStart=0,V.loopEnd=0;return}if(!Number.isFinite(V.loopStart)||V.loopStart<0)V.loopStart=0;if(V.loopStart>=T)V.loopStart=0;if(!Number.isFinite(V.loopEnd)||V.loopEnd<=V.loopStart||V.loopEnd>T)V.loopEnd=T}function e(V,A,T){if(A===void 0)return V.offset=0,0;if(A<0)return e(V,o(V)+A,T);if(A>(o(V)||1)-1)return e(V,o(V)%A,T);let J=Math.floor(A*T);return V.offset=J,J}function L0(V){let{playhead:A,bufferLength:T,loop:J,loopStartSamples:Q,loopEndSamples:F}=V,U=128;if(!J&&A+128>T)U=Math.max(T-A,0);let Y=Array(U);if(!J){for(let $=0,j=A;$<U;$++,j++)Y[$]=j;let H=A+U;return{playhead:H,indexes:Y,looped:!1,ended:H>=T}}let X=A,k=!1;for(let H=0;H<U;H++,X++){if(X>=F)X=Q+(X-F),k=!0;Y[H]=X}return{indexes:Y,looped:k,ended:!1,playhead:X}}function x0(V){let{playhead:A,bufferLength:T,loop:J,loopStartSamples:Q,loopEndSamples:F,playbackRates:U}=V,Y=128;if(!J&&A+128>T)Y=Math.max(T-A,0);let X=Array(Y),k=A,H=!1;if(J){for(let $=0;$<Y;$++){X[$]=Math.min(Math.max(Math.floor(k),0),T-1);let j=U[$]??U[0]??1;if(k+=j,j>=0&&(k>F||k>T))k=Q,H=!0;else if(j<0&&(k<Q||k<0))k=F,H=!0}return{playhead:k,indexes:X,looped:H,ended:!1}}for(let $=0;$<Y;$++)X[$]=Math.min(Math.max(Math.floor(k),0),T-1),k+=U[$]??U[0]??1;return{playhead:k,indexes:X,looped:!1,ended:k>=T||k<0}}function m0(V,A,T){let J=Math.min(V.length,A.length);for(let Q=0;Q<T.length;Q++)for(let F=0;F<J;F++)V[F][Q]=A[F][T[Q]];for(let Q=J;Q<V.length;Q++)for(let F=0;F<V[Q].length;F++)V[Q][F]=0;for(let Q=T.length;Q<V[0].length;Q++)for(let F=0;F<J;F++)V[F][Q]=0}function d(V){for(let A=0;A<V.length;A++)for(let T=0;T<V[A].length;T++)V[A][T]=0}function S0(V){if(V.length>=2)for(let A=0;A<V[0].length;A++)V[1][A]=V[0][A];else{let A=new Float32Array(V[0].length);for(let T=0;T<V[0].length;T++)A[T]=V[0][T];V.push(A)}}function H0(V,A){for(let T=A.length;T<V.length;T++)A[T]=new Float32Array(V[T].length);for(let T=0;T<V.length;T++)for(let J=0;J<V[T].length;J++)A[T][J]=V[T][J]}function c0(V){let A=0;for(let T=0;T<V.length;T++)for(let J=0;J<V[T].length;J++)if(Number.isNaN(V[T][J]))A++,V[T][J]=0;return A}function V0(){return[{x_1:0,x_2:0,y_1:0,y_2:0},{x_1:0,x_2:0,y_1:0,y_2:0}]}function g0(V,A){if(A.length===1){let J=A[0];if(J===1)return;for(let Q of V)for(let F=0;F<Q.length;F++)Q[F]*=J;return}let T=A[0];for(let J of V)for(let Q=0;Q<J.length;Q++)T=A[Q]??T,J[Q]*=T}function d0(V,A){let T=A[0];for(let J=0;J<V[0].length;J++){T=A[J]??T;let Q=T<=0?1:1-T,F=T>=0?1:1+T;V[0][J]*=Q,V[1][J]*=F}}function h0(V,A,T,J){for(let Q=0;Q<V.length;Q++){let F=V[Q],{x_1:U,x_2:Y,y_1:X,y_2:k}=J[Q]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let H=A[0];if(H>=20000)return;let $=2*Math.PI*H/T,j=Math.sin($)/2,P=(1-Math.cos($))/2,C=1-Math.cos($),N=(1-Math.cos($))/2,K=1+j,w=-2*Math.cos($),v=1-j,Z=P/K,E=C/K,O=N/K,R=w/K,h=v/K;for(let b=0;b<F.length;b++){let c=F[b],g=Z*c+E*U+O*Y-R*X-h*k;Y=U,U=c,k=X,X=g,F[b]=g}}else{let H=A[0];for(let $=0;$<F.length;$++){let j=A[$]??H,P=2*Math.PI*j/T,C=Math.sin(P)/2,N=(1-Math.cos(P))/2,K=1-Math.cos(P),w=(1-Math.cos(P))/2,v=1+C,Z=-2*Math.cos(P),E=1-C,O=F[$],R=N/v*O+K/v*U+w/v*Y-Z/v*X-E/v*k;Y=U,U=O,k=X,X=R,F[$]=R}}J[Q]={x_1:U,x_2:Y,y_1:X,y_2:k}}}function u0(V,A,T,J){for(let Q=0;Q<V.length;Q++){let F=V[Q],{x_1:U,x_2:Y,y_1:X,y_2:k}=J[Q]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let H=A[0];if(H<=20)return;let $=2*Math.PI*H/T,j=Math.sin($)/2,P=(1+Math.cos($))/2,C=-(1+Math.cos($)),N=(1+Math.cos($))/2,K=1+j,w=-2*Math.cos($),v=1-j;for(let Z=0;Z<F.length;Z++){let E=F[Z],O=P/K*E+C/K*U+N/K*Y-w/K*X-v/K*k;Y=U,U=E,k=X,X=O,F[Z]=O}}else{let H=A[0];for(let $=0;$<F.length;$++){let j=A[$]??H,P=2*Math.PI*j/T,C=Math.sin(P)/2,N=(1+Math.cos(P))/2,K=-(1+Math.cos(P)),w=(1+Math.cos(P))/2,v=1+C,Z=-2*Math.cos(P),E=1-C,O=F[$],R=N/v*O+K/v*U+w/v*Y-Z/v*X-E/v*k;Y=U,U=O,k=X,X=R,F[$]=R}}J[Q]={x_1:U,x_2:Y,y_1:X,y_2:k}}}function z0(V,A,T,J){let{type:Q,data:F}=A;switch(Q){case\"buffer\":return y0(V,F),n(V,J),[];case\"bufferInit\":{let U=F;return V.buffer=G0(U.channels,U.totalLength),V.streamBuffer={...i(),totalLength:U.totalLength,streamEnded:!1,streaming:U.streaming??!0},n(V,J),[]}case\"bufferRange\":return V.streamBuffer.pendingWrites.push(F),[];case\"bufferEnd\":{let U=F;if(U?.totalLength!=null)V.streamBuffer.totalLength=U.totalLength;return V.streamBuffer.streamEnded=!0,[]}case\"bufferReset\":return V.buffer=[],V.streamBuffer=i(),n(V,J),[];case\"start\":V.timesLooped=0;{let U=F;if(V.duration=U?.duration??-1,V.duration===-1)V.duration=V.loop?Number.MAX_SAFE_INTEGER:(V.buffer[0]?.length??0)/J;e(V,U?.offset,J),n(V,J),V.playhead=V.offset,V.startWhen=U?.when??T,V.stopWhen=V.startWhen+V.duration,V.playedSamples=0,V.state=z.Scheduled}return[{type:\"scheduled\"}];case\"stop\":if(V.state===z.Ended||V.state===z.Initial)return[];return V.stopWhen=F??V.stopWhen,V.state=z.Stopped,[{type:\"stopped\"}];case\"pause\":return V.state=z.Paused,V.pauseWhen=F??T,[{type:\"paused\"}];case\"resume\":return V.state=z.Started,V.startWhen=F??T,[{type:\"resume\"}];case\"dispose\":return V.state=z.Disposed,V.buffer=[],V.streamBuffer=i(),[{type:\"disposed\"}];case\"loop\":{let U=F,Y=V.state;if(U&&(Y===z.Scheduled||Y===z.Started))V.stopWhen=Number.MAX_SAFE_INTEGER,V.duration=Number.MAX_SAFE_INTEGER;if(V.loop=U,U)n(V,J);return[]}case\"loopStart\":return V.loopStart=F,[];case\"loopEnd\":return V.loopEnd=F,[];case\"loopCrossfade\":return V.loopCrossfade=F,[];case\"playhead\":return V.playhead=Math.floor(F),[];case\"fadeIn\":return V.fadeInDuration=F,[];case\"fadeOut\":return V.fadeOutDuration=F,[];case\"toggleGain\":return V.enableGain=F??!V.enableGain,[];case\"togglePan\":return V.enablePan=F??!V.enablePan,[];case\"toggleLowpass\":return V.enableLowpass=F??!V.enableLowpass,[];case\"toggleHighpass\":return V.enableHighpass=F??!V.enableHighpass,[];case\"toggleDetune\":return V.enableDetune=F??!V.enableDetune,[];case\"togglePlaybackRate\":return V.enablePlaybackRate=F??!V.enablePlaybackRate,[];case\"toggleFadeIn\":return V.enableFadeIn=F??!V.enableFadeIn,[];case\"toggleFadeOut\":return V.enableFadeOut=F??!V.enableFadeOut,[];case\"toggleLoopStart\":return V.enableLoopStart=F??!V.enableLoopStart,[];case\"toggleLoopEnd\":return V.enableLoopEnd=F??!V.enableLoopEnd,[];case\"toggleLoopCrossfade\":return V.enableLoopCrossfade=F??!V.enableLoopCrossfade,[];case\"logState\":return[]}return[]}function j0(V,A,T,J,Q){let F=[],U=V.state;if(U===z.Disposed)return{keepAlive:!1,messages:F};if(_0(V),U===z.Initial)return{keepAlive:!0,messages:F};if(U===z.Ended)return d(A[0]),{keepAlive:!0,messages:F};if(U===z.Scheduled)if(J.currentTime>=V.startWhen)U=V.state=z.Started,F.push({type:\"started\"});else return d(A[0]),{keepAlive:!0,messages:F};else if(U===z.Paused){if(J.currentTime>V.pauseWhen)return d(A[0]),{keepAlive:!0,messages:F}}if(J.currentTime>V.stopWhen)return d(A[0]),V.state=z.Ended,F.push({type:\"ended\"}),V.playedSamples=0,{keepAlive:!0,messages:F};let Y=A[0],X=o(V);if(X===0)return d(Y),{keepAlive:!0,messages:F};let{playbackRate:k,detune:H,lowpass:$,highpass:j,gain:P,pan:C}=T,{buffer:N,loopStart:K,loopEnd:w,loopCrossfade:v,stopWhen:Z,playedSamples:E,enableLowpass:O,enableHighpass:R,enableGain:h,enablePan:b,enableDetune:c,enableFadeOut:g,enableFadeIn:s,enableLoopStart:r,enableLoopEnd:t,enableLoopCrossfade:p,playhead:D,fadeInDuration:A0,fadeOutDuration:F0}=V,K0=V.streamBuffer.streaming&&V.streamBuffer.committedLength<X,T0=V.loop&&!K0,u=Math.min(N.length,Y.length),W0=V.duration*J.sampleRate,Z0=Math.floor(J.sampleRate*v),q0=Math.max(X-y,0),L=r?Math.min(Math.floor(K*J.sampleRate),q0):0,x=t?Math.min(Math.floor(w*J.sampleRate),X):X,N0=x-L,J0=c&&H.length>0&&H[0]!==0,l=k;if(J0){let M=Math.max(k.length,H.length,y);l=new Float32Array(M);for(let W=0;W<M;W++){let I=k[W]??k[k.length-1],G=H[W]??H[H.length-1];l[W]=I*2**(G/1200)}}let Q0=V.enablePlaybackRate||J0,O0=Q0&&l.length>0&&l.every((M)=>M===0);if(V.streamBuffer.streaming&&!V.streamBuffer.streamEnded&&!V.streamBuffer.lowWaterNotified&&V.streamBuffer.committedLength-Math.floor(D)<V.streamBuffer.lowWaterThreshold)F.push({type:\"bufferLowWater\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength}}),V.streamBuffer.lowWaterNotified=!0;if(O0){d(Y);for(let M=1;M<A.length;M++)H0(Y,A[M]);return{keepAlive:!0,messages:F}}let U0={bufferLength:X,loop:T0,playhead:D,loopStartSamples:L,loopEndSamples:x,durationSamples:W0,playbackRates:l},{indexes:a,ended:X0,looped:Y0,playhead:$0}=Q0?x0(U0):L0(U0),f=a.find((M)=>M>=V.streamBuffer.committedLength&&M<X);if(f!==void 0&&!V.streamBuffer.streamEnded&&V.streamBuffer.lastUnderrunSample!==f)F.push({type:\"bufferUnderrun\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength,requestedSample:f}}),V.streamBuffer.lastUnderrunSample=f;else if(f===void 0)V.streamBuffer.lastUnderrunSample=null;m0(Y,N,a);let m=Math.min(Math.floor(v*J.sampleRate),N0),D0=T0&&D>L&&D<x,C0=p&&Z0>0&&X>y;if(D0&&C0){{let M=L+m;if(m>0&&D>L&&D<M){let W=D-L,I=Math.min(Math.floor(M-D),y);for(let G=0;G<I;G++){let B=(W+G)/m,S=Math.cos(Math.PI*B/2),q=Math.floor(x-m+W+G);if(q>=0&&q<X)for(let _=0;_<u;_++)Y[_][G]+=N[_][q]*S}}}{let M=x-m;if(m>0&&D>M&&D<x){let W=D-M,I=Math.min(Math.floor(x-D),y);for(let G=0;G<I;G++){let B=(W+G)/m,S=Math.sin(Math.PI*B/2),q=Math.floor(L+W+G);if(q>=0&&q<X)for(let _=0;_<u;_++)Y[_][G]+=N[_][q]*S}}}}if(s&&A0>0){let M=Math.floor(A0*J.sampleRate),W=M-E;if(W>0){let I=Math.min(W,y);for(let G=0;G<I;G++){let B=(E+G)/M,S=B*B*B;for(let q=0;q<u;q++)Y[q][G]*=S}}}if(g&&F0>0){let M=Math.floor(F0*J.sampleRate),W=Math.floor(J.sampleRate*(Z-J.currentTime));if(W<M+y)for(let I=0;I<y;I++){let G=W-I;if(G>=M)continue;let B=G<=0?0:G/M,S=B*B*B;for(let q=0;q<u;q++)Y[q][I]*=S}}if(O)h0(Y,$,J.sampleRate,Q.lowpass);if(R)u0(Y,j,J.sampleRate,Q.highpass);if(h)g0(Y,P);if(u===1)S0(Y);if(b)d0(Y,C);if(Y0)V.timesLooped++,F.push({type:\"looped\",data:V.timesLooped});if(X0)V.state=z.Ended,F.push({type:\"ended\"});V.playedSamples+=a.length,V.playhead=$0;let k0=c0(Y);if(k0>0)return console.log({numNans:k0,indexes:a,playhead:$0,ended:X0,looped:Y0,sourceLength:X}),{keepAlive:!0,messages:F};for(let M=1;M<A.length;M++)H0(Y,A[M]);return{keepAlive:!0,messages:F}}class P0 extends AudioWorkletProcessor{static get parameterDescriptors(){return[{name:\"playbackRate\",automationRate:\"a-rate\",defaultValue:1},{name:\"detune\",automationRate:\"a-rate\",defaultValue:0},{name:\"gain\",automationRate:\"a-rate\",defaultValue:1,minValue:0},{name:\"pan\",automationRate:\"a-rate\",defaultValue:0},{name:\"highpass\",automationRate:\"a-rate\",defaultValue:20,minValue:20,maxValue:20000},{name:\"lowpass\",automationRate:\"a-rate\",defaultValue:20000,minValue:20,maxValue:20000}]}properties;filterState={lowpass:V0(),highpass:V0()};lastFrameTime=0;constructor(V){super(V);this.properties=v0(V?.processorOptions,sampleRate),this.port.onmessage=(A)=>{let T=z0(this.properties,A.data,currentTime,sampleRate);for(let J of T)this.port.postMessage(J);if(this.properties.state===z.Disposed)this.port.close()}}process(V,A,T){try{let J=j0(this.properties,A,T,{currentTime,currentFrame,sampleRate},this.filterState);for(let F of J.messages)this.port.postMessage(F);let Q=currentTime-this.lastFrameTime;return this.lastFrameTime=currentTime,this.port.postMessage({type:\"frame\",data:[currentTime,currentFrame,Math.floor(this.properties.playhead),Q*1000]}),J.keepAlive}catch(J){return console.log(J),!0}}}registerProcessor(\"ClipProcessor\",P0);\n\n//# debugId=E1A630180247A19C64756E2164756E21\n//# sourceMappingURL=processor.js.map\n";
1
+ export declare const processorCode = "var P={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var _=128;function i(V=[]){let A=V[0]?.length??0,F=A>0;return{totalLength:F?A:null,committedLength:F?A:0,streamEnded:F,streaming:!1,writtenSpans:F?[{startSample:0,endSample:A}]:[],pendingWrites:[],lowWaterThreshold:_*4,lowWaterNotified:!1,lastUnderrunSample:null}}function G0(V){return V[0]?.length??0}function o(V){return V.streamBuffer.totalLength??G0(V.buffer)}function H0(V,A){return Array.from({length:V},()=>new Float32Array(A))}function E0(V,A){let F=[...V,A].sort((J,k)=>J.startSample-k.startSample),T=[];for(let J of F){let k=T[T.length-1];if(!k||J.startSample>k.endSample){T.push({...J});continue}k.endSample=Math.max(k.endSample,J.endSample)}return T}function I0(V){let A=0;for(let F of V){if(F.startSample>A)break;A=Math.max(A,F.endSample)}return A}function w0(V,A){if(V.committedLength-Math.floor(A)>=V.lowWaterThreshold)V.lowWaterNotified=!1}function R0(V,A,F){let T=G0(V.buffer),J=V.buffer.length;if(T>=F&&J>=A)return;let k=Math.max(T,F),Q=Math.max(J,A),X=H0(Q,k);for(let U=0;U<J;U++)X[U].set(V.buffer[U].subarray(0,T));if(V.buffer=X,V.streamBuffer.totalLength==null||V.streamBuffer.totalLength<k)V.streamBuffer.totalLength=k}function B0(V,A){let F=Math.max(Math.floor(A.startSample),0),T=A.channelData[0]?.length??0,J=A.totalLength??null,k=Math.max(F+T,J??0);R0(V,Math.max(A.channelData.length,V.buffer.length,1),k);for(let Q=0;Q<A.channelData.length;Q++)V.buffer[Q].set(A.channelData[Q],F);if(J!=null)V.streamBuffer.totalLength=J;if(T>0)V.streamBuffer.writtenSpans=E0(V.streamBuffer.writtenSpans,{startSample:F,endSample:F+T}),V.streamBuffer.committedLength=I0(V.streamBuffer.writtenSpans);if(A.streamEnded===!0)V.streamBuffer.streamEnded=!0;w0(V.streamBuffer,V.playhead)}function y0(V){if(V.streamBuffer.pendingWrites.length===0)return;for(let A of V.streamBuffer.pendingWrites)B0(V,A);V.streamBuffer.pendingWrites=[]}function _0(V,A){V.buffer=A,V.streamBuffer=i(A)}function v0(V={},A){let{buffer:F=[],streamBuffer:T=i(F),duration:J=-1,loop:k=!1,loopStart:Q=0,loopEnd:X=(F[0]?.length??0)/A,loopCrossfade:U=0,playhead:$=0,offset:M=0,startWhen:Y=0,stopWhen:j=0,pauseWhen:z=0,resumeWhen:C=0,playedSamples:N=0,state:K=P.Initial,timesLooped:w=0,fadeInDuration:v=0,fadeOutDuration:Z=0,enableFadeIn:E=v>0,enableFadeOut:O=Z>0,enableLoopStart:R=!0,enableLoopEnd:d=!0,enableLoopCrossfade:b=U>0,enableHighpass:c=!0,enableLowpass:g=!0,enableGain:s=!0,enablePan:t=!0,enableDetune:r=!0,enablePlaybackRate:p=!0}=V;return{buffer:F,streamBuffer:T,loop:k,loopStart:Q,loopEnd:X,loopCrossfade:U,duration:J,playhead:$,offset:M,startWhen:Y,stopWhen:j,pauseWhen:z,resumeWhen:C,playedSamples:N,state:K,timesLooped:w,fadeInDuration:v,fadeOutDuration:Z,enableFadeIn:E,enableFadeOut:O,enableLoopStart:R,enableLoopEnd:d,enableHighpass:c,enableLowpass:g,enableGain:s,enablePan:t,enableDetune:r,enablePlaybackRate:p,enableLoopCrossfade:b}}function b0(V,A){return o(V)/A}function n(V,A){let F=b0(V,A);if(F<=0){V.loopStart=0,V.loopEnd=0;return}if(!Number.isFinite(V.loopStart)||V.loopStart<0)V.loopStart=0;if(V.loopStart>=F)V.loopStart=0;if(!Number.isFinite(V.loopEnd)||V.loopEnd<=V.loopStart||V.loopEnd>F)V.loopEnd=F}function e(V,A,F){if(A===void 0)return V.offset=0,0;if(A<0)return e(V,o(V)+A,F);if(A>(o(V)||1)-1)return e(V,o(V)%A,F);let T=Math.floor(A*F);return V.offset=T,T}function L0(V){let{playhead:A,bufferLength:F,loop:T,loopStartSamples:J,loopEndSamples:k}=V,Q=128;if(!T&&A+128>F)Q=Math.max(F-A,0);let X=Array(Q);if(!T){for(let Y=0,j=A;Y<Q;Y++,j++)X[Y]=j;let M=A+Q;return{playhead:M,indexes:X,looped:!1,ended:M>=F}}let U=A,$=!1;for(let M=0;M<Q;M++,U++){if(U>=k)U=J+(U-k),$=!0;X[M]=U}return{indexes:X,looped:$,ended:!1,playhead:U}}function x0(V){let{playhead:A,bufferLength:F,loop:T,loopStartSamples:J,loopEndSamples:k,playbackRates:Q}=V,X=128;if(!T&&A+128>F)X=Math.max(F-A,0);let U=Array(X),$=A,M=!1;if(T){for(let Y=0;Y<X;Y++){U[Y]=Math.min(Math.max(Math.floor($),0),F-1);let j=Q[Y]??Q[0]??1;if($+=j,j>=0&&($>k||$>F))$=J,M=!0;else if(j<0&&($<J||$<0))$=k,M=!0}return{playhead:$,indexes:U,looped:M,ended:!1}}for(let Y=0;Y<X;Y++)U[Y]=Math.min(Math.max(Math.floor($),0),F-1),$+=Q[Y]??Q[0]??1;return{playhead:$,indexes:U,looped:!1,ended:$>=F||$<0}}function m0(V,A,F){let T=Math.min(V.length,A.length);for(let J=0;J<F.length;J++)for(let k=0;k<T;k++)V[k][J]=A[k][F[J]];for(let J=T;J<V.length;J++)for(let k=0;k<V[J].length;k++)V[J][k]=0;for(let J=F.length;J<V[0].length;J++)for(let k=0;k<T;k++)V[k][J]=0}function h(V){for(let A=0;A<V.length;A++)for(let F=0;F<V[A].length;F++)V[A][F]=0}function S0(V){if(V.length>=2)for(let A=0;A<V[0].length;A++)V[1][A]=V[0][A];else{let A=new Float32Array(V[0].length);for(let F=0;F<V[0].length;F++)A[F]=V[0][F];V.push(A)}}function M0(V,A){for(let F=A.length;F<V.length;F++)A[F]=new Float32Array(V[F].length);for(let F=0;F<V.length;F++)for(let T=0;T<V[F].length;T++)A[F][T]=V[F][T]}function c0(V){let A=0;for(let F=0;F<V.length;F++)for(let T=0;T<V[F].length;T++)if(Number.isNaN(V[F][T]))A++,V[F][T]=0;return A}function V0(){return[{x_1:0,x_2:0,y_1:0,y_2:0},{x_1:0,x_2:0,y_1:0,y_2:0}]}function g0(V,A){if(A.length===1){let T=A[0];if(T===1)return;for(let J of V)for(let k=0;k<J.length;k++)J[k]*=T;return}let F=A[0];for(let T of V)for(let J=0;J<T.length;J++)F=A[J]??F,T[J]*=F}function h0(V,A){let F=A[0];for(let T=0;T<V[0].length;T++){F=A[T]??F;let J=F<=0?1:1-F,k=F>=0?1:1+F;V[0][T]*=J,V[1][T]*=k}}function d0(V,A,F,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:X,y_1:U,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let M=A[0];if(M>=20000)return;let Y=2*Math.PI*M/F,j=Math.sin(Y)/2,z=(1-Math.cos(Y))/2,C=1-Math.cos(Y),N=(1-Math.cos(Y))/2,K=1+j,w=-2*Math.cos(Y),v=1-j,Z=z/K,E=C/K,O=N/K,R=w/K,d=v/K;for(let b=0;b<k.length;b++){let c=k[b],g=Z*c+E*Q+O*X-R*U-d*$;X=Q,Q=c,$=U,U=g,k[b]=g}}else{let M=A[0];for(let Y=0;Y<k.length;Y++){let j=A[Y]??M,z=2*Math.PI*j/F,C=Math.sin(z)/2,N=(1-Math.cos(z))/2,K=1-Math.cos(z),w=(1-Math.cos(z))/2,v=1+C,Z=-2*Math.cos(z),E=1-C,O=k[Y],R=N/v*O+K/v*Q+w/v*X-Z/v*U-E/v*$;X=Q,Q=O,$=U,U=R,k[Y]=R}}T[J]={x_1:Q,x_2:X,y_1:U,y_2:$}}}function u0(V,A,F,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:X,y_1:U,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let M=A[0];if(M<=20)return;let Y=2*Math.PI*M/F,j=Math.sin(Y)/2,z=(1+Math.cos(Y))/2,C=-(1+Math.cos(Y)),N=(1+Math.cos(Y))/2,K=1+j,w=-2*Math.cos(Y),v=1-j;for(let Z=0;Z<k.length;Z++){let E=k[Z],O=z/K*E+C/K*Q+N/K*X-w/K*U-v/K*$;X=Q,Q=E,$=U,U=O,k[Z]=O}}else{let M=A[0];for(let Y=0;Y<k.length;Y++){let j=A[Y]??M,z=2*Math.PI*j/F,C=Math.sin(z)/2,N=(1+Math.cos(z))/2,K=-(1+Math.cos(z)),w=(1+Math.cos(z))/2,v=1+C,Z=-2*Math.cos(z),E=1-C,O=k[Y],R=N/v*O+K/v*Q+w/v*X-Z/v*U-E/v*$;X=Q,Q=O,$=U,U=R,k[Y]=R}}T[J]={x_1:Q,x_2:X,y_1:U,y_2:$}}}function P0(V,A,F,T){let{type:J,data:k}=A;switch(J){case\"buffer\":return _0(V,k),n(V,T),[];case\"bufferInit\":{let Q=k;return V.buffer=H0(Q.channels,Q.totalLength),V.streamBuffer={...i(),totalLength:Q.totalLength,streamEnded:!1,streaming:Q.streaming??!0},n(V,T),[]}case\"bufferRange\":return V.streamBuffer.pendingWrites.push(k),[];case\"bufferEnd\":{let Q=k;if(Q?.totalLength!=null)V.streamBuffer.totalLength=Q.totalLength;return V.streamBuffer.streamEnded=!0,[]}case\"bufferReset\":return V.buffer=[],V.streamBuffer=i(),n(V,T),[];case\"start\":V.timesLooped=0;{let Q=k;if(V.duration=Q?.duration??-1,V.duration===-1)V.duration=V.loop?Number.MAX_SAFE_INTEGER:(V.buffer[0]?.length??0)/T;e(V,Q?.offset,T),n(V,T),V.playhead=V.offset,V.startWhen=Q?.when??F,V.stopWhen=V.startWhen+V.duration,V.playedSamples=0,V.state=P.Scheduled}return[{type:\"scheduled\"}];case\"stop\":if(V.state===P.Ended||V.state===P.Initial)return[];return V.stopWhen=k??V.stopWhen,V.state=P.Stopped,[{type:\"stopped\"}];case\"pause\":return V.state=P.Paused,V.pauseWhen=k??F,[{type:\"paused\"}];case\"resume\":return V.state=P.Started,V.startWhen=k??F,[{type:\"resume\"}];case\"dispose\":return V.state=P.Disposed,V.buffer=[],V.streamBuffer=i(),[{type:\"disposed\"}];case\"loop\":{let Q=k,X=V.state;if(Q&&(X===P.Scheduled||X===P.Started))V.stopWhen=Number.MAX_SAFE_INTEGER,V.duration=Number.MAX_SAFE_INTEGER;if(V.loop=Q,Q)n(V,T);return[]}case\"loopStart\":return V.loopStart=k,[];case\"loopEnd\":return V.loopEnd=k,[];case\"loopCrossfade\":return V.loopCrossfade=k,[];case\"playhead\":return V.playhead=Math.floor(k),[];case\"fadeIn\":return V.fadeInDuration=k,[];case\"fadeOut\":return V.fadeOutDuration=k,[];case\"toggleGain\":return V.enableGain=k??!V.enableGain,[];case\"togglePan\":return V.enablePan=k??!V.enablePan,[];case\"toggleLowpass\":return V.enableLowpass=k??!V.enableLowpass,[];case\"toggleHighpass\":return V.enableHighpass=k??!V.enableHighpass,[];case\"toggleDetune\":return V.enableDetune=k??!V.enableDetune,[];case\"togglePlaybackRate\":return V.enablePlaybackRate=k??!V.enablePlaybackRate,[];case\"toggleFadeIn\":return V.enableFadeIn=k??!V.enableFadeIn,[];case\"toggleFadeOut\":return V.enableFadeOut=k??!V.enableFadeOut,[];case\"toggleLoopStart\":return V.enableLoopStart=k??!V.enableLoopStart,[];case\"toggleLoopEnd\":return V.enableLoopEnd=k??!V.enableLoopEnd,[];case\"toggleLoopCrossfade\":return V.enableLoopCrossfade=k??!V.enableLoopCrossfade,[];case\"logState\":return[]}return[]}function j0(V,A,F,T,J){let k=[],Q=V.state;if(Q===P.Disposed)return{keepAlive:!1,messages:k};if(y0(V),Q===P.Initial)return{keepAlive:!0,messages:k};if(Q===P.Ended)return h(A[0]),{keepAlive:!0,messages:k};if(Q===P.Scheduled)if(T.currentTime>=V.startWhen)Q=V.state=P.Started,k.push({type:\"started\"});else return h(A[0]),{keepAlive:!0,messages:k};else if(Q===P.Paused){if(T.currentTime>V.pauseWhen)return h(A[0]),{keepAlive:!0,messages:k}}if(T.currentTime>V.stopWhen)return h(A[0]),V.state=P.Ended,k.push({type:\"ended\"}),V.playedSamples=0,{keepAlive:!0,messages:k};let X=A[0],U=o(V);if(U===0)return h(X),{keepAlive:!0,messages:k};let{playbackRate:$,detune:M,lowpass:Y,highpass:j,gain:z,pan:C}=F,{buffer:N,loopStart:K,loopEnd:w,loopCrossfade:v,stopWhen:Z,playedSamples:E,enableLowpass:O,enableHighpass:R,enableGain:d,enablePan:b,enableDetune:c,enableFadeOut:g,enableFadeIn:s,enableLoopStart:t,enableLoopEnd:r,enableLoopCrossfade:p,playhead:D,fadeInDuration:A0,fadeOutDuration:F0}=V,K0=V.streamBuffer.streaming&&V.streamBuffer.committedLength<U,k0=V.loop&&!K0,u=Math.min(N.length,X.length),W0=V.duration*T.sampleRate,Z0=Math.floor(T.sampleRate*v),q0=Math.max(U-_,0),L=t?Math.min(Math.floor(K*T.sampleRate),q0):0,x=r?Math.min(Math.floor(w*T.sampleRate),U):U,N0=x-L,T0=c&&M.length>0&&M[0]!==0,l=$;if(T0){let G=Math.max($.length,M.length,_);l=new Float32Array(G);for(let W=0;W<G;W++){let I=$[W]??$[$.length-1],H=M[W]??M[M.length-1];l[W]=I*2**(H/1200)}}let J0=V.enablePlaybackRate||T0,O0=J0&&l.length>0&&l.every((G)=>G===0);if(V.streamBuffer.streaming&&!V.streamBuffer.streamEnded&&!V.streamBuffer.lowWaterNotified&&V.streamBuffer.committedLength-Math.floor(D)<V.streamBuffer.lowWaterThreshold)k.push({type:\"bufferLowWater\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength}}),V.streamBuffer.lowWaterNotified=!0;if(O0){h(X);for(let G=1;G<A.length;G++)M0(X,A[G]);return{keepAlive:!0,messages:k}}let Q0={bufferLength:U,loop:k0,playhead:D,loopStartSamples:L,loopEndSamples:x,durationSamples:W0,playbackRates:l},{indexes:a,ended:U0,looped:X0,playhead:Y0}=J0?x0(Q0):L0(Q0),f=a.find((G)=>G>=V.streamBuffer.committedLength&&G<U);if(f!==void 0&&!V.streamBuffer.streamEnded&&V.streamBuffer.lastUnderrunSample!==f)k.push({type:\"bufferUnderrun\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength,requestedSample:f}}),V.streamBuffer.lastUnderrunSample=f;else if(f===void 0)V.streamBuffer.lastUnderrunSample=null;m0(X,N,a);let m=Math.min(Math.floor(v*T.sampleRate),N0),D0=k0&&D>L&&D<x,C0=p&&Z0>0&&U>_;if(D0&&C0){{let G=L+m;if(m>0&&D>L&&D<G){let W=D-L,I=Math.min(Math.floor(G-D),_);for(let H=0;H<I;H++){let B=(W+H)/m,S=Math.cos(Math.PI*B/2),q=Math.floor(x-m+W+H);if(q>=0&&q<U)for(let y=0;y<u;y++)X[y][H]+=N[y][q]*S}}}{let G=x-m;if(m>0&&D>G&&D<x){let W=D-G,I=Math.min(Math.floor(x-D),_);for(let H=0;H<I;H++){let B=(W+H)/m,S=Math.sin(Math.PI*B/2),q=Math.floor(L+W+H);if(q>=0&&q<U)for(let y=0;y<u;y++)X[y][H]+=N[y][q]*S}}}}if(s&&A0>0){let G=Math.floor(A0*T.sampleRate),W=G-E;if(W>0){let I=Math.min(W,_);for(let H=0;H<I;H++){let B=(E+H)/G,S=B*B*B;for(let q=0;q<u;q++)X[q][H]*=S}}}if(g&&F0>0){let G=Math.floor(F0*T.sampleRate),W=Math.floor(T.sampleRate*(Z-T.currentTime));if(W<G+_)for(let I=0;I<_;I++){let H=W-I;if(H>=G)continue;let B=H<=0?0:H/G,S=B*B*B;for(let q=0;q<u;q++)X[q][I]*=S}}if(O)d0(X,Y,T.sampleRate,J.lowpass);if(R)u0(X,j,T.sampleRate,J.highpass);if(d)g0(X,z);if(u===1)S0(X);if(b)h0(X,C);if(X0)V.timesLooped++,k.push({type:\"looped\",data:V.timesLooped});if(U0)V.state=P.Ended,k.push({type:\"ended\"});V.playedSamples+=a.length,V.playhead=Y0;let $0=c0(X);if($0>0)return console.log({numNans:$0,indexes:a,playhead:Y0,ended:U0,looped:X0,sourceLength:U}),{keepAlive:!0,messages:k};for(let G=1;G<A.length;G++)M0(X,A[G]);return{keepAlive:!0,messages:k}}class z0 extends AudioWorkletProcessor{static get parameterDescriptors(){return[{name:\"playbackRate\",automationRate:\"a-rate\",defaultValue:1},{name:\"detune\",automationRate:\"a-rate\",defaultValue:0},{name:\"gain\",automationRate:\"a-rate\",defaultValue:1,minValue:0},{name:\"pan\",automationRate:\"a-rate\",defaultValue:0},{name:\"highpass\",automationRate:\"a-rate\",defaultValue:20,minValue:20,maxValue:20000},{name:\"lowpass\",automationRate:\"a-rate\",defaultValue:20000,minValue:20,maxValue:20000}]}properties;filterState={lowpass:V0(),highpass:V0()};lastFrameTime=0;constructor(V){super(V);this.properties=v0(V?.processorOptions,sampleRate),this.port.onmessage=(A)=>{let F=P0(this.properties,A.data,currentTime,sampleRate);for(let T of F)this.port.postMessage(T);if(this.properties.state===P.Disposed)this.port.close()}}process(V,A,F){try{let T=j0(this.properties,A,F,{currentTime,currentFrame,sampleRate},this.filterState);for(let k of T.messages)this.port.postMessage(k);let J=currentTime-this.lastFrameTime;return this.lastFrameTime=currentTime,this.port.postMessage({type:\"frame\",data:[currentTime,currentFrame,Math.floor(this.properties.playhead),J*1000]}),T.keepAlive}catch(T){return this.port.postMessage({type:\"processorError\",data:{error:String(T),state:this.properties.state,bufferChannels:this.properties.buffer?.length,bufferLength:this.properties.buffer?.[0]?.length,paramKeys:Object.keys(F),hasPlaybackRate:!!F.playbackRate,hasDetune:!!F.detune,hasGain:!!F.gain,hasPan:!!F.pan,outputChannels:A[0]?.length}}),!0}}}registerProcessor(\"ClipProcessor\",z0);\n\n//# debugId=12FC7555EABD465B64756E2164756E21\n//# sourceMappingURL=processor.js.map\n";
@@ -1,2 +1,2 @@
1
1
  // AUTO-GENERATED — do not edit. Run 'bun run build:lib' to regenerate.
2
- export const processorCode = "var z={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var y=128;function i(V=[]){let A=V[0]?.length??0,T=A>0;return{totalLength:T?A:null,committedLength:T?A:0,streamEnded:T,streaming:!1,writtenSpans:T?[{startSample:0,endSample:A}]:[],pendingWrites:[],lowWaterThreshold:y*4,lowWaterNotified:!1,lastUnderrunSample:null}}function M0(V){return V[0]?.length??0}function o(V){return V.streamBuffer.totalLength??M0(V.buffer)}function G0(V,A){return Array.from({length:V},()=>new Float32Array(A))}function E0(V,A){let T=[...V,A].sort((Q,F)=>Q.startSample-F.startSample),J=[];for(let Q of T){let F=J[J.length-1];if(!F||Q.startSample>F.endSample){J.push({...Q});continue}F.endSample=Math.max(F.endSample,Q.endSample)}return J}function I0(V){let A=0;for(let T of V){if(T.startSample>A)break;A=Math.max(A,T.endSample)}return A}function w0(V,A){if(V.committedLength-Math.floor(A)>=V.lowWaterThreshold)V.lowWaterNotified=!1}function R0(V,A,T){let J=M0(V.buffer),Q=V.buffer.length;if(J>=T&&Q>=A)return;let F=Math.max(J,T),U=Math.max(Q,A),Y=G0(U,F);for(let X=0;X<Q;X++)Y[X].set(V.buffer[X].subarray(0,J));if(V.buffer=Y,V.streamBuffer.totalLength==null||V.streamBuffer.totalLength<F)V.streamBuffer.totalLength=F}function B0(V,A){let T=Math.max(Math.floor(A.startSample),0),J=A.channelData[0]?.length??0,Q=A.totalLength??null,F=Math.max(T+J,Q??0);R0(V,Math.max(A.channelData.length,V.buffer.length,1),F);for(let U=0;U<A.channelData.length;U++)V.buffer[U].set(A.channelData[U],T);if(Q!=null)V.streamBuffer.totalLength=Q;if(J>0)V.streamBuffer.writtenSpans=E0(V.streamBuffer.writtenSpans,{startSample:T,endSample:T+J}),V.streamBuffer.committedLength=I0(V.streamBuffer.writtenSpans);if(A.streamEnded===!0)V.streamBuffer.streamEnded=!0;w0(V.streamBuffer,V.playhead)}function _0(V){if(V.streamBuffer.pendingWrites.length===0)return;for(let A of V.streamBuffer.pendingWrites)B0(V,A);V.streamBuffer.pendingWrites=[]}function y0(V,A){V.buffer=A,V.streamBuffer=i(A)}function v0(V={},A){let{buffer:T=[],streamBuffer:J=i(T),duration:Q=-1,loop:F=!1,loopStart:U=0,loopEnd:Y=(T[0]?.length??0)/A,loopCrossfade:X=0,playhead:k=0,offset:H=0,startWhen:$=0,stopWhen:j=0,pauseWhen:P=0,resumeWhen:C=0,playedSamples:N=0,state:K=z.Initial,timesLooped:w=0,fadeInDuration:v=0,fadeOutDuration:Z=0,enableFadeIn:E=v>0,enableFadeOut:O=Z>0,enableLoopStart:R=!0,enableLoopEnd:h=!0,enableLoopCrossfade:b=X>0,enableHighpass:c=!0,enableLowpass:g=!0,enableGain:s=!0,enablePan:r=!0,enableDetune:t=!0,enablePlaybackRate:p=!0}=V;return{buffer:T,streamBuffer:J,loop:F,loopStart:U,loopEnd:Y,loopCrossfade:X,duration:Q,playhead:k,offset:H,startWhen:$,stopWhen:j,pauseWhen:P,resumeWhen:C,playedSamples:N,state:K,timesLooped:w,fadeInDuration:v,fadeOutDuration:Z,enableFadeIn:E,enableFadeOut:O,enableLoopStart:R,enableLoopEnd:h,enableHighpass:c,enableLowpass:g,enableGain:s,enablePan:r,enableDetune:t,enablePlaybackRate:p,enableLoopCrossfade:b}}function b0(V,A){return o(V)/A}function n(V,A){let T=b0(V,A);if(T<=0){V.loopStart=0,V.loopEnd=0;return}if(!Number.isFinite(V.loopStart)||V.loopStart<0)V.loopStart=0;if(V.loopStart>=T)V.loopStart=0;if(!Number.isFinite(V.loopEnd)||V.loopEnd<=V.loopStart||V.loopEnd>T)V.loopEnd=T}function e(V,A,T){if(A===void 0)return V.offset=0,0;if(A<0)return e(V,o(V)+A,T);if(A>(o(V)||1)-1)return e(V,o(V)%A,T);let J=Math.floor(A*T);return V.offset=J,J}function L0(V){let{playhead:A,bufferLength:T,loop:J,loopStartSamples:Q,loopEndSamples:F}=V,U=128;if(!J&&A+128>T)U=Math.max(T-A,0);let Y=Array(U);if(!J){for(let $=0,j=A;$<U;$++,j++)Y[$]=j;let H=A+U;return{playhead:H,indexes:Y,looped:!1,ended:H>=T}}let X=A,k=!1;for(let H=0;H<U;H++,X++){if(X>=F)X=Q+(X-F),k=!0;Y[H]=X}return{indexes:Y,looped:k,ended:!1,playhead:X}}function x0(V){let{playhead:A,bufferLength:T,loop:J,loopStartSamples:Q,loopEndSamples:F,playbackRates:U}=V,Y=128;if(!J&&A+128>T)Y=Math.max(T-A,0);let X=Array(Y),k=A,H=!1;if(J){for(let $=0;$<Y;$++){X[$]=Math.min(Math.max(Math.floor(k),0),T-1);let j=U[$]??U[0]??1;if(k+=j,j>=0&&(k>F||k>T))k=Q,H=!0;else if(j<0&&(k<Q||k<0))k=F,H=!0}return{playhead:k,indexes:X,looped:H,ended:!1}}for(let $=0;$<Y;$++)X[$]=Math.min(Math.max(Math.floor(k),0),T-1),k+=U[$]??U[0]??1;return{playhead:k,indexes:X,looped:!1,ended:k>=T||k<0}}function m0(V,A,T){let J=Math.min(V.length,A.length);for(let Q=0;Q<T.length;Q++)for(let F=0;F<J;F++)V[F][Q]=A[F][T[Q]];for(let Q=J;Q<V.length;Q++)for(let F=0;F<V[Q].length;F++)V[Q][F]=0;for(let Q=T.length;Q<V[0].length;Q++)for(let F=0;F<J;F++)V[F][Q]=0}function d(V){for(let A=0;A<V.length;A++)for(let T=0;T<V[A].length;T++)V[A][T]=0}function S0(V){if(V.length>=2)for(let A=0;A<V[0].length;A++)V[1][A]=V[0][A];else{let A=new Float32Array(V[0].length);for(let T=0;T<V[0].length;T++)A[T]=V[0][T];V.push(A)}}function H0(V,A){for(let T=A.length;T<V.length;T++)A[T]=new Float32Array(V[T].length);for(let T=0;T<V.length;T++)for(let J=0;J<V[T].length;J++)A[T][J]=V[T][J]}function c0(V){let A=0;for(let T=0;T<V.length;T++)for(let J=0;J<V[T].length;J++)if(Number.isNaN(V[T][J]))A++,V[T][J]=0;return A}function V0(){return[{x_1:0,x_2:0,y_1:0,y_2:0},{x_1:0,x_2:0,y_1:0,y_2:0}]}function g0(V,A){if(A.length===1){let J=A[0];if(J===1)return;for(let Q of V)for(let F=0;F<Q.length;F++)Q[F]*=J;return}let T=A[0];for(let J of V)for(let Q=0;Q<J.length;Q++)T=A[Q]??T,J[Q]*=T}function d0(V,A){let T=A[0];for(let J=0;J<V[0].length;J++){T=A[J]??T;let Q=T<=0?1:1-T,F=T>=0?1:1+T;V[0][J]*=Q,V[1][J]*=F}}function h0(V,A,T,J){for(let Q=0;Q<V.length;Q++){let F=V[Q],{x_1:U,x_2:Y,y_1:X,y_2:k}=J[Q]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let H=A[0];if(H>=20000)return;let $=2*Math.PI*H/T,j=Math.sin($)/2,P=(1-Math.cos($))/2,C=1-Math.cos($),N=(1-Math.cos($))/2,K=1+j,w=-2*Math.cos($),v=1-j,Z=P/K,E=C/K,O=N/K,R=w/K,h=v/K;for(let b=0;b<F.length;b++){let c=F[b],g=Z*c+E*U+O*Y-R*X-h*k;Y=U,U=c,k=X,X=g,F[b]=g}}else{let H=A[0];for(let $=0;$<F.length;$++){let j=A[$]??H,P=2*Math.PI*j/T,C=Math.sin(P)/2,N=(1-Math.cos(P))/2,K=1-Math.cos(P),w=(1-Math.cos(P))/2,v=1+C,Z=-2*Math.cos(P),E=1-C,O=F[$],R=N/v*O+K/v*U+w/v*Y-Z/v*X-E/v*k;Y=U,U=O,k=X,X=R,F[$]=R}}J[Q]={x_1:U,x_2:Y,y_1:X,y_2:k}}}function u0(V,A,T,J){for(let Q=0;Q<V.length;Q++){let F=V[Q],{x_1:U,x_2:Y,y_1:X,y_2:k}=J[Q]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let H=A[0];if(H<=20)return;let $=2*Math.PI*H/T,j=Math.sin($)/2,P=(1+Math.cos($))/2,C=-(1+Math.cos($)),N=(1+Math.cos($))/2,K=1+j,w=-2*Math.cos($),v=1-j;for(let Z=0;Z<F.length;Z++){let E=F[Z],O=P/K*E+C/K*U+N/K*Y-w/K*X-v/K*k;Y=U,U=E,k=X,X=O,F[Z]=O}}else{let H=A[0];for(let $=0;$<F.length;$++){let j=A[$]??H,P=2*Math.PI*j/T,C=Math.sin(P)/2,N=(1+Math.cos(P))/2,K=-(1+Math.cos(P)),w=(1+Math.cos(P))/2,v=1+C,Z=-2*Math.cos(P),E=1-C,O=F[$],R=N/v*O+K/v*U+w/v*Y-Z/v*X-E/v*k;Y=U,U=O,k=X,X=R,F[$]=R}}J[Q]={x_1:U,x_2:Y,y_1:X,y_2:k}}}function z0(V,A,T,J){let{type:Q,data:F}=A;switch(Q){case\"buffer\":return y0(V,F),n(V,J),[];case\"bufferInit\":{let U=F;return V.buffer=G0(U.channels,U.totalLength),V.streamBuffer={...i(),totalLength:U.totalLength,streamEnded:!1,streaming:U.streaming??!0},n(V,J),[]}case\"bufferRange\":return V.streamBuffer.pendingWrites.push(F),[];case\"bufferEnd\":{let U=F;if(U?.totalLength!=null)V.streamBuffer.totalLength=U.totalLength;return V.streamBuffer.streamEnded=!0,[]}case\"bufferReset\":return V.buffer=[],V.streamBuffer=i(),n(V,J),[];case\"start\":V.timesLooped=0;{let U=F;if(V.duration=U?.duration??-1,V.duration===-1)V.duration=V.loop?Number.MAX_SAFE_INTEGER:(V.buffer[0]?.length??0)/J;e(V,U?.offset,J),n(V,J),V.playhead=V.offset,V.startWhen=U?.when??T,V.stopWhen=V.startWhen+V.duration,V.playedSamples=0,V.state=z.Scheduled}return[{type:\"scheduled\"}];case\"stop\":if(V.state===z.Ended||V.state===z.Initial)return[];return V.stopWhen=F??V.stopWhen,V.state=z.Stopped,[{type:\"stopped\"}];case\"pause\":return V.state=z.Paused,V.pauseWhen=F??T,[{type:\"paused\"}];case\"resume\":return V.state=z.Started,V.startWhen=F??T,[{type:\"resume\"}];case\"dispose\":return V.state=z.Disposed,V.buffer=[],V.streamBuffer=i(),[{type:\"disposed\"}];case\"loop\":{let U=F,Y=V.state;if(U&&(Y===z.Scheduled||Y===z.Started))V.stopWhen=Number.MAX_SAFE_INTEGER,V.duration=Number.MAX_SAFE_INTEGER;if(V.loop=U,U)n(V,J);return[]}case\"loopStart\":return V.loopStart=F,[];case\"loopEnd\":return V.loopEnd=F,[];case\"loopCrossfade\":return V.loopCrossfade=F,[];case\"playhead\":return V.playhead=Math.floor(F),[];case\"fadeIn\":return V.fadeInDuration=F,[];case\"fadeOut\":return V.fadeOutDuration=F,[];case\"toggleGain\":return V.enableGain=F??!V.enableGain,[];case\"togglePan\":return V.enablePan=F??!V.enablePan,[];case\"toggleLowpass\":return V.enableLowpass=F??!V.enableLowpass,[];case\"toggleHighpass\":return V.enableHighpass=F??!V.enableHighpass,[];case\"toggleDetune\":return V.enableDetune=F??!V.enableDetune,[];case\"togglePlaybackRate\":return V.enablePlaybackRate=F??!V.enablePlaybackRate,[];case\"toggleFadeIn\":return V.enableFadeIn=F??!V.enableFadeIn,[];case\"toggleFadeOut\":return V.enableFadeOut=F??!V.enableFadeOut,[];case\"toggleLoopStart\":return V.enableLoopStart=F??!V.enableLoopStart,[];case\"toggleLoopEnd\":return V.enableLoopEnd=F??!V.enableLoopEnd,[];case\"toggleLoopCrossfade\":return V.enableLoopCrossfade=F??!V.enableLoopCrossfade,[];case\"logState\":return[]}return[]}function j0(V,A,T,J,Q){let F=[],U=V.state;if(U===z.Disposed)return{keepAlive:!1,messages:F};if(_0(V),U===z.Initial)return{keepAlive:!0,messages:F};if(U===z.Ended)return d(A[0]),{keepAlive:!0,messages:F};if(U===z.Scheduled)if(J.currentTime>=V.startWhen)U=V.state=z.Started,F.push({type:\"started\"});else return d(A[0]),{keepAlive:!0,messages:F};else if(U===z.Paused){if(J.currentTime>V.pauseWhen)return d(A[0]),{keepAlive:!0,messages:F}}if(J.currentTime>V.stopWhen)return d(A[0]),V.state=z.Ended,F.push({type:\"ended\"}),V.playedSamples=0,{keepAlive:!0,messages:F};let Y=A[0],X=o(V);if(X===0)return d(Y),{keepAlive:!0,messages:F};let{playbackRate:k,detune:H,lowpass:$,highpass:j,gain:P,pan:C}=T,{buffer:N,loopStart:K,loopEnd:w,loopCrossfade:v,stopWhen:Z,playedSamples:E,enableLowpass:O,enableHighpass:R,enableGain:h,enablePan:b,enableDetune:c,enableFadeOut:g,enableFadeIn:s,enableLoopStart:r,enableLoopEnd:t,enableLoopCrossfade:p,playhead:D,fadeInDuration:A0,fadeOutDuration:F0}=V,K0=V.streamBuffer.streaming&&V.streamBuffer.committedLength<X,T0=V.loop&&!K0,u=Math.min(N.length,Y.length),W0=V.duration*J.sampleRate,Z0=Math.floor(J.sampleRate*v),q0=Math.max(X-y,0),L=r?Math.min(Math.floor(K*J.sampleRate),q0):0,x=t?Math.min(Math.floor(w*J.sampleRate),X):X,N0=x-L,J0=c&&H.length>0&&H[0]!==0,l=k;if(J0){let M=Math.max(k.length,H.length,y);l=new Float32Array(M);for(let W=0;W<M;W++){let I=k[W]??k[k.length-1],G=H[W]??H[H.length-1];l[W]=I*2**(G/1200)}}let Q0=V.enablePlaybackRate||J0,O0=Q0&&l.length>0&&l.every((M)=>M===0);if(V.streamBuffer.streaming&&!V.streamBuffer.streamEnded&&!V.streamBuffer.lowWaterNotified&&V.streamBuffer.committedLength-Math.floor(D)<V.streamBuffer.lowWaterThreshold)F.push({type:\"bufferLowWater\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength}}),V.streamBuffer.lowWaterNotified=!0;if(O0){d(Y);for(let M=1;M<A.length;M++)H0(Y,A[M]);return{keepAlive:!0,messages:F}}let U0={bufferLength:X,loop:T0,playhead:D,loopStartSamples:L,loopEndSamples:x,durationSamples:W0,playbackRates:l},{indexes:a,ended:X0,looped:Y0,playhead:$0}=Q0?x0(U0):L0(U0),f=a.find((M)=>M>=V.streamBuffer.committedLength&&M<X);if(f!==void 0&&!V.streamBuffer.streamEnded&&V.streamBuffer.lastUnderrunSample!==f)F.push({type:\"bufferUnderrun\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength,requestedSample:f}}),V.streamBuffer.lastUnderrunSample=f;else if(f===void 0)V.streamBuffer.lastUnderrunSample=null;m0(Y,N,a);let m=Math.min(Math.floor(v*J.sampleRate),N0),D0=T0&&D>L&&D<x,C0=p&&Z0>0&&X>y;if(D0&&C0){{let M=L+m;if(m>0&&D>L&&D<M){let W=D-L,I=Math.min(Math.floor(M-D),y);for(let G=0;G<I;G++){let B=(W+G)/m,S=Math.cos(Math.PI*B/2),q=Math.floor(x-m+W+G);if(q>=0&&q<X)for(let _=0;_<u;_++)Y[_][G]+=N[_][q]*S}}}{let M=x-m;if(m>0&&D>M&&D<x){let W=D-M,I=Math.min(Math.floor(x-D),y);for(let G=0;G<I;G++){let B=(W+G)/m,S=Math.sin(Math.PI*B/2),q=Math.floor(L+W+G);if(q>=0&&q<X)for(let _=0;_<u;_++)Y[_][G]+=N[_][q]*S}}}}if(s&&A0>0){let M=Math.floor(A0*J.sampleRate),W=M-E;if(W>0){let I=Math.min(W,y);for(let G=0;G<I;G++){let B=(E+G)/M,S=B*B*B;for(let q=0;q<u;q++)Y[q][G]*=S}}}if(g&&F0>0){let M=Math.floor(F0*J.sampleRate),W=Math.floor(J.sampleRate*(Z-J.currentTime));if(W<M+y)for(let I=0;I<y;I++){let G=W-I;if(G>=M)continue;let B=G<=0?0:G/M,S=B*B*B;for(let q=0;q<u;q++)Y[q][I]*=S}}if(O)h0(Y,$,J.sampleRate,Q.lowpass);if(R)u0(Y,j,J.sampleRate,Q.highpass);if(h)g0(Y,P);if(u===1)S0(Y);if(b)d0(Y,C);if(Y0)V.timesLooped++,F.push({type:\"looped\",data:V.timesLooped});if(X0)V.state=z.Ended,F.push({type:\"ended\"});V.playedSamples+=a.length,V.playhead=$0;let k0=c0(Y);if(k0>0)return console.log({numNans:k0,indexes:a,playhead:$0,ended:X0,looped:Y0,sourceLength:X}),{keepAlive:!0,messages:F};for(let M=1;M<A.length;M++)H0(Y,A[M]);return{keepAlive:!0,messages:F}}class P0 extends AudioWorkletProcessor{static get parameterDescriptors(){return[{name:\"playbackRate\",automationRate:\"a-rate\",defaultValue:1},{name:\"detune\",automationRate:\"a-rate\",defaultValue:0},{name:\"gain\",automationRate:\"a-rate\",defaultValue:1,minValue:0},{name:\"pan\",automationRate:\"a-rate\",defaultValue:0},{name:\"highpass\",automationRate:\"a-rate\",defaultValue:20,minValue:20,maxValue:20000},{name:\"lowpass\",automationRate:\"a-rate\",defaultValue:20000,minValue:20,maxValue:20000}]}properties;filterState={lowpass:V0(),highpass:V0()};lastFrameTime=0;constructor(V){super(V);this.properties=v0(V?.processorOptions,sampleRate),this.port.onmessage=(A)=>{let T=z0(this.properties,A.data,currentTime,sampleRate);for(let J of T)this.port.postMessage(J);if(this.properties.state===z.Disposed)this.port.close()}}process(V,A,T){try{let J=j0(this.properties,A,T,{currentTime,currentFrame,sampleRate},this.filterState);for(let F of J.messages)this.port.postMessage(F);let Q=currentTime-this.lastFrameTime;return this.lastFrameTime=currentTime,this.port.postMessage({type:\"frame\",data:[currentTime,currentFrame,Math.floor(this.properties.playhead),Q*1000]}),J.keepAlive}catch(J){return console.log(J),!0}}}registerProcessor(\"ClipProcessor\",P0);\n\n//# debugId=E1A630180247A19C64756E2164756E21\n//# sourceMappingURL=processor.js.map\n";
2
+ export const processorCode = "var P={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var _=128;function i(V=[]){let A=V[0]?.length??0,F=A>0;return{totalLength:F?A:null,committedLength:F?A:0,streamEnded:F,streaming:!1,writtenSpans:F?[{startSample:0,endSample:A}]:[],pendingWrites:[],lowWaterThreshold:_*4,lowWaterNotified:!1,lastUnderrunSample:null}}function G0(V){return V[0]?.length??0}function o(V){return V.streamBuffer.totalLength??G0(V.buffer)}function H0(V,A){return Array.from({length:V},()=>new Float32Array(A))}function E0(V,A){let F=[...V,A].sort((J,k)=>J.startSample-k.startSample),T=[];for(let J of F){let k=T[T.length-1];if(!k||J.startSample>k.endSample){T.push({...J});continue}k.endSample=Math.max(k.endSample,J.endSample)}return T}function I0(V){let A=0;for(let F of V){if(F.startSample>A)break;A=Math.max(A,F.endSample)}return A}function w0(V,A){if(V.committedLength-Math.floor(A)>=V.lowWaterThreshold)V.lowWaterNotified=!1}function R0(V,A,F){let T=G0(V.buffer),J=V.buffer.length;if(T>=F&&J>=A)return;let k=Math.max(T,F),Q=Math.max(J,A),X=H0(Q,k);for(let U=0;U<J;U++)X[U].set(V.buffer[U].subarray(0,T));if(V.buffer=X,V.streamBuffer.totalLength==null||V.streamBuffer.totalLength<k)V.streamBuffer.totalLength=k}function B0(V,A){let F=Math.max(Math.floor(A.startSample),0),T=A.channelData[0]?.length??0,J=A.totalLength??null,k=Math.max(F+T,J??0);R0(V,Math.max(A.channelData.length,V.buffer.length,1),k);for(let Q=0;Q<A.channelData.length;Q++)V.buffer[Q].set(A.channelData[Q],F);if(J!=null)V.streamBuffer.totalLength=J;if(T>0)V.streamBuffer.writtenSpans=E0(V.streamBuffer.writtenSpans,{startSample:F,endSample:F+T}),V.streamBuffer.committedLength=I0(V.streamBuffer.writtenSpans);if(A.streamEnded===!0)V.streamBuffer.streamEnded=!0;w0(V.streamBuffer,V.playhead)}function y0(V){if(V.streamBuffer.pendingWrites.length===0)return;for(let A of V.streamBuffer.pendingWrites)B0(V,A);V.streamBuffer.pendingWrites=[]}function _0(V,A){V.buffer=A,V.streamBuffer=i(A)}function v0(V={},A){let{buffer:F=[],streamBuffer:T=i(F),duration:J=-1,loop:k=!1,loopStart:Q=0,loopEnd:X=(F[0]?.length??0)/A,loopCrossfade:U=0,playhead:$=0,offset:M=0,startWhen:Y=0,stopWhen:j=0,pauseWhen:z=0,resumeWhen:C=0,playedSamples:N=0,state:K=P.Initial,timesLooped:w=0,fadeInDuration:v=0,fadeOutDuration:Z=0,enableFadeIn:E=v>0,enableFadeOut:O=Z>0,enableLoopStart:R=!0,enableLoopEnd:d=!0,enableLoopCrossfade:b=U>0,enableHighpass:c=!0,enableLowpass:g=!0,enableGain:s=!0,enablePan:t=!0,enableDetune:r=!0,enablePlaybackRate:p=!0}=V;return{buffer:F,streamBuffer:T,loop:k,loopStart:Q,loopEnd:X,loopCrossfade:U,duration:J,playhead:$,offset:M,startWhen:Y,stopWhen:j,pauseWhen:z,resumeWhen:C,playedSamples:N,state:K,timesLooped:w,fadeInDuration:v,fadeOutDuration:Z,enableFadeIn:E,enableFadeOut:O,enableLoopStart:R,enableLoopEnd:d,enableHighpass:c,enableLowpass:g,enableGain:s,enablePan:t,enableDetune:r,enablePlaybackRate:p,enableLoopCrossfade:b}}function b0(V,A){return o(V)/A}function n(V,A){let F=b0(V,A);if(F<=0){V.loopStart=0,V.loopEnd=0;return}if(!Number.isFinite(V.loopStart)||V.loopStart<0)V.loopStart=0;if(V.loopStart>=F)V.loopStart=0;if(!Number.isFinite(V.loopEnd)||V.loopEnd<=V.loopStart||V.loopEnd>F)V.loopEnd=F}function e(V,A,F){if(A===void 0)return V.offset=0,0;if(A<0)return e(V,o(V)+A,F);if(A>(o(V)||1)-1)return e(V,o(V)%A,F);let T=Math.floor(A*F);return V.offset=T,T}function L0(V){let{playhead:A,bufferLength:F,loop:T,loopStartSamples:J,loopEndSamples:k}=V,Q=128;if(!T&&A+128>F)Q=Math.max(F-A,0);let X=Array(Q);if(!T){for(let Y=0,j=A;Y<Q;Y++,j++)X[Y]=j;let M=A+Q;return{playhead:M,indexes:X,looped:!1,ended:M>=F}}let U=A,$=!1;for(let M=0;M<Q;M++,U++){if(U>=k)U=J+(U-k),$=!0;X[M]=U}return{indexes:X,looped:$,ended:!1,playhead:U}}function x0(V){let{playhead:A,bufferLength:F,loop:T,loopStartSamples:J,loopEndSamples:k,playbackRates:Q}=V,X=128;if(!T&&A+128>F)X=Math.max(F-A,0);let U=Array(X),$=A,M=!1;if(T){for(let Y=0;Y<X;Y++){U[Y]=Math.min(Math.max(Math.floor($),0),F-1);let j=Q[Y]??Q[0]??1;if($+=j,j>=0&&($>k||$>F))$=J,M=!0;else if(j<0&&($<J||$<0))$=k,M=!0}return{playhead:$,indexes:U,looped:M,ended:!1}}for(let Y=0;Y<X;Y++)U[Y]=Math.min(Math.max(Math.floor($),0),F-1),$+=Q[Y]??Q[0]??1;return{playhead:$,indexes:U,looped:!1,ended:$>=F||$<0}}function m0(V,A,F){let T=Math.min(V.length,A.length);for(let J=0;J<F.length;J++)for(let k=0;k<T;k++)V[k][J]=A[k][F[J]];for(let J=T;J<V.length;J++)for(let k=0;k<V[J].length;k++)V[J][k]=0;for(let J=F.length;J<V[0].length;J++)for(let k=0;k<T;k++)V[k][J]=0}function h(V){for(let A=0;A<V.length;A++)for(let F=0;F<V[A].length;F++)V[A][F]=0}function S0(V){if(V.length>=2)for(let A=0;A<V[0].length;A++)V[1][A]=V[0][A];else{let A=new Float32Array(V[0].length);for(let F=0;F<V[0].length;F++)A[F]=V[0][F];V.push(A)}}function M0(V,A){for(let F=A.length;F<V.length;F++)A[F]=new Float32Array(V[F].length);for(let F=0;F<V.length;F++)for(let T=0;T<V[F].length;T++)A[F][T]=V[F][T]}function c0(V){let A=0;for(let F=0;F<V.length;F++)for(let T=0;T<V[F].length;T++)if(Number.isNaN(V[F][T]))A++,V[F][T]=0;return A}function V0(){return[{x_1:0,x_2:0,y_1:0,y_2:0},{x_1:0,x_2:0,y_1:0,y_2:0}]}function g0(V,A){if(A.length===1){let T=A[0];if(T===1)return;for(let J of V)for(let k=0;k<J.length;k++)J[k]*=T;return}let F=A[0];for(let T of V)for(let J=0;J<T.length;J++)F=A[J]??F,T[J]*=F}function h0(V,A){let F=A[0];for(let T=0;T<V[0].length;T++){F=A[T]??F;let J=F<=0?1:1-F,k=F>=0?1:1+F;V[0][T]*=J,V[1][T]*=k}}function d0(V,A,F,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:X,y_1:U,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let M=A[0];if(M>=20000)return;let Y=2*Math.PI*M/F,j=Math.sin(Y)/2,z=(1-Math.cos(Y))/2,C=1-Math.cos(Y),N=(1-Math.cos(Y))/2,K=1+j,w=-2*Math.cos(Y),v=1-j,Z=z/K,E=C/K,O=N/K,R=w/K,d=v/K;for(let b=0;b<k.length;b++){let c=k[b],g=Z*c+E*Q+O*X-R*U-d*$;X=Q,Q=c,$=U,U=g,k[b]=g}}else{let M=A[0];for(let Y=0;Y<k.length;Y++){let j=A[Y]??M,z=2*Math.PI*j/F,C=Math.sin(z)/2,N=(1-Math.cos(z))/2,K=1-Math.cos(z),w=(1-Math.cos(z))/2,v=1+C,Z=-2*Math.cos(z),E=1-C,O=k[Y],R=N/v*O+K/v*Q+w/v*X-Z/v*U-E/v*$;X=Q,Q=O,$=U,U=R,k[Y]=R}}T[J]={x_1:Q,x_2:X,y_1:U,y_2:$}}}function u0(V,A,F,T){for(let J=0;J<V.length;J++){let k=V[J],{x_1:Q,x_2:X,y_1:U,y_2:$}=T[J]??{x_1:0,x_2:0,y_1:0,y_2:0};if(A.length===1){let M=A[0];if(M<=20)return;let Y=2*Math.PI*M/F,j=Math.sin(Y)/2,z=(1+Math.cos(Y))/2,C=-(1+Math.cos(Y)),N=(1+Math.cos(Y))/2,K=1+j,w=-2*Math.cos(Y),v=1-j;for(let Z=0;Z<k.length;Z++){let E=k[Z],O=z/K*E+C/K*Q+N/K*X-w/K*U-v/K*$;X=Q,Q=E,$=U,U=O,k[Z]=O}}else{let M=A[0];for(let Y=0;Y<k.length;Y++){let j=A[Y]??M,z=2*Math.PI*j/F,C=Math.sin(z)/2,N=(1+Math.cos(z))/2,K=-(1+Math.cos(z)),w=(1+Math.cos(z))/2,v=1+C,Z=-2*Math.cos(z),E=1-C,O=k[Y],R=N/v*O+K/v*Q+w/v*X-Z/v*U-E/v*$;X=Q,Q=O,$=U,U=R,k[Y]=R}}T[J]={x_1:Q,x_2:X,y_1:U,y_2:$}}}function P0(V,A,F,T){let{type:J,data:k}=A;switch(J){case\"buffer\":return _0(V,k),n(V,T),[];case\"bufferInit\":{let Q=k;return V.buffer=H0(Q.channels,Q.totalLength),V.streamBuffer={...i(),totalLength:Q.totalLength,streamEnded:!1,streaming:Q.streaming??!0},n(V,T),[]}case\"bufferRange\":return V.streamBuffer.pendingWrites.push(k),[];case\"bufferEnd\":{let Q=k;if(Q?.totalLength!=null)V.streamBuffer.totalLength=Q.totalLength;return V.streamBuffer.streamEnded=!0,[]}case\"bufferReset\":return V.buffer=[],V.streamBuffer=i(),n(V,T),[];case\"start\":V.timesLooped=0;{let Q=k;if(V.duration=Q?.duration??-1,V.duration===-1)V.duration=V.loop?Number.MAX_SAFE_INTEGER:(V.buffer[0]?.length??0)/T;e(V,Q?.offset,T),n(V,T),V.playhead=V.offset,V.startWhen=Q?.when??F,V.stopWhen=V.startWhen+V.duration,V.playedSamples=0,V.state=P.Scheduled}return[{type:\"scheduled\"}];case\"stop\":if(V.state===P.Ended||V.state===P.Initial)return[];return V.stopWhen=k??V.stopWhen,V.state=P.Stopped,[{type:\"stopped\"}];case\"pause\":return V.state=P.Paused,V.pauseWhen=k??F,[{type:\"paused\"}];case\"resume\":return V.state=P.Started,V.startWhen=k??F,[{type:\"resume\"}];case\"dispose\":return V.state=P.Disposed,V.buffer=[],V.streamBuffer=i(),[{type:\"disposed\"}];case\"loop\":{let Q=k,X=V.state;if(Q&&(X===P.Scheduled||X===P.Started))V.stopWhen=Number.MAX_SAFE_INTEGER,V.duration=Number.MAX_SAFE_INTEGER;if(V.loop=Q,Q)n(V,T);return[]}case\"loopStart\":return V.loopStart=k,[];case\"loopEnd\":return V.loopEnd=k,[];case\"loopCrossfade\":return V.loopCrossfade=k,[];case\"playhead\":return V.playhead=Math.floor(k),[];case\"fadeIn\":return V.fadeInDuration=k,[];case\"fadeOut\":return V.fadeOutDuration=k,[];case\"toggleGain\":return V.enableGain=k??!V.enableGain,[];case\"togglePan\":return V.enablePan=k??!V.enablePan,[];case\"toggleLowpass\":return V.enableLowpass=k??!V.enableLowpass,[];case\"toggleHighpass\":return V.enableHighpass=k??!V.enableHighpass,[];case\"toggleDetune\":return V.enableDetune=k??!V.enableDetune,[];case\"togglePlaybackRate\":return V.enablePlaybackRate=k??!V.enablePlaybackRate,[];case\"toggleFadeIn\":return V.enableFadeIn=k??!V.enableFadeIn,[];case\"toggleFadeOut\":return V.enableFadeOut=k??!V.enableFadeOut,[];case\"toggleLoopStart\":return V.enableLoopStart=k??!V.enableLoopStart,[];case\"toggleLoopEnd\":return V.enableLoopEnd=k??!V.enableLoopEnd,[];case\"toggleLoopCrossfade\":return V.enableLoopCrossfade=k??!V.enableLoopCrossfade,[];case\"logState\":return[]}return[]}function j0(V,A,F,T,J){let k=[],Q=V.state;if(Q===P.Disposed)return{keepAlive:!1,messages:k};if(y0(V),Q===P.Initial)return{keepAlive:!0,messages:k};if(Q===P.Ended)return h(A[0]),{keepAlive:!0,messages:k};if(Q===P.Scheduled)if(T.currentTime>=V.startWhen)Q=V.state=P.Started,k.push({type:\"started\"});else return h(A[0]),{keepAlive:!0,messages:k};else if(Q===P.Paused){if(T.currentTime>V.pauseWhen)return h(A[0]),{keepAlive:!0,messages:k}}if(T.currentTime>V.stopWhen)return h(A[0]),V.state=P.Ended,k.push({type:\"ended\"}),V.playedSamples=0,{keepAlive:!0,messages:k};let X=A[0],U=o(V);if(U===0)return h(X),{keepAlive:!0,messages:k};let{playbackRate:$,detune:M,lowpass:Y,highpass:j,gain:z,pan:C}=F,{buffer:N,loopStart:K,loopEnd:w,loopCrossfade:v,stopWhen:Z,playedSamples:E,enableLowpass:O,enableHighpass:R,enableGain:d,enablePan:b,enableDetune:c,enableFadeOut:g,enableFadeIn:s,enableLoopStart:t,enableLoopEnd:r,enableLoopCrossfade:p,playhead:D,fadeInDuration:A0,fadeOutDuration:F0}=V,K0=V.streamBuffer.streaming&&V.streamBuffer.committedLength<U,k0=V.loop&&!K0,u=Math.min(N.length,X.length),W0=V.duration*T.sampleRate,Z0=Math.floor(T.sampleRate*v),q0=Math.max(U-_,0),L=t?Math.min(Math.floor(K*T.sampleRate),q0):0,x=r?Math.min(Math.floor(w*T.sampleRate),U):U,N0=x-L,T0=c&&M.length>0&&M[0]!==0,l=$;if(T0){let G=Math.max($.length,M.length,_);l=new Float32Array(G);for(let W=0;W<G;W++){let I=$[W]??$[$.length-1],H=M[W]??M[M.length-1];l[W]=I*2**(H/1200)}}let J0=V.enablePlaybackRate||T0,O0=J0&&l.length>0&&l.every((G)=>G===0);if(V.streamBuffer.streaming&&!V.streamBuffer.streamEnded&&!V.streamBuffer.lowWaterNotified&&V.streamBuffer.committedLength-Math.floor(D)<V.streamBuffer.lowWaterThreshold)k.push({type:\"bufferLowWater\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength}}),V.streamBuffer.lowWaterNotified=!0;if(O0){h(X);for(let G=1;G<A.length;G++)M0(X,A[G]);return{keepAlive:!0,messages:k}}let Q0={bufferLength:U,loop:k0,playhead:D,loopStartSamples:L,loopEndSamples:x,durationSamples:W0,playbackRates:l},{indexes:a,ended:U0,looped:X0,playhead:Y0}=J0?x0(Q0):L0(Q0),f=a.find((G)=>G>=V.streamBuffer.committedLength&&G<U);if(f!==void 0&&!V.streamBuffer.streamEnded&&V.streamBuffer.lastUnderrunSample!==f)k.push({type:\"bufferUnderrun\",data:{playhead:Math.floor(D),committedLength:V.streamBuffer.committedLength,requestedSample:f}}),V.streamBuffer.lastUnderrunSample=f;else if(f===void 0)V.streamBuffer.lastUnderrunSample=null;m0(X,N,a);let m=Math.min(Math.floor(v*T.sampleRate),N0),D0=k0&&D>L&&D<x,C0=p&&Z0>0&&U>_;if(D0&&C0){{let G=L+m;if(m>0&&D>L&&D<G){let W=D-L,I=Math.min(Math.floor(G-D),_);for(let H=0;H<I;H++){let B=(W+H)/m,S=Math.cos(Math.PI*B/2),q=Math.floor(x-m+W+H);if(q>=0&&q<U)for(let y=0;y<u;y++)X[y][H]+=N[y][q]*S}}}{let G=x-m;if(m>0&&D>G&&D<x){let W=D-G,I=Math.min(Math.floor(x-D),_);for(let H=0;H<I;H++){let B=(W+H)/m,S=Math.sin(Math.PI*B/2),q=Math.floor(L+W+H);if(q>=0&&q<U)for(let y=0;y<u;y++)X[y][H]+=N[y][q]*S}}}}if(s&&A0>0){let G=Math.floor(A0*T.sampleRate),W=G-E;if(W>0){let I=Math.min(W,_);for(let H=0;H<I;H++){let B=(E+H)/G,S=B*B*B;for(let q=0;q<u;q++)X[q][H]*=S}}}if(g&&F0>0){let G=Math.floor(F0*T.sampleRate),W=Math.floor(T.sampleRate*(Z-T.currentTime));if(W<G+_)for(let I=0;I<_;I++){let H=W-I;if(H>=G)continue;let B=H<=0?0:H/G,S=B*B*B;for(let q=0;q<u;q++)X[q][I]*=S}}if(O)d0(X,Y,T.sampleRate,J.lowpass);if(R)u0(X,j,T.sampleRate,J.highpass);if(d)g0(X,z);if(u===1)S0(X);if(b)h0(X,C);if(X0)V.timesLooped++,k.push({type:\"looped\",data:V.timesLooped});if(U0)V.state=P.Ended,k.push({type:\"ended\"});V.playedSamples+=a.length,V.playhead=Y0;let $0=c0(X);if($0>0)return console.log({numNans:$0,indexes:a,playhead:Y0,ended:U0,looped:X0,sourceLength:U}),{keepAlive:!0,messages:k};for(let G=1;G<A.length;G++)M0(X,A[G]);return{keepAlive:!0,messages:k}}class z0 extends AudioWorkletProcessor{static get parameterDescriptors(){return[{name:\"playbackRate\",automationRate:\"a-rate\",defaultValue:1},{name:\"detune\",automationRate:\"a-rate\",defaultValue:0},{name:\"gain\",automationRate:\"a-rate\",defaultValue:1,minValue:0},{name:\"pan\",automationRate:\"a-rate\",defaultValue:0},{name:\"highpass\",automationRate:\"a-rate\",defaultValue:20,minValue:20,maxValue:20000},{name:\"lowpass\",automationRate:\"a-rate\",defaultValue:20000,minValue:20,maxValue:20000}]}properties;filterState={lowpass:V0(),highpass:V0()};lastFrameTime=0;constructor(V){super(V);this.properties=v0(V?.processorOptions,sampleRate),this.port.onmessage=(A)=>{let F=P0(this.properties,A.data,currentTime,sampleRate);for(let T of F)this.port.postMessage(T);if(this.properties.state===P.Disposed)this.port.close()}}process(V,A,F){try{let T=j0(this.properties,A,F,{currentTime,currentFrame,sampleRate},this.filterState);for(let k of T.messages)this.port.postMessage(k);let J=currentTime-this.lastFrameTime;return this.lastFrameTime=currentTime,this.port.postMessage({type:\"frame\",data:[currentTime,currentFrame,Math.floor(this.properties.playhead),J*1000]}),T.keepAlive}catch(T){return this.port.postMessage({type:\"processorError\",data:{error:String(T),state:this.properties.state,bufferChannels:this.properties.buffer?.length,bufferLength:this.properties.buffer?.[0]?.length,paramKeys:Object.keys(F),hasPlaybackRate:!!F.playbackRate,hasDetune:!!F.detune,hasGain:!!F.gain,hasPan:!!F.pan,outputChannels:A[0]?.length}}),!0}}}registerProcessor(\"ClipProcessor\",z0);\n\n//# debugId=12FC7555EABD465B64756E2164756E21\n//# sourceMappingURL=processor.js.map\n";
@@ -1,6 +1,6 @@
1
1
  // processor-kernel.ts — Pure DSP logic, state machine, all filters
2
2
  // NO AudioWorklet or platform dependencies. Fully testable.
3
- import { State, } from "./types";
3
+ import { State, } from "./types.js";
4
4
  // ---------------------------------------------------------------------------
5
5
  // Constants
6
6
  // ---------------------------------------------------------------------------
@@ -1,8 +1,8 @@
1
1
  // AudioWorklet processor — runs in AudioWorkletGlobalScope
2
2
  // Bundled separately and served at /processor.js
3
3
  // This is a thin shell — all DSP logic lives in processor-kernel.ts
4
- import { createFilterState, getProperties, handleProcessorMessage, processBlock, } from "./processor-kernel";
5
- import { State } from "./types";
4
+ import { createFilterState, getProperties, handleProcessorMessage, processBlock, } from "./processor-kernel.js";
5
+ import { State } from "./types.js";
6
6
  class ClipProcessor extends AudioWorkletProcessor {
7
7
  static get parameterDescriptors() {
8
8
  return [
@@ -72,7 +72,21 @@ class ClipProcessor extends AudioWorkletProcessor {
72
72
  return result.keepAlive;
73
73
  }
74
74
  catch (e) {
75
- console.log(e);
75
+ this.port.postMessage({
76
+ type: "processorError",
77
+ data: {
78
+ error: String(e),
79
+ state: this.properties.state,
80
+ bufferChannels: this.properties.buffer?.length,
81
+ bufferLength: this.properties.buffer?.[0]?.length,
82
+ paramKeys: Object.keys(parameters),
83
+ hasPlaybackRate: !!parameters.playbackRate,
84
+ hasDetune: !!parameters.detune,
85
+ hasGain: !!parameters.gain,
86
+ hasPan: !!parameters.pan,
87
+ outputChannels: outputs[0]?.length,
88
+ },
89
+ });
76
90
  return true;
77
91
  }
78
92
  }
@@ -1 +1 @@
1
- export declare const VERSION = "0.1.4";
1
+ export declare const VERSION = "0.1.6";
@@ -1,2 +1,2 @@
1
1
  // AUTO-GENERATED — do not edit. Run 'bun run build:lib' to regenerate.
2
- export const VERSION = "0.1.4";
2
+ export const VERSION = "0.1.6";
@@ -1,5 +1,5 @@
1
- import { processorCode } from "./processor-code";
2
- import { VERSION } from "./version";
1
+ import { processorCode } from "./processor-code.js";
2
+ import { VERSION } from "./version.js";
3
3
  const PACKAGE_NAME = "@jadujoel/web-audio-clip-node";
4
4
  const PACKAGE_VERSION = VERSION;
5
5
  /** Blob URL from embedded processor code. Zero-config, default for npm users. */
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useCallback, useId, useMemo, useRef, useState } from "react";
3
- import { generateSnapPoints, getSnappedValue, presets } from "../audio/utils";
4
- import { formatTickLabel, formatValueText } from "../controls/formatValueText";
5
- import { ContextMenu } from "./ContextMenu";
6
- import { SnappableSlider } from "./SnappableSlider";
3
+ import { generateSnapPoints, getSnappedValue, presets } from "../audio/utils.js";
4
+ import { formatTickLabel, formatValueText } from "../controls/formatValueText.js";
5
+ import { ContextMenu } from "./ContextMenu.js";
6
+ import { SnappableSlider } from "./SnappableSlider.js";
7
7
  function AudioControlInner({ label, controlKey, min: propMin, max: propMax, value, defaultValue, step, tempo = 120, snap = "none", preset, title, enabled = true, hasToggle = false, hasSnap = false, hasMaxLock = false, audioDuration, maxLocked = false, onChange, onToggle, onSnapChange, onMinChange, onMaxChange, onMaxLockedChange, }) {
8
8
  const [isEditing, setIsEditing] = useState(false);
9
9
  const [editText, setEditText] = useState("");
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useId } from "react";
3
- import { AudioControl } from "./AudioControl";
3
+ import { AudioControl } from "./AudioControl.js";
4
4
  /** Build a set of control keys that belong to a linked pair,
5
5
  * and a map from the first control key to its pair def. */
6
6
  function buildPairMaps(pairs) {
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useCallback, useId, useRef, useState } from "react";
3
- import { presets } from "../audio/utils";
4
- import { SnappableSlider } from "./SnappableSlider";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
5
  function DetuneControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
6
6
  const preset = presets.cents;
7
7
  const min = preset.min ?? -2400;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useCallback, useId, useRef, useState } from "react";
3
- import { presets } from "../audio/utils";
4
- import { SnappableSlider } from "./SnappableSlider";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
5
  function formatHz(value) {
6
6
  if (value >= 1000)
7
7
  return `${(value / 1000).toFixed(1)} kHz`;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useCallback, useId, useRef, useState } from "react";
3
- import { presets } from "../audio/utils";
4
- import { SnappableSlider } from "./SnappableSlider";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
5
  function GainControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
6
6
  const preset = presets.gain;
7
7
  const min = preset.min ?? -100;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useCallback, useId, useRef, useState } from "react";
3
- import { presets } from "../audio/utils";
4
- import { SnappableSlider } from "./SnappableSlider";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
5
  function formatPan(value) {
6
6
  if (Math.abs(value) < 0.005)
7
7
  return "C";
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useCallback, useId, useRef, useState } from "react";
3
- import { presets } from "../audio/utils";
4
- import { SnappableSlider } from "./SnappableSlider";
3
+ import { presets } from "../audio/utils.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
5
  function PlaybackRateControlInner({ value, defaultValue, enabled, onChange, onToggle, }) {
6
6
  const preset = presets.playbackRate;
7
7
  const min = preset.min ?? -4;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { memo, useCallback, useId } from "react";
3
- import { SAMPLE_RATE } from "../controls/controlDefs";
4
- import { SnappableSlider } from "./SnappableSlider";
3
+ import { SAMPLE_RATE } from "../controls/controlDefs.js";
4
+ import { SnappableSlider } from "./SnappableSlider.js";
5
5
  function formatTime(seconds) {
6
6
  const m = Math.floor(seconds / 60);
7
7
  const s = seconds % 60;
@@ -49,6 +49,7 @@ export const controlDefs = [
49
49
  snap: "beat",
50
50
  hasSnap: true,
51
51
  hasToggle: true,
52
+ hasMaxLock: true,
52
53
  title: "Delay before stopping (seconds).",
53
54
  },
54
55
  {
@@ -60,6 +61,7 @@ export const controlDefs = [
60
61
  snap: "beat",
61
62
  hasSnap: true,
62
63
  hasToggle: true,
64
+ hasMaxLock: true,
63
65
  title: "Fade-in duration (seconds).",
64
66
  },
65
67
  {
@@ -71,6 +73,7 @@ export const controlDefs = [
71
73
  snap: "beat",
72
74
  hasSnap: true,
73
75
  hasToggle: true,
76
+ hasMaxLock: true,
74
77
  title: "Fade-out duration (seconds).",
75
78
  },
76
79
  ];
@@ -1,10 +1,10 @@
1
1
  import { useCallback, useEffect, useRef, useState } from "react";
2
- import { ClipNode } from "../audio/ClipNode";
3
- import { float32ArrayFromAudioBuffer, linFromDb } from "../audio/utils";
4
- import { getProcessorModuleUrl } from "../audio/workletUrl";
5
- import { SAMPLE_RATE } from "../controls/controlDefs";
6
- import { loadFromCache } from "../data/cache";
7
- import { loadUploadedFile, saveUploadedFile } from "../data/fileStore";
2
+ import { ClipNode } from "../audio/ClipNode.js";
3
+ import { float32ArrayFromAudioBuffer, linFromDb } from "../audio/utils.js";
4
+ import { getProcessorBlobUrl } from "../audio/workletUrl.js";
5
+ import { SAMPLE_RATE } from "../controls/controlDefs.js";
6
+ import { loadFromCache } from "../data/cache.js";
7
+ import { loadUploadedFile, saveUploadedFile } from "../data/fileStore.js";
8
8
  function applyValue(node, key, value) {
9
9
  switch (key) {
10
10
  case "playhead":
@@ -136,7 +136,7 @@ export function useClipNode({ values, enabled, loop, setValue, }) {
136
136
  if (ctxRef.current)
137
137
  return ctxRef.current;
138
138
  const ctx = new AudioContext({ sampleRate: SAMPLE_RATE });
139
- await ctx.audioWorklet.addModule(getProcessorModuleUrl());
139
+ await ctx.audioWorklet.addModule(getProcessorBlobUrl());
140
140
  ctxRef.current = ctx;
141
141
  return ctx;
142
142
  }, []);
package/dist/lib-react.js CHANGED
@@ -1,17 +1,17 @@
1
1
  // Store
2
2
  // Components
3
- export { AudioControl } from "./components/AudioControl";
4
- export { ContextMenu } from "./components/ContextMenu";
5
- export { ControlSection } from "./components/ControlSection";
6
- export { DetuneControl } from "./components/DetuneControl";
7
- export { DisplayPanel } from "./components/DisplayPanel";
8
- export { FilterControl } from "./components/FilterControl";
9
- export { GainControl } from "./components/GainControl";
10
- export { PanControl } from "./components/PanControl";
11
- export { PlaybackRateControl } from "./components/PlaybackRateControl";
12
- export { PlayheadSlider } from "./components/PlayheadSlider";
13
- export { SnappableSlider } from "./components/SnappableSlider";
14
- export { TransportButtons } from "./components/TransportButtons";
3
+ export { AudioControl } from "./components/AudioControl.js";
4
+ export { ContextMenu } from "./components/ContextMenu.js";
5
+ export { ControlSection } from "./components/ControlSection.js";
6
+ export { DetuneControl } from "./components/DetuneControl.js";
7
+ export { DisplayPanel } from "./components/DisplayPanel.js";
8
+ export { FilterControl } from "./components/FilterControl.js";
9
+ export { GainControl } from "./components/GainControl.js";
10
+ export { PanControl } from "./components/PanControl.js";
11
+ export { PlaybackRateControl } from "./components/PlaybackRateControl.js";
12
+ export { PlayheadSlider } from "./components/PlayheadSlider.js";
13
+ export { SnappableSlider } from "./components/SnappableSlider.js";
14
+ export { TransportButtons } from "./components/TransportButtons.js";
15
15
  // Hooks
16
- export { useClipNode } from "./hooks/useClipNode";
17
- export { useClipControls } from "./store/clipStore";
16
+ export { useClipNode } from "./hooks/useClipNode.js";
17
+ export { useClipControls } from "./store/clipStore.js";