@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.
- package/README.md +61 -4
- package/dist/audio/ClipNode.js +1 -1
- package/dist/audio/processor-code.d.ts +1 -1
- package/dist/audio/processor-code.js +1 -1
- package/dist/audio/processor-kernel.js +1 -1
- package/dist/audio/processor.js +17 -3
- package/dist/audio/version.d.ts +1 -1
- package/dist/audio/version.js +1 -1
- package/dist/audio/workletUrl.js +2 -2
- package/dist/components/AudioControl.js +4 -4
- package/dist/components/ControlSection.js +1 -1
- package/dist/components/DetuneControl.js +2 -2
- package/dist/components/FilterControl.js +2 -2
- package/dist/components/GainControl.js +2 -2
- package/dist/components/PanControl.js +2 -2
- package/dist/components/PlaybackRateControl.js +2 -2
- package/dist/components/PlayheadSlider.js +2 -2
- package/dist/controls/controlDefs.js +3 -0
- package/dist/hooks/useClipNode.js +7 -7
- package/dist/lib-react.js +14 -14
- package/dist/lib.bundle.js +3 -3
- package/dist/lib.bundle.js.map +2 -2
- package/dist/lib.js +11 -11
- package/dist/processor.js +2 -2
- package/dist/processor.js.map +3 -3
- package/dist/store/clipStore.js +2 -2
- package/dist/styles.css.d.ts +3 -0
- package/examples/cdn-vanilla/index.html +2 -2
- package/examples/esm-bundler/package.json +1 -1
- package/examples/index.html +16 -0
- package/examples/react/README.md +1 -1
- package/examples/react/bun.lock +45 -0
- package/examples/react/package.json +1 -1
- package/examples/react/src/App.tsx +56 -6
- package/examples/react/src/css.d.ts +1 -0
- package/examples/react/tsconfig.json +15 -0
- package/examples/self-hosted/README.md +4 -4
- package/examples/self-hosted/package.json +4 -9
- package/examples/self-hosted/public/processor.js +4 -0
- package/examples/self-hosted/src/main.ts +1 -3
- package/package.json +6 -2
- 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 {
|
|
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({
|
|
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
|
-
|
|
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
|
package/dist/audio/ClipNode.js
CHANGED
|
@@ -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
|
// ---------------------------------------------------------------------------
|
package/dist/audio/processor.js
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|
package/dist/audio/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "0.1.
|
|
1
|
+
export declare const VERSION = "0.1.6";
|
package/dist/audio/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// AUTO-GENERATED — do not edit. Run 'bun run build:lib' to regenerate.
|
|
2
|
-
export const VERSION = "0.1.
|
|
2
|
+
export const VERSION = "0.1.6";
|
package/dist/audio/workletUrl.js
CHANGED
|
@@ -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 {
|
|
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(
|
|
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";
|