@jadujoel/web-audio-clip-node 0.1.5 → 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 +50 -4
- package/dist/audio/ClipNode.js +1 -1
- package/dist/audio/processor-kernel.js +1 -1
- package/dist/audio/processor.js +2 -2
- 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/hooks/useClipNode.js +7 -7
- package/dist/lib-react.js +14 -14
- package/dist/lib.bundle.js +1 -1
- package/dist/lib.bundle.js.map +1 -1
- package/dist/lib.js +11 -11
- 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/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/package.json +2 -4
- 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/examples/self-hosted/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
|
}
|
package/dist/audio/ClipNode.js
CHANGED
|
@@ -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 [
|
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;
|
|
@@ -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";
|
package/dist/lib.bundle.js
CHANGED
|
@@ -2,5 +2,5 @@ function ve(e){return Math.max(20*Math.log10(e),-1e3)}function Ue(e){return 10**
|
|
|
2
2
|
|
|
3
3
|
//# debugId=12FC7555EABD465B64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=processor.js.map
|
|
5
|
-
`;var b={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var E=128;function K(e=[]){let t=e[0]?.length??0,a=t>0;return{totalLength:a?t:null,committedLength:a?t:0,streamEnded:a,streaming:!1,writtenSpans:a?[{startSample:0,endSample:t}]:[],pendingWrites:[],lowWaterThreshold:E*4,lowWaterNotified:!1,lastUnderrunSample:null}}function ye(e){return e[0]?.length??0}function Y(e){return e.streamBuffer.totalLength??ye(e.buffer)}function Se(e,t){return Array.from({length:e},()=>new Float32Array(t))}function Ke(e,t){let a=[...e,t].sort((r,n)=>r.startSample-n.startSample),o=[];for(let r of a){let n=o[o.length-1];if(!n||r.startSample>n.endSample){o.push({...r});continue}n.endSample=Math.max(n.endSample,r.endSample)}return o}function Ye(e){let t=0;for(let a of e){if(a.startSample>t)break;t=Math.max(t,a.endSample)}return t}function He(e,t){e.committedLength-Math.floor(t)>=e.lowWaterThreshold&&(e.lowWaterNotified=!1)}function qe(e,t,a){let o=ye(e.buffer),r=e.buffer.length;if(o>=a&&r>=t)return;let n=Math.max(o,a),s=Math.max(r,t),l=Se(s,n);for(let i=0;i<r;i++)l[i].set(e.buffer[i].subarray(0,o));e.buffer=l,(e.streamBuffer.totalLength==null||e.streamBuffer.totalLength<n)&&(e.streamBuffer.totalLength=n)}function je(e,t){let a=Math.max(Math.floor(t.startSample),0),o=t.channelData[0]?.length??0,r=t.totalLength??null,n=Math.max(a+o,r??0);qe(e,Math.max(t.channelData.length,e.buffer.length,1),n);for(let s=0;s<t.channelData.length;s++)e.buffer[s].set(t.channelData[s],a);r!=null&&(e.streamBuffer.totalLength=r),o>0&&(e.streamBuffer.writtenSpans=Ke(e.streamBuffer.writtenSpans,{startSample:a,endSample:a+o}),e.streamBuffer.committedLength=Ye(e.streamBuffer.writtenSpans)),t.streamEnded===!0&&(e.streamBuffer.streamEnded=!0),He(e.streamBuffer,e.playhead)}function ze(e){if(e.streamBuffer.pendingWrites.length!==0){for(let t of e.streamBuffer.pendingWrites)je(e,t);e.streamBuffer.pendingWrites=[]}}function Ze(e,t){e.buffer=t,e.streamBuffer=K(t)}function et(e={},t){let{buffer:a=[],streamBuffer:o=K(a),duration:r=-1,loop:n=!1,loopStart:s=0,loopEnd:l=(a[0]?.length??0)/t,loopCrossfade:i=0,playhead:f=0,offset:d=0,startWhen:u=0,stopWhen:h=0,pauseWhen:m=0,resumeWhen:M=0,playedSamples:V=0,state:y=b.Initial,timesLooped:P=0,fadeInDuration:g=0,fadeOutDuration:x=0,enableFadeIn:A=g>0,enableFadeOut:F=x>0,enableLoopStart:R=!0,enableLoopEnd:N=!0,enableLoopCrossfade:_=i>0,enableHighpass:W=!0,enableLowpass:v=!0,enableGain:z=!0,enablePan:Z=!0,enableDetune:ee=!0,enablePlaybackRate:te=!0}=e;return{buffer:a,streamBuffer:o,loop:n,loopStart:s,loopEnd:l,loopCrossfade:i,duration:r,playhead:f,offset:d,startWhen:u,stopWhen:h,pauseWhen:m,resumeWhen:M,playedSamples:V,state:y,timesLooped:P,fadeInDuration:g,fadeOutDuration:x,enableFadeIn:A,enableFadeOut:F,enableLoopStart:R,enableLoopEnd:N,enableHighpass:W,enableLowpass:v,enableGain:z,enablePan:Z,enableDetune:ee,enablePlaybackRate:te,enableLoopCrossfade:_}}function tt(e,t){return Y(e)/t}function X(e,t){let a=tt(e,t);if(a<=0){e.loopStart=0,e.loopEnd=0;return}(!Number.isFinite(e.loopStart)||e.loopStart<0)&&(e.loopStart=0),e.loopStart>=a&&(e.loopStart=0),(!Number.isFinite(e.loopEnd)||e.loopEnd<=e.loopStart||e.loopEnd>a)&&(e.loopEnd=a)}function re(e,t,a){if(t===void 0)return e.offset=0,0;if(t<0)return re(e,Y(e)+t,a);if(t>(Y(e)||1)-1)return re(e,Y(e)%t,a);let o=Math.floor(t*a);return e.offset=o,o}function at(e){let{playhead:t,bufferLength:a,loop:o,loopStartSamples:r,loopEndSamples:n}=e,s=128;!o&&t+128>a&&(s=Math.max(a-t,0));let l=new Array(s);if(!o){for(let u=0,h=t;u<s;u++,h++)l[u]=h;let d=t+s;return{playhead:d,indexes:l,looped:!1,ended:d>=a}}let i=t,f=!1;for(let d=0;d<s;d++,i++)i>=n&&(i=r+(i-n),f=!0),l[d]=i;return{indexes:l,looped:f,ended:!1,playhead:i}}function ot(e){let{playhead:t,bufferLength:a,loop:o,loopStartSamples:r,loopEndSamples:n,playbackRates:s}=e,l=128;!o&&t+128>a&&(l=Math.max(a-t,0));let i=new Array(l),f=t,d=!1;if(o){for(let u=0;u<l;u++){i[u]=Math.min(Math.max(Math.floor(f),0),a-1);let h=s[u]??s[0]??1;f+=h,h>=0&&(f>n||f>a)?(f=r,d=!0):h<0&&(f<r||f<0)&&(f=n,d=!0)}return{playhead:f,indexes:i,looped:d,ended:!1}}for(let u=0;u<l;u++)i[u]=Math.min(Math.max(Math.floor(f),0),a-1),f+=s[u]??s[0]??1;return{playhead:f,indexes:i,looped:!1,ended:f>=a||f<0}}function nt(e,t,a){let o=Math.min(e.length,t.length);for(let r=0;r<a.length;r++)for(let n=0;n<o;n++)e[n][r]=t[n][a[r]];for(let r=o;r<e.length;r++)for(let n=0;n<e[r].length;n++)e[r][n]=0;for(let r=a.length;r<e[0].length;r++)for(let n=0;n<o;n++)e[n][r]=0}function U(e){for(let t=0;t<e.length;t++)for(let a=0;a<e[t].length;a++)e[t][a]=0}function rt(e){if(e.length>=2)for(let t=0;t<e[0].length;t++)e[1][t]=e[0][t];else{let t=new Float32Array(e[0].length);for(let a=0;a<e[0].length;a++)t[a]=e[0][a];e.push(t)}}function be(e,t){for(let a=t.length;a<e.length;a++)t[a]=new Float32Array(e[a].length);for(let a=0;a<e.length;a++)for(let o=0;o<e[a].length;o++)t[a][o]=e[a][o]}function st(e){let t=0;for(let a=0;a<e.length;a++)for(let o=0;o<e[a].length;o++)Number.isNaN(e[a][o])&&(t++,e[a][o]=0);return t}function lt(){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 it(e,t){if(t.length===1){let o=t[0];if(o===1)return;for(let r of e)for(let n=0;n<r.length;n++)r[n]*=o;return}let a=t[0];for(let o of e)for(let r=0;r<o.length;r++)a=t[r]??a,o[r]*=a}function ut(e,t){let a=t[0];for(let o=0;o<e[0].length;o++){a=t[o]??a;let r=a<=0?1:1-a,n=a>=0?1:1+a;e[0][o]*=r,e[1][o]*=n}}function ft(e,t,a,o){for(let r=0;r<e.length;r++){let n=e[r],{x_1:s,x_2:l,y_1:i,y_2:f}=o[r]??{x_1:0,x_2:0,y_1:0,y_2:0};if(t.length===1){let d=t[0];if(d>=2e4)return;let u=2*Math.PI*d/a,h=Math.sin(u)/2,m=(1-Math.cos(u))/2,M=1-Math.cos(u),V=(1-Math.cos(u))/2,y=1+h,P=-2*Math.cos(u),g=1-h,x=m/y,A=M/y,F=V/y,R=P/y,N=g/y;for(let _=0;_<n.length;_++){let W=n[_],v=x*W+A*s+F*l-R*i-N*f;l=s,s=W,f=i,i=v,n[_]=v}}else{let d=t[0];for(let u=0;u<n.length;u++){let h=t[u]??d,m=2*Math.PI*h/a,M=Math.sin(m)/2,V=(1-Math.cos(m))/2,y=1-Math.cos(m),P=(1-Math.cos(m))/2,g=1+M,x=-2*Math.cos(m),A=1-M,F=n[u],R=V/g*F+y/g*s+P/g*l-x/g*i-A/g*f;l=s,s=F,f=i,i=R,n[u]=R}}o[r]={x_1:s,x_2:l,y_1:i,y_2:f}}}function dt(e,t,a,o){for(let r=0;r<e.length;r++){let n=e[r],{x_1:s,x_2:l,y_1:i,y_2:f}=o[r]??{x_1:0,x_2:0,y_1:0,y_2:0};if(t.length===1){let d=t[0];if(d<=20)return;let u=2*Math.PI*d/a,h=Math.sin(u)/2,m=(1+Math.cos(u))/2,M=-(1+Math.cos(u)),V=(1+Math.cos(u))/2,y=1+h,P=-2*Math.cos(u),g=1-h;for(let x=0;x<n.length;x++){let A=n[x],F=m/y*A+M/y*s+V/y*l-P/y*i-g/y*f;l=s,s=A,f=i,i=F,n[x]=F}}else{let d=t[0];for(let u=0;u<n.length;u++){let h=t[u]??d,m=2*Math.PI*h/a,M=Math.sin(m)/2,V=(1+Math.cos(m))/2,y=-(1+Math.cos(m)),P=(1+Math.cos(m))/2,g=1+M,x=-2*Math.cos(m),A=1-M,F=n[u],R=V/g*F+y/g*s+P/g*l-x/g*i-A/g*f;l=s,s=F,f=i,i=R,n[u]=R}}o[r]={x_1:s,x_2:l,y_1:i,y_2:f}}}function pt(e,t,a,o){let{type:r,data:n}=t;switch(r){case"buffer":return Ze(e,n),X(e,o),[];case"bufferInit":{let s=n;return e.buffer=Se(s.channels,s.totalLength),e.streamBuffer={...K(),totalLength:s.totalLength,streamEnded:!1,streaming:s.streaming??!0},X(e,o),[]}case"bufferRange":return e.streamBuffer.pendingWrites.push(n),[];case"bufferEnd":{let s=n;return s?.totalLength!=null&&(e.streamBuffer.totalLength=s.totalLength),e.streamBuffer.streamEnded=!0,[]}case"bufferReset":return e.buffer=[],e.streamBuffer=K(),X(e,o),[];case"start":e.timesLooped=0;{let s=n;e.duration=s?.duration??-1,e.duration===-1&&(e.duration=e.loop?Number.MAX_SAFE_INTEGER:(e.buffer[0]?.length??0)/o),re(e,s?.offset,o),X(e,o),e.playhead=e.offset,e.startWhen=s?.when??a,e.stopWhen=e.startWhen+e.duration,e.playedSamples=0,e.state=b.Scheduled}return[{type:"scheduled"}];case"stop":return e.state===b.Ended||e.state===b.Initial?[]:(e.stopWhen=n??e.stopWhen,e.state=b.Stopped,[{type:"stopped"}]);case"pause":return e.state=b.Paused,e.pauseWhen=n??a,[{type:"paused"}];case"resume":return e.state=b.Started,e.startWhen=n??a,[{type:"resume"}];case"dispose":return e.state=b.Disposed,e.buffer=[],e.streamBuffer=K(),[{type:"disposed"}];case"loop":{let s=n,l=e.state;return s&&(l===b.Scheduled||l===b.Started)&&(e.stopWhen=Number.MAX_SAFE_INTEGER,e.duration=Number.MAX_SAFE_INTEGER),e.loop=s,s&&X(e,o),[]}case"loopStart":return e.loopStart=n,[];case"loopEnd":return e.loopEnd=n,[];case"loopCrossfade":return e.loopCrossfade=n,[];case"playhead":return e.playhead=Math.floor(n),[];case"fadeIn":return e.fadeInDuration=n,[];case"fadeOut":return e.fadeOutDuration=n,[];case"toggleGain":return e.enableGain=n??!e.enableGain,[];case"togglePan":return e.enablePan=n??!e.enablePan,[];case"toggleLowpass":return e.enableLowpass=n??!e.enableLowpass,[];case"toggleHighpass":return e.enableHighpass=n??!e.enableHighpass,[];case"toggleDetune":return e.enableDetune=n??!e.enableDetune,[];case"togglePlaybackRate":return e.enablePlaybackRate=n??!e.enablePlaybackRate,[];case"toggleFadeIn":return e.enableFadeIn=n??!e.enableFadeIn,[];case"toggleFadeOut":return e.enableFadeOut=n??!e.enableFadeOut,[];case"toggleLoopStart":return e.enableLoopStart=n??!e.enableLoopStart,[];case"toggleLoopEnd":return e.enableLoopEnd=n??!e.enableLoopEnd,[];case"toggleLoopCrossfade":return e.enableLoopCrossfade=n??!e.enableLoopCrossfade,[];case"logState":return[]}return[]}function ht(e,t,a,o,r){let n=[],s=e.state;if(s===b.Disposed)return{keepAlive:!1,messages:n};if(ze(e),s===b.Initial)return{keepAlive:!0,messages:n};if(s===b.Ended)return U(t[0]),{keepAlive:!0,messages:n};if(s===b.Scheduled)if(o.currentTime>=e.startWhen)s=e.state=b.Started,n.push({type:"started"});else return U(t[0]),{keepAlive:!0,messages:n};else if(s===b.Paused&&o.currentTime>e.pauseWhen)return U(t[0]),{keepAlive:!0,messages:n};if(o.currentTime>e.stopWhen)return U(t[0]),e.state=b.Ended,n.push({type:"ended"}),e.playedSamples=0,{keepAlive:!0,messages:n};let l=t[0],i=Y(e);if(i===0)return U(l),{keepAlive:!0,messages:n};let{playbackRate:f,detune:d,lowpass:u,highpass:h,gain:m,pan:M}=a,{buffer:V,loopStart:y,loopEnd:P,loopCrossfade:g,stopWhen:x,playedSamples:A,enableLowpass:F,enableHighpass:R,enableGain:N,enablePan:_,enableDetune:W,enableFadeOut:v,enableFadeIn:z,enableLoopStart:Z,enableLoopEnd:ee,enableLoopCrossfade:te,playhead:C,fadeInDuration:se,fadeOutDuration:le}=e,Ee=e.streamBuffer.streaming&&e.streamBuffer.committedLength<i,ie=e.loop&&!Ee,$=Math.min(V.length,l.length),Te=e.duration*o.sampleRate,_e=Math.floor(o.sampleRate*g),De=Math.max(i-E,0),D=Z?Math.min(Math.floor(y*o.sampleRate),De):0,O=ee?Math.min(Math.floor(P*o.sampleRate),i):i,Oe=O-D,ue=W&&d.length>0&&d[0]!==0,J=f;if(ue){let p=Math.max(f.length,d.length,E);J=new Float32Array(p);for(let S=0;S<p;S++){let L=f[S]??f[f.length-1],c=d[S]??d[d.length-1];J[S]=L*2**(c/1200)}}let fe=e.enablePlaybackRate||ue,we=fe&&J.length>0&&J.every(p=>p===0);if(e.streamBuffer.streaming&&!e.streamBuffer.streamEnded&&!e.streamBuffer.lowWaterNotified&&e.streamBuffer.committedLength-Math.floor(C)<e.streamBuffer.lowWaterThreshold&&(n.push({type:"bufferLowWater",data:{playhead:Math.floor(C),committedLength:e.streamBuffer.committedLength}}),e.streamBuffer.lowWaterNotified=!0),we){U(l);for(let p=1;p<t.length;p++)be(l,t[p]);return{keepAlive:!0,messages:n}}let de={bufferLength:i,loop:ie,playhead:C,loopStartSamples:D,loopEndSamples:O,durationSamples:Te,playbackRates:J},{indexes:H,ended:pe,looped:he,playhead:ce}=fe?ot(de):at(de),Q=H.find(p=>p>=e.streamBuffer.committedLength&&p<i);Q!==void 0&&!e.streamBuffer.streamEnded&&e.streamBuffer.lastUnderrunSample!==Q?(n.push({type:"bufferUnderrun",data:{playhead:Math.floor(C),committedLength:e.streamBuffer.committedLength,requestedSample:Q}}),e.streamBuffer.lastUnderrunSample=Q):Q===void 0&&(e.streamBuffer.lastUnderrunSample=null),nt(l,V,H);let w=Math.min(Math.floor(g*o.sampleRate),Oe),Ie=ie&&C>D&&C<O,We=te&&_e>0&&i>E;if(Ie&&We){{let p=D+w;if(w>0&&C>D&&C<p){let S=C-D,L=Math.min(Math.floor(p-C),E);for(let c=0;c<L;c++){let B=(S+c)/w,I=Math.cos(Math.PI*B/2),k=Math.floor(O-w+S+c);if(k>=0&&k<i)for(let T=0;T<$;T++)l[T][c]+=V[T][k]*I}}}{let p=O-w;if(w>0&&C>p&&C<O){let S=C-p,L=Math.min(Math.floor(O-C),E);for(let c=0;c<L;c++){let B=(S+c)/w,I=Math.sin(Math.PI*B/2),k=Math.floor(D+S+c);if(k>=0&&k<i)for(let T=0;T<$;T++)l[T][c]+=V[T][k]*I}}}}if(z&&se>0){let p=Math.floor(se*o.sampleRate),S=p-A;if(S>0){let L=Math.min(S,E);for(let c=0;c<L;c++){let B=(A+c)/p,I=B*B*B;for(let k=0;k<$;k++)l[k][c]*=I}}}if(v&&le>0){let p=Math.floor(le*o.sampleRate),S=Math.floor(o.sampleRate*(x-o.currentTime));if(S<p+E)for(let L=0;L<E;L++){let c=S-L;if(c>=p)continue;let B=c<=0?0:c/p,I=B*B*B;for(let k=0;k<$;k++)l[k][L]*=I}}F&&ft(l,u,o.sampleRate,r.lowpass),R&&dt(l,h,o.sampleRate,r.highpass),N&&it(l,m),$===1&&rt(l),_&&ut(l,M),he&&(e.timesLooped++,n.push({type:"looped",data:e.timesLooped})),pe&&(e.state=b.Ended,n.push({type:"ended"})),e.playedSamples+=H.length,e.playhead=ce;let me=st(l);if(me>0)return console.log({numNans:me,indexes:H,playhead:ce,ended:pe,looped:he,sourceLength:i}),{keepAlive:!0,messages:n};for(let p=1;p<t.length;p++)be(l,t[p]);return{keepAlive:!0,messages:n}}var Me="0.1.5";var ct="@jadujoel/web-audio-clip-node",mt=Me;function gt(){let e=new Blob([ne],{type:"text/javascript"});return URL.createObjectURL(e)}function bt(e=mt){return`https://cdn.jsdelivr.net/npm/${ct}@${e}/dist/processor.js`}function yt(e=document.baseURI){return new URL("./processor.js",e).toString()}var St=120,Mt=48e3,xe=[{key:"offset",label:"Offset",min:0,max:60,defaultValue:0,snap:"bar",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0,title:"Start position in the buffer (seconds)."},{key:"duration",label:"Duration",min:-1,max:60,defaultValue:-1,hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0,title:"How long to play before auto-stopping (seconds). -1 for full length."},{key:"startDelay",label:"StartDelay",min:0,max:4,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,title:"Delay before starting (seconds)."},{key:"stopDelay",label:"StopDelay",min:0,max:4,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,title:"Delay before stopping (seconds)."},{key:"fadeIn",label:"FadeIn",min:0,max:60,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,title:"Fade-in duration (seconds)."},{key:"fadeOut",label:"FadeOut",min:0,max:60,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,title:"Fade-out duration (seconds)."}],ke=[{key:"loopStart",label:"Start",min:0,max:60,defaultValue:0,snap:"bar",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0},{key:"loopEnd",label:"End",min:0,max:60,defaultValue:0,snap:"bar",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0},{key:"loopCrossfade",label:"Crossfade",min:0,max:1,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0}],Ve=[{key:"playbackRate",label:"PlaybackRate",min:-2,max:2,defaultValue:1,precision:2,preset:"playbackRate",hasToggle:!0,title:"Playback speed. Negative for reverse."},{key:"detune",label:"Detune",min:-2400,max:2400,defaultValue:0,precision:4,preset:"cents",hasToggle:!0,title:"Pitch shift in cents."},{key:"gain",label:"Gain",min:-100,max:0,defaultValue:0,precision:3,preset:"gain",hasToggle:!0,title:"Amplitude in dB."},{key:"pan",label:"Pan",min:-1,max:1,defaultValue:0,preset:"pan",hasToggle:!0,title:"-1 full left, 1 full right."},{key:"lowpass",label:"Lowpass",min:32,max:16384,defaultValue:16384,preset:"hertz",hasToggle:!0,title:"Lowpass cutoff frequency."},{key:"highpass",label:"Highpass",min:32,max:16384,defaultValue:32,preset:"hertz",hasToggle:!0,title:"Highpass cutoff frequency."}],xt={key:"playhead",label:"Playhead",min:0,max:48e4,defaultValue:0,precision:1,snap:"int",title:"Current sample position of buffer playback."},Fe=[xt,...xe,...ke,...Ve];function kt(){let e={},t={},a={},o={},r={},n={};for(let s of Fe)e[s.key]=s.defaultValue,t[s.key]=s.snap??"none",a[s.key]=!0,o[s.key]=s.min,r[s.key]=s.max,n[s.key]=s.maxLockedByDefault??!1;return{values:e,snaps:t,enabled:a,mins:o,maxs:r,maxLocked:n}}function Vt(e,t,a,o){switch(t){case"gain":return`${e.toFixed(1)} dB`;case"lowpass":case"highpass":return`${Math.round(e)} Hz`;case"detune":return`${Math.round(e)} cents`;case"pan":return e===0?"center":e<0?`${Math.abs(e).toFixed(2)} left`:`${e.toFixed(2)} right`;case"playbackRate":return`${e.toFixed(2)}x`;case"playhead":return`sample ${Math.round(e)}`;default:break}if(a==="beat"||a==="bar"||a==="8th"||a==="16th"){let r=60/o;if(a==="bar"){let s=e/(r*4);return`${Math.round(s)} bars`}if(a==="8th"){let s=e/(r/2);return`${Math.round(s)} 8ths`}if(a==="16th"){let s=e/(r/4);return`${Math.round(s)} 16ths`}let n=e/r;return`${Math.round(n)} beats`}return a==="integer"?`${Math.round(e)} s`:`${e.toPrecision(4)} s`}function Ft(e,t,a,o){switch(t){case"gain":return e.toFixed(1);case"lowpass":case"highpass":return`${Math.round(e)}`;case"detune":return`${Math.round(e)}`;case"pan":return e===0?"C":e<0?`${Math.abs(e).toFixed(2)}L`:`${e.toFixed(2)}R`;case"playbackRate":return`${e.toFixed(2)}x`;case"playhead":return`${Math.round(e)}`;default:break}if(a==="beat"||a==="bar"||a==="8th"||a==="16th"){let r=60/o;return a==="bar"?`${Math.round(e/(r*4))}`:a==="8th"?`${Math.round(e/(r/2))}`:a==="16th"?`${Math.round(e/(r/4))}`:`${Math.round(e/r)}`}return a==="integer"?`${Math.round(e)}`:e.toPrecision(4)}var Ce=[{key:"fadeOutStopDelay",label:"Link StopDelay and FadeOut",controls:["stopDelay","fadeOut"]}],Ae=[{key:"loopStartEnd",label:"Link Start and End",controls:["loopStart","loopEnd"]}],Ct=[...Ce,...Ae];function At(){return{fadeOutStopDelay:!1,loopStartEnd:!1}}function Le(e){return Ct.find(t=>t.controls[0]===e||t.controls[1]===e)}function Lt(e,t){let a=Le(e);return a&&t[a.key]?a.controls:[e]}function Pt({pair:e,changedKey:t,nextValue:a,values:o,mins:r,maxs:n}){let[s,l]=e.controls;if(t!==s&&t!==l)return{[t]:a};let i=t===s?l:s,f=o[t],d=o[i],u=a-f,h=Math.max(r[t]-f,r[i]-d),m=Math.min(n[t]-f,n[i]-d),M=Math.min(Math.max(u,h),m);return{[t]:f+M,[i]:d+M}}var Rt=caches.open("sound-files");async function Bt(e){let t=performance.now(),a=await Rt,o=await a.match(e);if(o)return console.log(`[cache] Loaded ${e} from CacheStorage in ${(performance.now()-t).toFixed(0)}ms`),o.arrayBuffer();let r=await fetch(e);if(r.ok)return a.put(e,r.clone()).catch(()=>{}),console.log(`[cache] Loaded ${e} from network in ${(performance.now()-t).toFixed(0)}ms`),r.arrayBuffer()}var Et="clip-audio-store";var j="files",Pe="last-uploaded";function Re(){return new Promise((e,t)=>{let a=indexedDB.open(Et,1);a.onupgradeneeded=()=>{let o=a.result;o.objectStoreNames.contains(j)||o.createObjectStore(j)},a.onsuccess=()=>e(a.result),a.onerror=()=>t(a.error)})}function Be(e,t){return e.transaction(j,t).objectStore(j)}async function Tt(e,t){let a=await Re(),o=Be(a,"readwrite"),r={name:e,arrayBuffer:t};await new Promise((n,s)=>{let l=o.put(r,Pe);l.onsuccess=()=>n(),l.onerror=()=>s(l.error)})}async function _t(){let e=await Re(),t=Be(e,"readonly");return new Promise((a,o)=>{let r=t.get(Pe);r.onsuccess=()=>a(r.result??null),r.onerror=()=>o(r.error)})}export{oe as ClipNode,St as DEFAULT_TEMPO,E as SAMPLE_BLOCK_SIZE,Mt as SAMPLE_RATE,b as State,Fe as allDefs,ae as audioBufferFromFloat32Array,kt as buildDefaults,At as buildLinkedControlPairDefaults,xe as controlDefs,lt as createFilterState,ve as dbFromLin,Ge as float32ArrayFromAudioBuffer,Ft as formatTickLabel,Vt as formatValueText,Xe as generateSnapPoints,Lt as getActiveLinkedControls,Le as getLinkedControlPairForControl,Pt as getLinkedControlUpdates,gt as getProcessorBlobUrl,bt as getProcessorCdnUrl,yt as getProcessorModuleUrl,et as getProperties,Je as getSnappedValue,G as getTempoSnapInterval,pt as handleProcessorMessage,ge as isTempoRelativeSnap,Ue as linFromDb,Bt as loadFromCache,_t as loadUploadedFile,ke as loopControlDefs,Ae as loopLinkedControlPairs,Ve as paramDefs,Qe as presets,ht as processBlock,ne as processorCode,$e as remapTempoRelativeValue,Tt as saveUploadedFile,Ce as transportLinkedControlPairs};
|
|
5
|
+
`;var b={Initial:0,Started:1,Stopped:2,Paused:3,Scheduled:4,Ended:5,Disposed:6};var E=128;function K(e=[]){let t=e[0]?.length??0,a=t>0;return{totalLength:a?t:null,committedLength:a?t:0,streamEnded:a,streaming:!1,writtenSpans:a?[{startSample:0,endSample:t}]:[],pendingWrites:[],lowWaterThreshold:E*4,lowWaterNotified:!1,lastUnderrunSample:null}}function ye(e){return e[0]?.length??0}function Y(e){return e.streamBuffer.totalLength??ye(e.buffer)}function Se(e,t){return Array.from({length:e},()=>new Float32Array(t))}function Ke(e,t){let a=[...e,t].sort((r,n)=>r.startSample-n.startSample),o=[];for(let r of a){let n=o[o.length-1];if(!n||r.startSample>n.endSample){o.push({...r});continue}n.endSample=Math.max(n.endSample,r.endSample)}return o}function Ye(e){let t=0;for(let a of e){if(a.startSample>t)break;t=Math.max(t,a.endSample)}return t}function He(e,t){e.committedLength-Math.floor(t)>=e.lowWaterThreshold&&(e.lowWaterNotified=!1)}function qe(e,t,a){let o=ye(e.buffer),r=e.buffer.length;if(o>=a&&r>=t)return;let n=Math.max(o,a),s=Math.max(r,t),l=Se(s,n);for(let i=0;i<r;i++)l[i].set(e.buffer[i].subarray(0,o));e.buffer=l,(e.streamBuffer.totalLength==null||e.streamBuffer.totalLength<n)&&(e.streamBuffer.totalLength=n)}function je(e,t){let a=Math.max(Math.floor(t.startSample),0),o=t.channelData[0]?.length??0,r=t.totalLength??null,n=Math.max(a+o,r??0);qe(e,Math.max(t.channelData.length,e.buffer.length,1),n);for(let s=0;s<t.channelData.length;s++)e.buffer[s].set(t.channelData[s],a);r!=null&&(e.streamBuffer.totalLength=r),o>0&&(e.streamBuffer.writtenSpans=Ke(e.streamBuffer.writtenSpans,{startSample:a,endSample:a+o}),e.streamBuffer.committedLength=Ye(e.streamBuffer.writtenSpans)),t.streamEnded===!0&&(e.streamBuffer.streamEnded=!0),He(e.streamBuffer,e.playhead)}function ze(e){if(e.streamBuffer.pendingWrites.length!==0){for(let t of e.streamBuffer.pendingWrites)je(e,t);e.streamBuffer.pendingWrites=[]}}function Ze(e,t){e.buffer=t,e.streamBuffer=K(t)}function et(e={},t){let{buffer:a=[],streamBuffer:o=K(a),duration:r=-1,loop:n=!1,loopStart:s=0,loopEnd:l=(a[0]?.length??0)/t,loopCrossfade:i=0,playhead:f=0,offset:d=0,startWhen:u=0,stopWhen:h=0,pauseWhen:m=0,resumeWhen:M=0,playedSamples:V=0,state:y=b.Initial,timesLooped:P=0,fadeInDuration:g=0,fadeOutDuration:x=0,enableFadeIn:A=g>0,enableFadeOut:F=x>0,enableLoopStart:R=!0,enableLoopEnd:N=!0,enableLoopCrossfade:_=i>0,enableHighpass:W=!0,enableLowpass:v=!0,enableGain:z=!0,enablePan:Z=!0,enableDetune:ee=!0,enablePlaybackRate:te=!0}=e;return{buffer:a,streamBuffer:o,loop:n,loopStart:s,loopEnd:l,loopCrossfade:i,duration:r,playhead:f,offset:d,startWhen:u,stopWhen:h,pauseWhen:m,resumeWhen:M,playedSamples:V,state:y,timesLooped:P,fadeInDuration:g,fadeOutDuration:x,enableFadeIn:A,enableFadeOut:F,enableLoopStart:R,enableLoopEnd:N,enableHighpass:W,enableLowpass:v,enableGain:z,enablePan:Z,enableDetune:ee,enablePlaybackRate:te,enableLoopCrossfade:_}}function tt(e,t){return Y(e)/t}function X(e,t){let a=tt(e,t);if(a<=0){e.loopStart=0,e.loopEnd=0;return}(!Number.isFinite(e.loopStart)||e.loopStart<0)&&(e.loopStart=0),e.loopStart>=a&&(e.loopStart=0),(!Number.isFinite(e.loopEnd)||e.loopEnd<=e.loopStart||e.loopEnd>a)&&(e.loopEnd=a)}function re(e,t,a){if(t===void 0)return e.offset=0,0;if(t<0)return re(e,Y(e)+t,a);if(t>(Y(e)||1)-1)return re(e,Y(e)%t,a);let o=Math.floor(t*a);return e.offset=o,o}function at(e){let{playhead:t,bufferLength:a,loop:o,loopStartSamples:r,loopEndSamples:n}=e,s=128;!o&&t+128>a&&(s=Math.max(a-t,0));let l=new Array(s);if(!o){for(let u=0,h=t;u<s;u++,h++)l[u]=h;let d=t+s;return{playhead:d,indexes:l,looped:!1,ended:d>=a}}let i=t,f=!1;for(let d=0;d<s;d++,i++)i>=n&&(i=r+(i-n),f=!0),l[d]=i;return{indexes:l,looped:f,ended:!1,playhead:i}}function ot(e){let{playhead:t,bufferLength:a,loop:o,loopStartSamples:r,loopEndSamples:n,playbackRates:s}=e,l=128;!o&&t+128>a&&(l=Math.max(a-t,0));let i=new Array(l),f=t,d=!1;if(o){for(let u=0;u<l;u++){i[u]=Math.min(Math.max(Math.floor(f),0),a-1);let h=s[u]??s[0]??1;f+=h,h>=0&&(f>n||f>a)?(f=r,d=!0):h<0&&(f<r||f<0)&&(f=n,d=!0)}return{playhead:f,indexes:i,looped:d,ended:!1}}for(let u=0;u<l;u++)i[u]=Math.min(Math.max(Math.floor(f),0),a-1),f+=s[u]??s[0]??1;return{playhead:f,indexes:i,looped:!1,ended:f>=a||f<0}}function nt(e,t,a){let o=Math.min(e.length,t.length);for(let r=0;r<a.length;r++)for(let n=0;n<o;n++)e[n][r]=t[n][a[r]];for(let r=o;r<e.length;r++)for(let n=0;n<e[r].length;n++)e[r][n]=0;for(let r=a.length;r<e[0].length;r++)for(let n=0;n<o;n++)e[n][r]=0}function U(e){for(let t=0;t<e.length;t++)for(let a=0;a<e[t].length;a++)e[t][a]=0}function rt(e){if(e.length>=2)for(let t=0;t<e[0].length;t++)e[1][t]=e[0][t];else{let t=new Float32Array(e[0].length);for(let a=0;a<e[0].length;a++)t[a]=e[0][a];e.push(t)}}function be(e,t){for(let a=t.length;a<e.length;a++)t[a]=new Float32Array(e[a].length);for(let a=0;a<e.length;a++)for(let o=0;o<e[a].length;o++)t[a][o]=e[a][o]}function st(e){let t=0;for(let a=0;a<e.length;a++)for(let o=0;o<e[a].length;o++)Number.isNaN(e[a][o])&&(t++,e[a][o]=0);return t}function lt(){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 it(e,t){if(t.length===1){let o=t[0];if(o===1)return;for(let r of e)for(let n=0;n<r.length;n++)r[n]*=o;return}let a=t[0];for(let o of e)for(let r=0;r<o.length;r++)a=t[r]??a,o[r]*=a}function ut(e,t){let a=t[0];for(let o=0;o<e[0].length;o++){a=t[o]??a;let r=a<=0?1:1-a,n=a>=0?1:1+a;e[0][o]*=r,e[1][o]*=n}}function ft(e,t,a,o){for(let r=0;r<e.length;r++){let n=e[r],{x_1:s,x_2:l,y_1:i,y_2:f}=o[r]??{x_1:0,x_2:0,y_1:0,y_2:0};if(t.length===1){let d=t[0];if(d>=2e4)return;let u=2*Math.PI*d/a,h=Math.sin(u)/2,m=(1-Math.cos(u))/2,M=1-Math.cos(u),V=(1-Math.cos(u))/2,y=1+h,P=-2*Math.cos(u),g=1-h,x=m/y,A=M/y,F=V/y,R=P/y,N=g/y;for(let _=0;_<n.length;_++){let W=n[_],v=x*W+A*s+F*l-R*i-N*f;l=s,s=W,f=i,i=v,n[_]=v}}else{let d=t[0];for(let u=0;u<n.length;u++){let h=t[u]??d,m=2*Math.PI*h/a,M=Math.sin(m)/2,V=(1-Math.cos(m))/2,y=1-Math.cos(m),P=(1-Math.cos(m))/2,g=1+M,x=-2*Math.cos(m),A=1-M,F=n[u],R=V/g*F+y/g*s+P/g*l-x/g*i-A/g*f;l=s,s=F,f=i,i=R,n[u]=R}}o[r]={x_1:s,x_2:l,y_1:i,y_2:f}}}function dt(e,t,a,o){for(let r=0;r<e.length;r++){let n=e[r],{x_1:s,x_2:l,y_1:i,y_2:f}=o[r]??{x_1:0,x_2:0,y_1:0,y_2:0};if(t.length===1){let d=t[0];if(d<=20)return;let u=2*Math.PI*d/a,h=Math.sin(u)/2,m=(1+Math.cos(u))/2,M=-(1+Math.cos(u)),V=(1+Math.cos(u))/2,y=1+h,P=-2*Math.cos(u),g=1-h;for(let x=0;x<n.length;x++){let A=n[x],F=m/y*A+M/y*s+V/y*l-P/y*i-g/y*f;l=s,s=A,f=i,i=F,n[x]=F}}else{let d=t[0];for(let u=0;u<n.length;u++){let h=t[u]??d,m=2*Math.PI*h/a,M=Math.sin(m)/2,V=(1+Math.cos(m))/2,y=-(1+Math.cos(m)),P=(1+Math.cos(m))/2,g=1+M,x=-2*Math.cos(m),A=1-M,F=n[u],R=V/g*F+y/g*s+P/g*l-x/g*i-A/g*f;l=s,s=F,f=i,i=R,n[u]=R}}o[r]={x_1:s,x_2:l,y_1:i,y_2:f}}}function pt(e,t,a,o){let{type:r,data:n}=t;switch(r){case"buffer":return Ze(e,n),X(e,o),[];case"bufferInit":{let s=n;return e.buffer=Se(s.channels,s.totalLength),e.streamBuffer={...K(),totalLength:s.totalLength,streamEnded:!1,streaming:s.streaming??!0},X(e,o),[]}case"bufferRange":return e.streamBuffer.pendingWrites.push(n),[];case"bufferEnd":{let s=n;return s?.totalLength!=null&&(e.streamBuffer.totalLength=s.totalLength),e.streamBuffer.streamEnded=!0,[]}case"bufferReset":return e.buffer=[],e.streamBuffer=K(),X(e,o),[];case"start":e.timesLooped=0;{let s=n;e.duration=s?.duration??-1,e.duration===-1&&(e.duration=e.loop?Number.MAX_SAFE_INTEGER:(e.buffer[0]?.length??0)/o),re(e,s?.offset,o),X(e,o),e.playhead=e.offset,e.startWhen=s?.when??a,e.stopWhen=e.startWhen+e.duration,e.playedSamples=0,e.state=b.Scheduled}return[{type:"scheduled"}];case"stop":return e.state===b.Ended||e.state===b.Initial?[]:(e.stopWhen=n??e.stopWhen,e.state=b.Stopped,[{type:"stopped"}]);case"pause":return e.state=b.Paused,e.pauseWhen=n??a,[{type:"paused"}];case"resume":return e.state=b.Started,e.startWhen=n??a,[{type:"resume"}];case"dispose":return e.state=b.Disposed,e.buffer=[],e.streamBuffer=K(),[{type:"disposed"}];case"loop":{let s=n,l=e.state;return s&&(l===b.Scheduled||l===b.Started)&&(e.stopWhen=Number.MAX_SAFE_INTEGER,e.duration=Number.MAX_SAFE_INTEGER),e.loop=s,s&&X(e,o),[]}case"loopStart":return e.loopStart=n,[];case"loopEnd":return e.loopEnd=n,[];case"loopCrossfade":return e.loopCrossfade=n,[];case"playhead":return e.playhead=Math.floor(n),[];case"fadeIn":return e.fadeInDuration=n,[];case"fadeOut":return e.fadeOutDuration=n,[];case"toggleGain":return e.enableGain=n??!e.enableGain,[];case"togglePan":return e.enablePan=n??!e.enablePan,[];case"toggleLowpass":return e.enableLowpass=n??!e.enableLowpass,[];case"toggleHighpass":return e.enableHighpass=n??!e.enableHighpass,[];case"toggleDetune":return e.enableDetune=n??!e.enableDetune,[];case"togglePlaybackRate":return e.enablePlaybackRate=n??!e.enablePlaybackRate,[];case"toggleFadeIn":return e.enableFadeIn=n??!e.enableFadeIn,[];case"toggleFadeOut":return e.enableFadeOut=n??!e.enableFadeOut,[];case"toggleLoopStart":return e.enableLoopStart=n??!e.enableLoopStart,[];case"toggleLoopEnd":return e.enableLoopEnd=n??!e.enableLoopEnd,[];case"toggleLoopCrossfade":return e.enableLoopCrossfade=n??!e.enableLoopCrossfade,[];case"logState":return[]}return[]}function ht(e,t,a,o,r){let n=[],s=e.state;if(s===b.Disposed)return{keepAlive:!1,messages:n};if(ze(e),s===b.Initial)return{keepAlive:!0,messages:n};if(s===b.Ended)return U(t[0]),{keepAlive:!0,messages:n};if(s===b.Scheduled)if(o.currentTime>=e.startWhen)s=e.state=b.Started,n.push({type:"started"});else return U(t[0]),{keepAlive:!0,messages:n};else if(s===b.Paused&&o.currentTime>e.pauseWhen)return U(t[0]),{keepAlive:!0,messages:n};if(o.currentTime>e.stopWhen)return U(t[0]),e.state=b.Ended,n.push({type:"ended"}),e.playedSamples=0,{keepAlive:!0,messages:n};let l=t[0],i=Y(e);if(i===0)return U(l),{keepAlive:!0,messages:n};let{playbackRate:f,detune:d,lowpass:u,highpass:h,gain:m,pan:M}=a,{buffer:V,loopStart:y,loopEnd:P,loopCrossfade:g,stopWhen:x,playedSamples:A,enableLowpass:F,enableHighpass:R,enableGain:N,enablePan:_,enableDetune:W,enableFadeOut:v,enableFadeIn:z,enableLoopStart:Z,enableLoopEnd:ee,enableLoopCrossfade:te,playhead:C,fadeInDuration:se,fadeOutDuration:le}=e,Ee=e.streamBuffer.streaming&&e.streamBuffer.committedLength<i,ie=e.loop&&!Ee,$=Math.min(V.length,l.length),Te=e.duration*o.sampleRate,_e=Math.floor(o.sampleRate*g),De=Math.max(i-E,0),D=Z?Math.min(Math.floor(y*o.sampleRate),De):0,O=ee?Math.min(Math.floor(P*o.sampleRate),i):i,Oe=O-D,ue=W&&d.length>0&&d[0]!==0,J=f;if(ue){let p=Math.max(f.length,d.length,E);J=new Float32Array(p);for(let S=0;S<p;S++){let L=f[S]??f[f.length-1],c=d[S]??d[d.length-1];J[S]=L*2**(c/1200)}}let fe=e.enablePlaybackRate||ue,we=fe&&J.length>0&&J.every(p=>p===0);if(e.streamBuffer.streaming&&!e.streamBuffer.streamEnded&&!e.streamBuffer.lowWaterNotified&&e.streamBuffer.committedLength-Math.floor(C)<e.streamBuffer.lowWaterThreshold&&(n.push({type:"bufferLowWater",data:{playhead:Math.floor(C),committedLength:e.streamBuffer.committedLength}}),e.streamBuffer.lowWaterNotified=!0),we){U(l);for(let p=1;p<t.length;p++)be(l,t[p]);return{keepAlive:!0,messages:n}}let de={bufferLength:i,loop:ie,playhead:C,loopStartSamples:D,loopEndSamples:O,durationSamples:Te,playbackRates:J},{indexes:H,ended:pe,looped:he,playhead:ce}=fe?ot(de):at(de),Q=H.find(p=>p>=e.streamBuffer.committedLength&&p<i);Q!==void 0&&!e.streamBuffer.streamEnded&&e.streamBuffer.lastUnderrunSample!==Q?(n.push({type:"bufferUnderrun",data:{playhead:Math.floor(C),committedLength:e.streamBuffer.committedLength,requestedSample:Q}}),e.streamBuffer.lastUnderrunSample=Q):Q===void 0&&(e.streamBuffer.lastUnderrunSample=null),nt(l,V,H);let w=Math.min(Math.floor(g*o.sampleRate),Oe),Ie=ie&&C>D&&C<O,We=te&&_e>0&&i>E;if(Ie&&We){{let p=D+w;if(w>0&&C>D&&C<p){let S=C-D,L=Math.min(Math.floor(p-C),E);for(let c=0;c<L;c++){let B=(S+c)/w,I=Math.cos(Math.PI*B/2),k=Math.floor(O-w+S+c);if(k>=0&&k<i)for(let T=0;T<$;T++)l[T][c]+=V[T][k]*I}}}{let p=O-w;if(w>0&&C>p&&C<O){let S=C-p,L=Math.min(Math.floor(O-C),E);for(let c=0;c<L;c++){let B=(S+c)/w,I=Math.sin(Math.PI*B/2),k=Math.floor(D+S+c);if(k>=0&&k<i)for(let T=0;T<$;T++)l[T][c]+=V[T][k]*I}}}}if(z&&se>0){let p=Math.floor(se*o.sampleRate),S=p-A;if(S>0){let L=Math.min(S,E);for(let c=0;c<L;c++){let B=(A+c)/p,I=B*B*B;for(let k=0;k<$;k++)l[k][c]*=I}}}if(v&&le>0){let p=Math.floor(le*o.sampleRate),S=Math.floor(o.sampleRate*(x-o.currentTime));if(S<p+E)for(let L=0;L<E;L++){let c=S-L;if(c>=p)continue;let B=c<=0?0:c/p,I=B*B*B;for(let k=0;k<$;k++)l[k][L]*=I}}F&&ft(l,u,o.sampleRate,r.lowpass),R&&dt(l,h,o.sampleRate,r.highpass),N&&it(l,m),$===1&&rt(l),_&&ut(l,M),he&&(e.timesLooped++,n.push({type:"looped",data:e.timesLooped})),pe&&(e.state=b.Ended,n.push({type:"ended"})),e.playedSamples+=H.length,e.playhead=ce;let me=st(l);if(me>0)return console.log({numNans:me,indexes:H,playhead:ce,ended:pe,looped:he,sourceLength:i}),{keepAlive:!0,messages:n};for(let p=1;p<t.length;p++)be(l,t[p]);return{keepAlive:!0,messages:n}}var Me="0.1.6";var ct="@jadujoel/web-audio-clip-node",mt=Me;function gt(){let e=new Blob([ne],{type:"text/javascript"});return URL.createObjectURL(e)}function bt(e=mt){return`https://cdn.jsdelivr.net/npm/${ct}@${e}/dist/processor.js`}function yt(e=document.baseURI){return new URL("./processor.js",e).toString()}var St=120,Mt=48e3,xe=[{key:"offset",label:"Offset",min:0,max:60,defaultValue:0,snap:"bar",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0,title:"Start position in the buffer (seconds)."},{key:"duration",label:"Duration",min:-1,max:60,defaultValue:-1,hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0,title:"How long to play before auto-stopping (seconds). -1 for full length."},{key:"startDelay",label:"StartDelay",min:0,max:4,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,title:"Delay before starting (seconds)."},{key:"stopDelay",label:"StopDelay",min:0,max:4,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,title:"Delay before stopping (seconds)."},{key:"fadeIn",label:"FadeIn",min:0,max:60,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,title:"Fade-in duration (seconds)."},{key:"fadeOut",label:"FadeOut",min:0,max:60,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,title:"Fade-out duration (seconds)."}],ke=[{key:"loopStart",label:"Start",min:0,max:60,defaultValue:0,snap:"bar",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0},{key:"loopEnd",label:"End",min:0,max:60,defaultValue:0,snap:"bar",hasSnap:!0,hasToggle:!0,hasMaxLock:!0,maxLockedByDefault:!0},{key:"loopCrossfade",label:"Crossfade",min:0,max:1,defaultValue:0,snap:"beat",hasSnap:!0,hasToggle:!0}],Ve=[{key:"playbackRate",label:"PlaybackRate",min:-2,max:2,defaultValue:1,precision:2,preset:"playbackRate",hasToggle:!0,title:"Playback speed. Negative for reverse."},{key:"detune",label:"Detune",min:-2400,max:2400,defaultValue:0,precision:4,preset:"cents",hasToggle:!0,title:"Pitch shift in cents."},{key:"gain",label:"Gain",min:-100,max:0,defaultValue:0,precision:3,preset:"gain",hasToggle:!0,title:"Amplitude in dB."},{key:"pan",label:"Pan",min:-1,max:1,defaultValue:0,preset:"pan",hasToggle:!0,title:"-1 full left, 1 full right."},{key:"lowpass",label:"Lowpass",min:32,max:16384,defaultValue:16384,preset:"hertz",hasToggle:!0,title:"Lowpass cutoff frequency."},{key:"highpass",label:"Highpass",min:32,max:16384,defaultValue:32,preset:"hertz",hasToggle:!0,title:"Highpass cutoff frequency."}],xt={key:"playhead",label:"Playhead",min:0,max:48e4,defaultValue:0,precision:1,snap:"int",title:"Current sample position of buffer playback."},Fe=[xt,...xe,...ke,...Ve];function kt(){let e={},t={},a={},o={},r={},n={};for(let s of Fe)e[s.key]=s.defaultValue,t[s.key]=s.snap??"none",a[s.key]=!0,o[s.key]=s.min,r[s.key]=s.max,n[s.key]=s.maxLockedByDefault??!1;return{values:e,snaps:t,enabled:a,mins:o,maxs:r,maxLocked:n}}function Vt(e,t,a,o){switch(t){case"gain":return`${e.toFixed(1)} dB`;case"lowpass":case"highpass":return`${Math.round(e)} Hz`;case"detune":return`${Math.round(e)} cents`;case"pan":return e===0?"center":e<0?`${Math.abs(e).toFixed(2)} left`:`${e.toFixed(2)} right`;case"playbackRate":return`${e.toFixed(2)}x`;case"playhead":return`sample ${Math.round(e)}`;default:break}if(a==="beat"||a==="bar"||a==="8th"||a==="16th"){let r=60/o;if(a==="bar"){let s=e/(r*4);return`${Math.round(s)} bars`}if(a==="8th"){let s=e/(r/2);return`${Math.round(s)} 8ths`}if(a==="16th"){let s=e/(r/4);return`${Math.round(s)} 16ths`}let n=e/r;return`${Math.round(n)} beats`}return a==="integer"?`${Math.round(e)} s`:`${e.toPrecision(4)} s`}function Ft(e,t,a,o){switch(t){case"gain":return e.toFixed(1);case"lowpass":case"highpass":return`${Math.round(e)}`;case"detune":return`${Math.round(e)}`;case"pan":return e===0?"C":e<0?`${Math.abs(e).toFixed(2)}L`:`${e.toFixed(2)}R`;case"playbackRate":return`${e.toFixed(2)}x`;case"playhead":return`${Math.round(e)}`;default:break}if(a==="beat"||a==="bar"||a==="8th"||a==="16th"){let r=60/o;return a==="bar"?`${Math.round(e/(r*4))}`:a==="8th"?`${Math.round(e/(r/2))}`:a==="16th"?`${Math.round(e/(r/4))}`:`${Math.round(e/r)}`}return a==="integer"?`${Math.round(e)}`:e.toPrecision(4)}var Ce=[{key:"fadeOutStopDelay",label:"Link StopDelay and FadeOut",controls:["stopDelay","fadeOut"]}],Ae=[{key:"loopStartEnd",label:"Link Start and End",controls:["loopStart","loopEnd"]}],Ct=[...Ce,...Ae];function At(){return{fadeOutStopDelay:!1,loopStartEnd:!1}}function Le(e){return Ct.find(t=>t.controls[0]===e||t.controls[1]===e)}function Lt(e,t){let a=Le(e);return a&&t[a.key]?a.controls:[e]}function Pt({pair:e,changedKey:t,nextValue:a,values:o,mins:r,maxs:n}){let[s,l]=e.controls;if(t!==s&&t!==l)return{[t]:a};let i=t===s?l:s,f=o[t],d=o[i],u=a-f,h=Math.max(r[t]-f,r[i]-d),m=Math.min(n[t]-f,n[i]-d),M=Math.min(Math.max(u,h),m);return{[t]:f+M,[i]:d+M}}var Rt=caches.open("sound-files");async function Bt(e){let t=performance.now(),a=await Rt,o=await a.match(e);if(o)return console.log(`[cache] Loaded ${e} from CacheStorage in ${(performance.now()-t).toFixed(0)}ms`),o.arrayBuffer();let r=await fetch(e);if(r.ok)return a.put(e,r.clone()).catch(()=>{}),console.log(`[cache] Loaded ${e} from network in ${(performance.now()-t).toFixed(0)}ms`),r.arrayBuffer()}var Et="clip-audio-store";var j="files",Pe="last-uploaded";function Re(){return new Promise((e,t)=>{let a=indexedDB.open(Et,1);a.onupgradeneeded=()=>{let o=a.result;o.objectStoreNames.contains(j)||o.createObjectStore(j)},a.onsuccess=()=>e(a.result),a.onerror=()=>t(a.error)})}function Be(e,t){return e.transaction(j,t).objectStore(j)}async function Tt(e,t){let a=await Re(),o=Be(a,"readwrite"),r={name:e,arrayBuffer:t};await new Promise((n,s)=>{let l=o.put(r,Pe);l.onsuccess=()=>n(),l.onerror=()=>s(l.error)})}async function _t(){let e=await Re(),t=Be(e,"readonly");return new Promise((a,o)=>{let r=t.get(Pe);r.onsuccess=()=>a(r.result??null),r.onerror=()=>o(r.error)})}export{oe as ClipNode,St as DEFAULT_TEMPO,E as SAMPLE_BLOCK_SIZE,Mt as SAMPLE_RATE,b as State,Fe as allDefs,ae as audioBufferFromFloat32Array,kt as buildDefaults,At as buildLinkedControlPairDefaults,xe as controlDefs,lt as createFilterState,ve as dbFromLin,Ge as float32ArrayFromAudioBuffer,Ft as formatTickLabel,Vt as formatValueText,Xe as generateSnapPoints,Lt as getActiveLinkedControls,Le as getLinkedControlPairForControl,Pt as getLinkedControlUpdates,gt as getProcessorBlobUrl,bt as getProcessorCdnUrl,yt as getProcessorModuleUrl,et as getProperties,Je as getSnappedValue,G as getTempoSnapInterval,pt as handleProcessorMessage,ge as isTempoRelativeSnap,Ue as linFromDb,Bt as loadFromCache,_t as loadUploadedFile,ke as loopControlDefs,Ae as loopLinkedControlPairs,Ve as paramDefs,Qe as presets,ht as processBlock,ne as processorCode,$e as remapTempoRelativeValue,Tt as saveUploadedFile,Ce as transportLinkedControlPairs};
|
|
6
6
|
//# sourceMappingURL=lib.bundle.js.map
|