@ultrst-armada/kloks 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +2 -3
  2. package/index.d.ts +5 -0
  3. package/index.js +5 -0
  4. package/package.json +122 -4
  5. package/packages/audio-midi/dist/audioClipEngine-BOT33JKI.js +9 -0
  6. package/packages/audio-midi/dist/audioInputManager-BLDGGLAR.js +12 -0
  7. package/packages/audio-midi/dist/chunk-3GRGELA4.js +2533 -0
  8. package/packages/audio-midi/dist/chunk-N55BWOC6.js +439 -0
  9. package/packages/audio-midi/dist/index.d.ts +988 -0
  10. package/packages/audio-midi/dist/index.js +2591 -0
  11. package/packages/audio-midi/kloks.manifest.json +69 -0
  12. package/packages/audio-midi/package.json +33 -0
  13. package/packages/backend/dist/BaseAccountProvider-DduKf5HG.d.ts +66 -0
  14. package/packages/backend/dist/BaseStorageAdapter-tosOoSUg.d.ts +67 -0
  15. package/packages/backend/dist/IdempotencyManager-B5MjK871.d.ts +16 -0
  16. package/packages/backend/dist/WebSocketTransport-CxUzUfwl.d.ts +255 -0
  17. package/packages/backend/dist/api/index.d.ts +32 -0
  18. package/packages/backend/dist/api/index.js +12 -0
  19. package/packages/backend/dist/auth/index.d.ts +56 -0
  20. package/packages/backend/dist/auth/index.js +22 -0
  21. package/packages/backend/dist/chunk-25Y7AVTP.js +55 -0
  22. package/packages/backend/dist/chunk-3EPY34R6.js +67 -0
  23. package/packages/backend/dist/chunk-4QEMALXF.js +90 -0
  24. package/packages/backend/dist/chunk-4ZFXEFOE.js +265 -0
  25. package/packages/backend/dist/chunk-53WQNION.js +278 -0
  26. package/packages/backend/dist/chunk-5MUQSPG4.js +149 -0
  27. package/packages/backend/dist/chunk-FZKBTF34.js +15 -0
  28. package/packages/backend/dist/chunk-G3ZOSXUR.js +31 -0
  29. package/packages/backend/dist/chunk-J2J24JVC.js +731 -0
  30. package/packages/backend/dist/chunk-KPUGS64G.js +221 -0
  31. package/packages/backend/dist/chunk-KTLD7Z4L.js +124 -0
  32. package/packages/backend/dist/chunk-LS3HWJBX.js +0 -0
  33. package/packages/backend/dist/chunk-MN54ZIKZ.js +336 -0
  34. package/packages/backend/dist/chunk-NIP22V2G.js +828 -0
  35. package/packages/backend/dist/chunk-QGHDJGYS.js +92 -0
  36. package/packages/backend/dist/chunk-RCCQ7IRM.js +139 -0
  37. package/packages/backend/dist/chunk-T3NYNBDC.js +618 -0
  38. package/packages/backend/dist/chunk-TWCEVES2.js +93 -0
  39. package/packages/backend/dist/chunk-UPFKBBQI.js +138 -0
  40. package/packages/backend/dist/chunk-VQEFULWT.js +88 -0
  41. package/packages/backend/dist/client/index.d.ts +22 -0
  42. package/packages/backend/dist/client/index.js +30 -0
  43. package/packages/backend/dist/connectivity/index.d.ts +237 -0
  44. package/packages/backend/dist/connectivity/index.js +50 -0
  45. package/packages/backend/dist/control-plane/index.d.ts +56 -0
  46. package/packages/backend/dist/control-plane/index.js +16 -0
  47. package/packages/backend/dist/execution/index.d.ts +124 -0
  48. package/packages/backend/dist/execution/index.js +20 -0
  49. package/packages/backend/dist/index.d.ts +692 -0
  50. package/packages/backend/dist/index.js +3299 -0
  51. package/packages/backend/dist/krnl-services.d.ts +82 -0
  52. package/packages/backend/dist/krnl-services.js +38 -0
  53. package/packages/backend/dist/services/index.d.ts +66 -0
  54. package/packages/backend/dist/services/index.js +17 -0
  55. package/packages/backend/dist/srkl/index.d.ts +191 -0
  56. package/packages/backend/dist/srkl/index.js +19 -0
  57. package/packages/backend/dist/storage/index.d.ts +124 -0
  58. package/packages/backend/dist/storage/index.js +43 -0
  59. package/packages/backend/dist/types-BERZJ93O.d.ts +110 -0
  60. package/packages/backend/dist/workspace/index.d.ts +111 -0
  61. package/packages/backend/dist/workspace/index.js +16 -0
  62. package/packages/backend/kloks.manifest.json +195 -0
  63. package/packages/backend/package.json +125 -0
  64. package/packages/functions/dist/index.d.ts +388 -0
  65. package/packages/functions/dist/index.js +1201 -0
  66. package/packages/functions/kloks.manifest.json +20 -0
  67. package/packages/functions/package.json +33 -0
  68. package/packages/orchestrations/dist/index.d.ts +53 -0
  69. package/packages/orchestrations/dist/index.js +211 -0
  70. package/packages/orchestrations/kloks.manifest.json +23 -0
  71. package/packages/orchestrations/package.json +35 -0
  72. package/packages/services/dist/index.d.ts +334 -0
  73. package/packages/services/dist/index.js +1597 -0
  74. package/packages/services/kloks.manifest.json +59 -0
  75. package/packages/services/package.json +33 -0
  76. package/packages/state-graph/dist/BaseConnection-CMRrL6Fe.d.ts +43 -0
  77. package/packages/state-graph/dist/BaseGraph-Bl2f7Pqx.d.ts +98 -0
  78. package/packages/state-graph/dist/BaseNode-1HCEqmap.d.ts +123 -0
  79. package/packages/state-graph/dist/CompatibilityMatrix-DX307_vS.d.ts +29 -0
  80. package/packages/state-graph/dist/TraceEngine-CJVpUb80.d.ts +18 -0
  81. package/packages/state-graph/dist/chunk-3RG5ZIWI.js +10 -0
  82. package/packages/state-graph/dist/chunk-4UVGXFEM.js +465 -0
  83. package/packages/state-graph/dist/chunk-ISFNY7EZ.js +61 -0
  84. package/packages/state-graph/dist/chunk-KG6QYS26.js +167 -0
  85. package/packages/state-graph/dist/chunk-OV4JVTNY.js +147 -0
  86. package/packages/state-graph/dist/chunk-OYN4ZEZC.js +54 -0
  87. package/packages/state-graph/dist/chunk-Q5I42UX7.js +0 -0
  88. package/packages/state-graph/dist/chunk-QN74PLMF.js +241 -0
  89. package/packages/state-graph/dist/chunk-S22PMERU.js +223 -0
  90. package/packages/state-graph/dist/chunk-SHIBCPGQ.js +269 -0
  91. package/packages/state-graph/dist/chunk-YTWCH6P2.js +109 -0
  92. package/packages/state-graph/dist/chunk-ZTHBPV24.js +267 -0
  93. package/packages/state-graph/dist/domain/index.d.ts +117 -0
  94. package/packages/state-graph/dist/domain/index.js +45 -0
  95. package/packages/state-graph/dist/execution/index.d.ts +152 -0
  96. package/packages/state-graph/dist/execution/index.js +16 -0
  97. package/packages/state-graph/dist/index-CiekWEH3.d.ts +272 -0
  98. package/packages/state-graph/dist/index.d.ts +3170 -0
  99. package/packages/state-graph/dist/index.js +9574 -0
  100. package/packages/state-graph/dist/rules/index.d.ts +86 -0
  101. package/packages/state-graph/dist/rules/index.js +17 -0
  102. package/packages/state-graph/dist/spatial/index.d.ts +55 -0
  103. package/packages/state-graph/dist/spatial/index.js +21 -0
  104. package/packages/state-graph/dist/state/index.d.ts +109 -0
  105. package/packages/state-graph/dist/state/index.js +20 -0
  106. package/packages/state-graph/dist/store/index.d.ts +6 -0
  107. package/packages/state-graph/dist/store/index.js +15 -0
  108. package/packages/state-graph/kloks.manifest.json +40 -0
  109. package/packages/state-graph/package.json +73 -0
@@ -0,0 +1,439 @@
1
+ import {
2
+ synthEngine
3
+ } from "./chunk-3GRGELA4.js";
4
+
5
+ // src/engine/audio/clipWaveforms.ts
6
+ function generatePresetAudioBuffer(ctx, sampleType) {
7
+ const duration = 2;
8
+ const rate = ctx.sampleRate;
9
+ const length = Math.floor(rate * duration);
10
+ const buffer = ctx.createBuffer(2, length, rate);
11
+ const left = buffer.getChannelData(0);
12
+ const right = buffer.getChannelData(1);
13
+ for (let i = 0; i < length; i++) {
14
+ const t = i / rate;
15
+ const progress = i / length;
16
+ let sL = 0;
17
+ let sR = 0;
18
+ if (sampleType === "ambient_drone") {
19
+ const f1 = 110 + Math.sin(t * 1.5) * 5;
20
+ const f2 = 165 + Math.cos(t * 2.2) * 8;
21
+ sL = Math.sin(2 * Math.PI * f1 * t) * 0.4 + Math.sin(2 * Math.PI * f2 * t) * 0.3;
22
+ sR = Math.sin(2 * Math.PI * (f1 * 1.005) * t) * 0.4 + Math.sin(2 * Math.PI * (f2 * 0.995) * t) * 0.3;
23
+ sL *= Math.sin(progress * Math.PI);
24
+ sR *= Math.sin(progress * Math.PI);
25
+ } else if (sampleType === "pulsar_synth") {
26
+ const sweepFreq = 220 + Math.sin(t * 8) * 80 + progress * 200;
27
+ sL = (Math.sin(2 * Math.PI * sweepFreq * t) > 0 ? 0.3 : -0.3) * (1 - progress * 0.6);
28
+ sR = Math.sin(2 * Math.PI * sweepFreq * 1.01 * t) * 0.4 * (1 - progress * 0.6);
29
+ } else if (sampleType === "cosmic_warp") {
30
+ const warpFreq = 600 * Math.exp(-progress * 2.5) + Math.sin(t * 30) * 100;
31
+ sL = Math.sin(2 * Math.PI * warpFreq * t) * Math.exp(-progress * 1.8);
32
+ sR = Math.cos(2 * Math.PI * warpFreq * 1.02 * t) * Math.exp(-progress * 1.8);
33
+ } else if (sampleType === "starlight_vox") {
34
+ const chord = [261.63, 329.63, 392, 523.25];
35
+ chord.forEach((freq, idx) => {
36
+ const lfo = Math.sin(t * (3 + idx)) * 0.05;
37
+ sL += Math.sin(2 * Math.PI * freq * (1 + lfo) * t) * 0.18;
38
+ sR += Math.sin(2 * Math.PI * freq * 1.003 * (1 - lfo) * t) * 0.18;
39
+ });
40
+ sL *= Math.sin(progress * Math.PI);
41
+ sR *= Math.sin(progress * Math.PI);
42
+ } else if (sampleType === "cyber_808") {
43
+ const pitch = 55 * Math.exp(-progress * 6) + 35;
44
+ const sub = Math.sin(2 * Math.PI * pitch * t);
45
+ const dist = Math.tanh(sub * 2.5) * 0.5;
46
+ sL = dist * Math.exp(-progress * 2);
47
+ sR = dist * Math.exp(-progress * 2);
48
+ } else if (sampleType === "space_percussion") {
49
+ const noise = Math.random() * 2 - 1;
50
+ const tonal = Math.sin(2 * Math.PI * (180 * Math.exp(-progress * 12)) * t);
51
+ sL = (noise * 0.3 + tonal * 0.7) * Math.exp(-progress * 5);
52
+ sR = (noise * 0.3 + tonal * 0.7) * Math.exp(-progress * 5);
53
+ } else {
54
+ sL = Math.sin(2 * Math.PI * 440 * t) * (1 - progress);
55
+ sR = sL;
56
+ }
57
+ left[i] = Math.max(-1, Math.min(1, sL));
58
+ right[i] = Math.max(-1, Math.min(1, sR));
59
+ }
60
+ return buffer;
61
+ }
62
+
63
+ // src/engine/audio/audioClipEngine/audioClipEngine.ts
64
+ var AudioClipEngine = class {
65
+ bufferCache = /* @__PURE__ */ new Map();
66
+ maxCacheSize = 32;
67
+ loadingPromises = /* @__PURE__ */ new Map();
68
+ activeSources = /* @__PURE__ */ new Map();
69
+ activePlaybacks = /* @__PURE__ */ new Map();
70
+ activeAudition = null;
71
+ getContext() {
72
+ return synthEngine.getContext();
73
+ }
74
+ setBufferCacheEntry(key, buffer) {
75
+ if (this.bufferCache.has(key)) {
76
+ this.bufferCache.delete(key);
77
+ } else if (this.bufferCache.size >= this.maxCacheSize) {
78
+ const oldestKey = this.bufferCache.keys().next().value;
79
+ if (oldestKey) {
80
+ this.bufferCache.delete(oldestKey);
81
+ }
82
+ }
83
+ this.bufferCache.set(key, buffer);
84
+ }
85
+ getOrCreatePresetBuffer(sampleType) {
86
+ if (this.bufferCache.has(sampleType)) {
87
+ const buffer2 = this.bufferCache.get(sampleType);
88
+ this.bufferCache.delete(sampleType);
89
+ this.bufferCache.set(sampleType, buffer2);
90
+ return buffer2;
91
+ }
92
+ const buffer = generatePresetAudioBuffer(this.getContext(), sampleType);
93
+ this.setBufferCacheEntry(sampleType, buffer);
94
+ return buffer;
95
+ }
96
+ extractWaveformData(buffer, numPoints = 100) {
97
+ const channelData = buffer.getChannelData(0);
98
+ const blockSize = Math.floor(channelData.length / numPoints);
99
+ const peaks = [];
100
+ for (let i = 0; i < numPoints; i++) {
101
+ const start = i * blockSize;
102
+ let max = 0;
103
+ for (let j = 0; j < blockSize && start + j < channelData.length; j++) {
104
+ const val = Math.abs(channelData[start + j] || 0);
105
+ if (val > max) max = val;
106
+ }
107
+ peaks.push(Math.min(1, Math.round(max * 100) / 100));
108
+ }
109
+ return peaks;
110
+ }
111
+ async loadSampleFromUrl(url) {
112
+ if (this.bufferCache.has(url)) {
113
+ const buffer = this.bufferCache.get(url);
114
+ return { buffer, peaks: this.extractWaveformData(buffer) };
115
+ }
116
+ if (this.loadingPromises.has(url)) {
117
+ return this.loadingPromises.get(url);
118
+ }
119
+ const promise = (async () => {
120
+ try {
121
+ const ctx = this.getContext();
122
+ const res = await fetch(url);
123
+ if (!res.ok) throw new Error(`HTTP ${res.status} fetching sample: ${url}`);
124
+ const arrayBuf = await res.arrayBuffer();
125
+ const audioBuf = await ctx.decodeAudioData(arrayBuf);
126
+ this.setBufferCacheEntry(url, audioBuf);
127
+ return { buffer: audioBuf, peaks: this.extractWaveformData(audioBuf) };
128
+ } finally {
129
+ this.loadingPromises.delete(url);
130
+ }
131
+ })();
132
+ this.loadingPromises.set(url, promise);
133
+ return promise;
134
+ }
135
+ async getOrLoadBuffer(sampleType, customUrl) {
136
+ if (customUrl) {
137
+ try {
138
+ const { buffer } = await this.loadSampleFromUrl(customUrl);
139
+ return buffer;
140
+ } catch (err) {
141
+ console.warn("Failed to load custom sample URL, falling back to preset:", customUrl, err);
142
+ }
143
+ }
144
+ return this.getOrCreatePresetBuffer(sampleType);
145
+ }
146
+ async auditionSampleUrl(url, onEnded) {
147
+ this.stopAudition();
148
+ const ctx = this.getContext();
149
+ if (ctx.state === "suspended") await ctx.resume().catch(() => {
150
+ });
151
+ try {
152
+ const { buffer } = await this.loadSampleFromUrl(url);
153
+ if (ctx.state === "suspended") await ctx.resume().catch(() => {
154
+ });
155
+ const src = ctx.createBufferSource();
156
+ src.buffer = buffer;
157
+ const gain = ctx.createGain();
158
+ gain.gain.value = 0.85;
159
+ src.connect(gain);
160
+ gain.connect(synthEngine.getMasterNode() || ctx.destination);
161
+ this.activeAudition = {
162
+ url,
163
+ startTime: ctx.currentTime,
164
+ duration: buffer.duration,
165
+ source: src
166
+ };
167
+ src.onended = () => {
168
+ if (this.activeAudition?.source === src) this.activeAudition = null;
169
+ if (onEnded) onEnded();
170
+ };
171
+ src.start();
172
+ } catch (err) {
173
+ console.error("Failed to audition sample:", err);
174
+ if (onEnded) onEnded();
175
+ }
176
+ }
177
+ stopAudition() {
178
+ if (this.activeAudition) {
179
+ try {
180
+ this.activeAudition.source.stop();
181
+ this.activeAudition.source.disconnect();
182
+ } catch {
183
+ }
184
+ this.activeAudition = null;
185
+ }
186
+ }
187
+ getAuditionProgress() {
188
+ if (!this.activeAudition) return { isPlaying: false, progress: 0 };
189
+ const ctx = this.getContext();
190
+ const elapsed = ctx.currentTime - this.activeAudition.startTime;
191
+ const progress = Math.max(0, Math.min(1, elapsed / this.activeAudition.duration));
192
+ return { isPlaying: elapsed <= this.activeAudition.duration, progress };
193
+ }
194
+ async playAudioTrack(track, bpm, destination, containerId, offsetBeats, volumeScale = 1, panOffset = 0) {
195
+ const ctx = this.getContext();
196
+ if (ctx.state === "suspended") await ctx.resume().catch(() => {
197
+ });
198
+ if (!containerId || !synthEngine.isNodeConnectedToOutput(containerId)) return;
199
+ this.stopAudioTrack(track.id);
200
+ const buffer = await this.getOrLoadBuffer(track.sampleType, track.customAudioUrl);
201
+ if (ctx.state === "suspended") await ctx.resume().catch(() => {
202
+ });
203
+ const source = ctx.createBufferSource();
204
+ source.buffer = buffer;
205
+ source.playbackRate.setValueAtTime(Math.pow(2, (track.pitchShift || 0) / 12), ctx.currentTime);
206
+ const filter = ctx.createBiquadFilter();
207
+ filter.type = "lowpass";
208
+ filter.frequency.setValueAtTime(track.filterCutoff || 8e3, ctx.currentTime);
209
+ const gainNode = ctx.createGain();
210
+ const effectiveGain = Math.max(0, (track.gain ?? 1) * volumeScale * 0.75);
211
+ gainNode.gain.setValueAtTime(effectiveGain, ctx.currentTime);
212
+ const outTarget = destination || synthEngine.getMasterNode() || ctx.destination;
213
+ const panner = ctx.createStereoPanner ? ctx.createStereoPanner() : null;
214
+ if (panner) {
215
+ const effectivePan = Math.max(-1, Math.min(1, (track.pan || 0) + panOffset));
216
+ panner.pan.setValueAtTime(effectivePan, ctx.currentTime);
217
+ source.connect(filter);
218
+ filter.connect(gainNode);
219
+ gainNode.connect(panner);
220
+ panner.connect(outTarget);
221
+ } else {
222
+ source.connect(filter);
223
+ filter.connect(gainNode);
224
+ gainNode.connect(outTarget);
225
+ }
226
+ const secPerBeat = 60 / (bpm || 120);
227
+ const startSec = ((track.trimStartBeats || 0) + (offsetBeats || 0)) * secPerBeat;
228
+ const endSec = Math.min(buffer.duration, (track.trimEndBeats || track.durationBeats || 4) * secPerBeat);
229
+ const playDuration = Math.max(0.05, endSec - startSec);
230
+ this.activeSources.set(track.id, source);
231
+ if (containerId) {
232
+ synthEngine.markNodeActive(containerId, playDuration);
233
+ }
234
+ this.activePlaybacks.set(track.id, {
235
+ trackId: track.id,
236
+ startTime: ctx.currentTime,
237
+ startSec,
238
+ playDuration,
239
+ bufferDuration: buffer.duration,
240
+ secPerBeat,
241
+ source
242
+ });
243
+ source.start(ctx.currentTime, startSec, playDuration);
244
+ source.onended = () => {
245
+ if (this.activeSources.get(track.id) === source) {
246
+ this.activeSources.delete(track.id);
247
+ this.activePlaybacks.delete(track.id);
248
+ }
249
+ };
250
+ }
251
+ getTrackPlaybackProgress(trackId) {
252
+ const playback = this.activePlaybacks.get(trackId);
253
+ if (!playback) return { isPlaying: false, progress: 0, currentBeat: 0, elapsedSec: 0 };
254
+ const ctx = this.getContext();
255
+ const elapsed = ctx.currentTime - playback.startTime;
256
+ if (elapsed > playback.playDuration) {
257
+ return { isPlaying: false, progress: 1, currentBeat: playback.playDuration / playback.secPerBeat, elapsedSec: playback.playDuration };
258
+ }
259
+ const progress = Math.max(0, Math.min(1, elapsed / playback.playDuration));
260
+ return { isPlaying: true, progress, currentBeat: elapsed / playback.secPerBeat, elapsedSec: elapsed };
261
+ }
262
+ stopAudioTrack(trackId) {
263
+ const active = this.activeSources.get(trackId);
264
+ if (active) {
265
+ try {
266
+ active.stop();
267
+ active.disconnect();
268
+ } catch {
269
+ }
270
+ this.activeSources.delete(trackId);
271
+ this.activePlaybacks.delete(trackId);
272
+ }
273
+ }
274
+ async loadAudioFile(file) {
275
+ const ctx = this.getContext();
276
+ const arrayBuf = await file.arrayBuffer();
277
+ const audioBuf = await ctx.decodeAudioData(arrayBuf);
278
+ const peaks = this.extractWaveformData(audioBuf, 100);
279
+ const url = URL.createObjectURL(file);
280
+ this.setBufferCacheEntry(url, audioBuf);
281
+ return { buffer: audioBuf, peaks, url };
282
+ }
283
+ startRecording(node, currentBeat, onUpdateNode) {
284
+ const updated = {
285
+ ...node,
286
+ isRecording: true,
287
+ isArmed: false,
288
+ quantizeStatus: "recording",
289
+ recordingStartBeat: currentBeat,
290
+ pendingTriggerBeat: null,
291
+ pendingAction: null
292
+ };
293
+ if (onUpdateNode) onUpdateNode(updated);
294
+ }
295
+ stopRecordingToContainer(node, targetContainer, onUpdateNode) {
296
+ const isAudio = node.recorderType === "audio" || node.recorderType === "audio_stereo" || node.recorderType === "audio_mono";
297
+ const isCurve = node.recorderType === "curve";
298
+ const isMidi = node.recorderType === "midi";
299
+ const durationBeats = node.recordingLengthBeats || 4;
300
+ const packetName = node.targetPacketName || `Take ${(node.recordedPacketsCount || 0) + 1}`;
301
+ const newPacket = {
302
+ id: `pkt-${Date.now()}`,
303
+ index: Array.isArray(targetContainer) && targetContainer[0]?.packets ? targetContainer[0].packets.length : targetContainer?.packets ? targetContainer.packets.length : 0,
304
+ name: packetName,
305
+ type: isAudio ? "audio" : isCurve ? "curve" : "midi",
306
+ signalFormat: "packet",
307
+ signalType: isAudio ? "audio_packet" : isCurve ? "curve_packet" : "midi_packet",
308
+ durationBeats,
309
+ createdAt: Date.now()
310
+ };
311
+ if (isAudio) {
312
+ newPacket.sampleType = "cosmic_warp";
313
+ newPacket.gain = 1;
314
+ newPacket.pan = 0;
315
+ newPacket.pitchShift = 0;
316
+ newPacket.filterCutoff = 8e3;
317
+ newPacket.fadeInBeats = 0.05;
318
+ newPacket.fadeOutBeats = 0.1;
319
+ newPacket.trimStartBeats = 0;
320
+ newPacket.trimEndBeats = durationBeats;
321
+ newPacket.audioFormat = node.recorderType === "audio_mono" ? "mono" : "stereo";
322
+ } else if (isCurve) {
323
+ newPacket.curveData = {
324
+ id: `crv-${Date.now()}`,
325
+ name: packetName,
326
+ lengthInBeats: durationBeats,
327
+ targetParam: "cutoff",
328
+ minValue: 400,
329
+ maxValue: 8e3,
330
+ points: [
331
+ { id: "p0", x: 0, y: 0.2, tension: 0 },
332
+ { id: "p1", x: durationBeats * 0.25, y: 0.8, tension: 0 },
333
+ { id: "p2", x: durationBeats * 0.5, y: 0.4, tension: 0 },
334
+ { id: "p3", x: durationBeats * 0.75, y: 0.9, tension: 0 },
335
+ { id: "p4", x: durationBeats, y: 0.2, tension: 0 }
336
+ ]
337
+ };
338
+ } else {
339
+ newPacket.pattern = {
340
+ id: `pat-${Date.now()}`,
341
+ name: packetName,
342
+ lengthInBeats: durationBeats,
343
+ tempo: 120,
344
+ notes: [
345
+ { note: 60, name: "C4", velocity: 0.8, time: 0, duration: 1 },
346
+ { note: 64, name: "E4", velocity: 0.8, time: 1, duration: 1 },
347
+ { note: 67, name: "G4", velocity: 0.8, time: 2, duration: 1 },
348
+ { note: 71, name: "B4", velocity: 0.8, time: 3, duration: 1 }
349
+ ]
350
+ };
351
+ }
352
+ const defaultWaveform = [
353
+ 0.12,
354
+ 0.35,
355
+ 0.65,
356
+ 0.8,
357
+ 0.55,
358
+ 0.72,
359
+ 0.88,
360
+ 0.6,
361
+ 0.25,
362
+ 0.48,
363
+ 0.75,
364
+ 0.9,
365
+ 0.68,
366
+ 0.38,
367
+ 0.58,
368
+ 0.82,
369
+ 0.88,
370
+ 0.58,
371
+ 0.32,
372
+ 0.52,
373
+ 0.78,
374
+ 0.89,
375
+ 0.68,
376
+ 0.48,
377
+ 0.62,
378
+ 0.82,
379
+ 0.72,
380
+ 0.48,
381
+ 0.28,
382
+ 0.42,
383
+ 0.55,
384
+ 0.32,
385
+ 0.18,
386
+ 0.12,
387
+ 0.08,
388
+ 0.06
389
+ ];
390
+ if (isAudio) {
391
+ newPacket.waveformData = defaultWaveform;
392
+ }
393
+ const containers = Array.isArray(targetContainer) ? targetContainer : targetContainer ? [targetContainer] : [];
394
+ containers.forEach((cont) => {
395
+ if (!cont || node.autoStoreOnStop === false) return;
396
+ if (isAudio) {
397
+ cont.audioTrack = {
398
+ id: `aud-${Date.now()}-${cont.id}`,
399
+ name: packetName,
400
+ sampleType: newPacket.sampleType || "cosmic_warp",
401
+ durationBeats,
402
+ gain: 1,
403
+ pan: 0,
404
+ pitchShift: 0,
405
+ filterCutoff: 8e3,
406
+ fadeInBeats: 0.05,
407
+ fadeOutBeats: 0.1,
408
+ trimStartBeats: 0,
409
+ trimEndBeats: durationBeats,
410
+ isReversed: false,
411
+ waveformData: defaultWaveform
412
+ };
413
+ } else if (isCurve) {
414
+ cont.curveData = newPacket.curveData;
415
+ } else {
416
+ cont.pattern = newPacket.pattern;
417
+ }
418
+ });
419
+ const updatedNode = {
420
+ ...node,
421
+ isRecording: false,
422
+ isArmed: false,
423
+ quantizeStatus: "idle",
424
+ pendingTriggerBeat: null,
425
+ pendingAction: null,
426
+ recordedPacketsCount: (node.recordedPacketsCount || 0) + 1,
427
+ targetPacketName: `Take ${(node.recordedPacketsCount || 0) + 2}`,
428
+ lastTransferredAt: Date.now()
429
+ };
430
+ if (onUpdateNode) onUpdateNode(updatedNode);
431
+ }
432
+ };
433
+ var audioClipEngine = new AudioClipEngine();
434
+
435
+ export {
436
+ generatePresetAudioBuffer,
437
+ AudioClipEngine,
438
+ audioClipEngine
439
+ };