@libraz/libsonare 1.0.4 → 1.2.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.
@@ -0,0 +1,447 @@
1
+ import { RealtimeEngine, EngineParameterInfo, EngineClip, EngineMetronomeConfig, AutomationCurve } from './index.js';
2
+ export { init, isInitialized } from './index.js';
3
+
4
+ interface SonareRtModule {
5
+ _malloc(size: number): number;
6
+ _free(ptr: number): void;
7
+ _sonare_rt_engine_abi_version(): number;
8
+ _sonare_rt_engine_create(): number;
9
+ _sonare_rt_engine_destroy(engine: number): void;
10
+ _sonare_rt_engine_prepare(
11
+ engine: number,
12
+ sampleRate: number,
13
+ maxBlockSize: number,
14
+ commandCapacity: number,
15
+ telemetryCapacity: number,
16
+ ): number;
17
+ _sonare_rt_engine_play(engine: number, renderFrame: bigint): number;
18
+ _sonare_rt_engine_stop(engine: number, renderFrame: bigint): number;
19
+ _sonare_rt_engine_seek_sample(
20
+ engine: number,
21
+ timelineSample: bigint,
22
+ renderFrame: bigint,
23
+ ): number;
24
+ _sonare_rt_engine_seek_ppq(engine: number, ppq: number, renderFrame: bigint): number;
25
+ _sonare_rt_engine_set_tempo(engine: number, bpm: number): number;
26
+ _sonare_rt_engine_set_loop(
27
+ engine: number,
28
+ startPpq: number,
29
+ endPpq: number,
30
+ enabled: number,
31
+ ): number;
32
+ _sonare_rt_engine_seek_marker(engine: number, markerId: number, renderFrame: bigint): number;
33
+ _sonare_rt_engine_set_metronome_enabled(
34
+ engine: number,
35
+ enabled: number,
36
+ beatGain: number,
37
+ accentGain: number,
38
+ clickSamples: number,
39
+ ): number;
40
+ _sonare_rt_engine_set_capture_armed(engine: number, armed: number): number;
41
+ _sonare_rt_engine_set_capture_punch(
42
+ engine: number,
43
+ startSample: bigint,
44
+ endSample: bigint,
45
+ enabled: number,
46
+ ): number;
47
+ _sonare_rt_engine_process(
48
+ engine: number,
49
+ channelsPtr: number,
50
+ numChannels: number,
51
+ numFrames: number,
52
+ ): void;
53
+ _sonare_rt_engine_drain_telemetry(
54
+ engine: number,
55
+ typesErrorsValuesPtr: number,
56
+ frameValuesPtr: number,
57
+ maxRecords: number,
58
+ ): number;
59
+ }
60
+
61
+ interface SonareWorkletProcessorOptions {
62
+ sceneJson: string;
63
+ sampleRate?: number;
64
+ blockSize?: number;
65
+ stripCount?: number;
66
+ meterIntervalFrames?: number;
67
+ meterSharedBuffer?: SharedArrayBuffer;
68
+ meterRingCapacity?: number;
69
+ spectrumIntervalFrames?: number;
70
+ spectrumBands?: number;
71
+ spectrumSharedBuffer?: SharedArrayBuffer;
72
+ spectrumRingCapacity?: number;
73
+ }
74
+ interface SonareRealtimeEngineWorkletProcessorOptions {
75
+ runtimeTarget?: 'embind' | 'sonare-rt';
76
+ rtModuleUrl?: string;
77
+ rtWasmBinary?: ArrayBuffer | Uint8Array;
78
+ sampleRate?: number;
79
+ blockSize?: number;
80
+ channelCount?: number;
81
+ meterIntervalFrames?: number;
82
+ commandSharedBuffer?: SharedArrayBuffer;
83
+ commandRingCapacity?: number;
84
+ telemetrySharedBuffer?: SharedArrayBuffer;
85
+ telemetryRingCapacity?: number;
86
+ }
87
+ interface SonareRealtimeEngineNodeCapabilities {
88
+ mode: 'sab' | 'postMessage';
89
+ runtimeTarget: 'embind' | 'sonare-rt';
90
+ sharedArrayBuffer: boolean;
91
+ atomics: boolean;
92
+ audioWorklet: boolean;
93
+ engineAbiVersion?: number;
94
+ expectedEngineAbiVersion?: number;
95
+ abiCompatible?: boolean;
96
+ degradedReason?: string;
97
+ }
98
+ interface SonareRealtimeEngineNodeOptions extends SonareRealtimeEngineWorkletProcessorOptions {
99
+ processorName?: string;
100
+ moduleUrl?: string | URL;
101
+ rtModuleUrl?: string;
102
+ mode?: 'auto' | 'sab' | 'postMessage';
103
+ engineAbiVersion?: number;
104
+ expectedEngineAbiVersion?: number;
105
+ requireAbiCompatible?: boolean;
106
+ nodeFactory?: (context: BaseAudioContext, processorName: string, options: AudioWorkletNodeOptions) => AudioWorkletNode;
107
+ }
108
+ interface SonareRtRealtimeEngineRuntimeOptions {
109
+ module: SonareRtModule;
110
+ memory: WebAssembly.Memory;
111
+ sampleRate?: number;
112
+ blockSize?: number;
113
+ channelCount?: number;
114
+ commandSharedBuffer?: SharedArrayBuffer;
115
+ commandRingCapacity?: number;
116
+ telemetrySharedBuffer?: SharedArrayBuffer;
117
+ telemetryRingCapacity?: number;
118
+ }
119
+ interface SonareEngineOptions extends SonareRealtimeEngineNodeOptions {
120
+ offlineEngine?: RealtimeEngine;
121
+ offlineBlockSize?: number;
122
+ offlineChannelCount?: number;
123
+ }
124
+ interface SonareEngineTransportFacade {
125
+ play(sampleTime?: number): boolean;
126
+ stop(sampleTime?: number): boolean;
127
+ seekPpq(ppq: number, sampleTime?: number): boolean;
128
+ seekSeconds(seconds: number, sampleTime?: number): boolean;
129
+ setTempo(bpm: number): void;
130
+ setLoop(startPpq: number, endPpq: number, enabled?: boolean): boolean;
131
+ }
132
+ type WorkletInput = readonly (readonly Float32Array[])[];
133
+ type WorkletOutput = Float32Array[][];
134
+ interface SonareWorkletScheduleInsertAutomationMessage {
135
+ type: 'scheduleInsertAutomation';
136
+ stripIndex: number;
137
+ insertIndex: number;
138
+ paramId: number;
139
+ value: number;
140
+ samplePos?: number;
141
+ curve?: AutomationCurve;
142
+ }
143
+ interface SonareWorkletSetMeterIntervalMessage {
144
+ type: 'setMeterInterval';
145
+ frames: number;
146
+ }
147
+ interface SonareWorkletDestroyMessage {
148
+ type: 'destroy';
149
+ }
150
+ type SonareWorkletMessage = SonareWorkletScheduleInsertAutomationMessage | SonareWorkletSetMeterIntervalMessage | SonareWorkletDestroyMessage;
151
+ interface SonareWorkletMeterSnapshot {
152
+ type: 'meter';
153
+ frame: number;
154
+ peakDbL: number;
155
+ peakDbR: number;
156
+ rmsDbL: number;
157
+ rmsDbR: number;
158
+ correlation: number;
159
+ }
160
+ interface SonareWorkletSpectrumSnapshot {
161
+ type: 'spectrum';
162
+ frame: number;
163
+ bands: Float32Array;
164
+ }
165
+ type SonareWorkletTransportMessage = SonareWorkletMeterSnapshot | SonareWorkletSpectrumSnapshot | SonareEngineTelemetryRecord;
166
+ declare const SONARE_METER_RING_HEADER_INTS = 4;
167
+ declare const SONARE_METER_RING_RECORD_FLOATS = 6;
168
+ declare const SONARE_SPECTRUM_RING_HEADER_INTS = 5;
169
+ declare const SONARE_ENGINE_RING_HEADER_INTS = 5;
170
+ declare const SONARE_ENGINE_COMMAND_RECORD_BYTES = 32;
171
+ declare const SONARE_ENGINE_TELEMETRY_RECORD_BYTES = 48;
172
+ declare enum SonareEngineCommandType {
173
+ SetParam = 0,
174
+ SetParamSmoothed = 1,
175
+ TransportPlay = 2,
176
+ TransportStop = 3,
177
+ TransportSeekSample = 4,
178
+ TransportSeekPpq = 5,
179
+ SetTempoMap = 6,
180
+ SetLoop = 7,
181
+ SwapGraph = 8,
182
+ SwapAutomation = 9,
183
+ SetSoloMute = 10,
184
+ AddClip = 11,
185
+ RemoveClip = 12,
186
+ ArmRecord = 13,
187
+ Punch = 14,
188
+ SetMetronome = 15,
189
+ SetMarker = 16,
190
+ SeekMarker = 17
191
+ }
192
+ declare enum SonareEngineTelemetryType {
193
+ ProcessBlock = 0,
194
+ Error = 1
195
+ }
196
+ declare enum SonareEngineTelemetryError {
197
+ None = 0,
198
+ CommandQueueOverflow = 1,
199
+ PendingCommandOverflow = 2,
200
+ BoundaryOverflow = 3,
201
+ TelemetryOverflow = 4,
202
+ CaptureOverflow = 5,
203
+ MaxBlockExceeded = 6,
204
+ UnknownTarget = 7,
205
+ NonRealtimeSafeParameter = 8,
206
+ NotPrepared = 9,
207
+ NonQueueableCommand = 10,
208
+ AutomationBindTargetOverflow = 11,
209
+ StaleAutomationLanes = 12,
210
+ SmoothedParameterCapacity = 13
211
+ }
212
+ interface WorkletTransport {
213
+ postMessage?: (message: SonareWorkletTransportMessage) => void;
214
+ onMeter?: (meter: SonareWorkletMeterSnapshot) => void;
215
+ onSpectrum?: (spectrum: SonareWorkletSpectrumSnapshot) => void;
216
+ }
217
+ interface SonareMeterRingBuffer {
218
+ sharedBuffer: SharedArrayBuffer;
219
+ header: Int32Array;
220
+ records: Float32Array;
221
+ capacity: number;
222
+ }
223
+ interface SonareMeterRingReadResult {
224
+ nextReadIndex: number;
225
+ meters: SonareWorkletMeterSnapshot[];
226
+ }
227
+ interface SonareSpectrumRingBuffer {
228
+ sharedBuffer: SharedArrayBuffer;
229
+ header: Int32Array;
230
+ records: Float32Array;
231
+ capacity: number;
232
+ bands: number;
233
+ }
234
+ interface SonareSpectrumRingReadResult {
235
+ nextReadIndex: number;
236
+ spectra: SonareWorkletSpectrumSnapshot[];
237
+ }
238
+ interface SonareEngineCommandRecord {
239
+ type: SonareEngineCommandType | number;
240
+ targetId?: number;
241
+ sampleTime?: number | bigint;
242
+ argFloat?: number;
243
+ argInt?: number | bigint;
244
+ }
245
+ interface SonareEngineTelemetryRecord {
246
+ type: SonareEngineTelemetryType | number;
247
+ error: SonareEngineTelemetryError | number;
248
+ renderFrame: number;
249
+ timelineSample: number;
250
+ audibleTimelineSample: number;
251
+ graphLatencySamplesQ8: number;
252
+ value: number;
253
+ }
254
+ interface SonareEngineCommandRingBuffer {
255
+ sharedBuffer: SharedArrayBuffer;
256
+ header: Int32Array;
257
+ view: DataView;
258
+ capacity: number;
259
+ }
260
+ interface SonareEngineTelemetryRingBuffer {
261
+ sharedBuffer: SharedArrayBuffer;
262
+ header: Int32Array;
263
+ view: DataView;
264
+ capacity: number;
265
+ }
266
+ interface SonareEngineTelemetryRingReadResult {
267
+ nextReadIndex: number;
268
+ telemetry: SonareEngineTelemetryRecord[];
269
+ }
270
+ declare function sonareMeterRingBufferByteLength(capacity: number): number;
271
+ declare function createSonareMeterRingBuffer(capacity?: number): SonareMeterRingBuffer;
272
+ declare function readSonareMeterRingBuffer(ring: SonareMeterRingBuffer, readIndex?: number): SonareMeterRingReadResult;
273
+ declare function sonareSpectrumRingBufferByteLength(capacity: number, bands?: number): number;
274
+ declare function createSonareSpectrumRingBuffer(capacity?: number, bands?: number): SonareSpectrumRingBuffer;
275
+ declare function readSonareSpectrumRingBuffer(ring: SonareSpectrumRingBuffer, readIndex?: number): SonareSpectrumRingReadResult;
276
+ declare function sonareEngineCommandRingBufferByteLength(capacity: number): number;
277
+ declare function sonareEngineTelemetryRingBufferByteLength(capacity: number): number;
278
+ declare function createSonareEngineCommandRingBuffer(capacity?: number): SonareEngineCommandRingBuffer;
279
+ declare function createSonareEngineTelemetryRingBuffer(capacity?: number): SonareEngineTelemetryRingBuffer;
280
+ declare function pushSonareEngineCommandRingBuffer(ring: SonareEngineCommandRingBuffer, command: SonareEngineCommandRecord): boolean;
281
+ declare function popSonareEngineCommandRingBuffer(ring: SonareEngineCommandRingBuffer): SonareEngineCommandRecord | null;
282
+ declare function writeSonareEngineTelemetryRingBuffer(ring: SonareEngineTelemetryRingBuffer, telemetry: SonareEngineTelemetryRecord): void;
283
+ declare function readSonareEngineTelemetryRingBuffer(ring: SonareEngineTelemetryRingBuffer, readIndex?: number): SonareEngineTelemetryRingReadResult;
284
+ /**
285
+ * AudioWorklet-style mixer bridge backed by the package's single `sonare.wasm`.
286
+ *
287
+ * The WASM module must already be initialized via `init()` before constructing
288
+ * this bridge. Each AudioWorklet input is treated as one stereo strip:
289
+ * `inputs[strip][0]` is left and `inputs[strip][1]` is right. Missing channels
290
+ * are replaced with preallocated silence.
291
+ */
292
+ declare class SonareWorkletProcessor {
293
+ readonly sampleRate: number;
294
+ readonly blockSize: number;
295
+ private mixer;
296
+ private realtime;
297
+ private closed;
298
+ private processedFrames;
299
+ private lastMeterFrame;
300
+ private meterIntervalFrames;
301
+ private spectrumIntervalFrames;
302
+ private lastSpectrumFrame;
303
+ private transport?;
304
+ private meterRing?;
305
+ private spectrumRing?;
306
+ private spectrumBands;
307
+ constructor(options: SonareWorkletProcessorOptions, transport?: WorkletTransport);
308
+ process(inputs: WorkletInput, outputs: WorkletOutput): boolean;
309
+ receiveMessage(message: SonareWorkletMessage): void;
310
+ destroy(): void;
311
+ private publishMeter;
312
+ private writeMeterRing;
313
+ private publishSpectrum;
314
+ private computeSpectrum;
315
+ private writeSpectrumRing;
316
+ }
317
+ /**
318
+ * AudioWorklet-style bridge for the DAW realtime engine facade.
319
+ *
320
+ * The default mode uses the existing `sonare.wasm` embind facade. The
321
+ * `sonare-rt` target is exposed as a selectable runtime target for hosts that
322
+ * load the dedicated Emscripten AudioWorklet module.
323
+ */
324
+ declare class SonareRealtimeEngineWorkletProcessor {
325
+ readonly sampleRate: number;
326
+ readonly blockSize: number;
327
+ readonly channelCount: number;
328
+ readonly runtimeTarget: 'embind' | 'sonare-rt';
329
+ private engine;
330
+ private closed;
331
+ private commandRing?;
332
+ private telemetryRing?;
333
+ private transport?;
334
+ private meterIntervalFrames;
335
+ private lastMeterFrame;
336
+ constructor(options?: SonareRealtimeEngineWorkletProcessorOptions, transport?: WorkletTransport);
337
+ process(inputs: WorkletInput, outputs: WorkletOutput): boolean;
338
+ receiveCommand(command: SonareEngineCommandRecord): void;
339
+ destroy(): void;
340
+ private drainCommands;
341
+ private applyCommand;
342
+ private publishTelemetry;
343
+ private publishTelemetryRecord;
344
+ private publishMeters;
345
+ private commandRingFromSharedBuffer;
346
+ private telemetryRingFromSharedBuffer;
347
+ }
348
+ declare class SonareRtRealtimeEngineRuntime {
349
+ readonly sampleRate: number;
350
+ readonly blockSize: number;
351
+ readonly channelCount: number;
352
+ private readonly module;
353
+ private readonly memory;
354
+ private readonly engine;
355
+ private readonly channelPointerTable;
356
+ private readonly channelBuffers;
357
+ private readonly telemetryIntsPtr;
358
+ private readonly telemetryFramesPtr;
359
+ private readonly commandRing?;
360
+ private readonly telemetryRing?;
361
+ private closed;
362
+ constructor(options: SonareRtRealtimeEngineRuntimeOptions);
363
+ process(inputs: WorkletInput, outputs: WorkletOutput): boolean;
364
+ destroy(): void;
365
+ private writeChannelPointers;
366
+ private drainCommands;
367
+ private applyCommand;
368
+ private publishTelemetry;
369
+ private commandRingFromSharedBuffer;
370
+ private telemetryRingFromSharedBuffer;
371
+ }
372
+ declare class SonareRealtimeEngineNode {
373
+ readonly node: AudioWorkletNode;
374
+ readonly capabilities: SonareRealtimeEngineNodeCapabilities;
375
+ readonly commandRing?: SonareEngineCommandRingBuffer;
376
+ readonly telemetryRing?: SonareEngineTelemetryRingBuffer;
377
+ readonly ready: Promise<void>;
378
+ private telemetryReadIndex;
379
+ private telemetryListeners;
380
+ private meterListeners;
381
+ private resolveReady;
382
+ private rejectReady;
383
+ private destroyed;
384
+ private constructor();
385
+ static create(context: BaseAudioContext, options?: SonareRealtimeEngineNodeOptions): Promise<SonareRealtimeEngineNode>;
386
+ play(sampleTime?: number): boolean;
387
+ stop(sampleTime?: number): boolean;
388
+ seekSample(timelineSample: number, sampleTime?: number): boolean;
389
+ seekPpq(ppq: number, sampleTime?: number): boolean;
390
+ sendCommand(command: SonareEngineCommandRecord): boolean;
391
+ pollTelemetry(): SonareEngineTelemetryRecord[];
392
+ onTelemetry(callback: (telemetry: SonareEngineTelemetryRecord) => void): () => void;
393
+ onMeter(callback: (meter: SonareWorkletMeterSnapshot) => void): () => void;
394
+ destroy(): void;
395
+ private emitTelemetry;
396
+ private emitMeter;
397
+ }
398
+ declare class SonareEngine {
399
+ readonly node: AudioWorkletNode;
400
+ readonly capabilities: SonareRealtimeEngineNodeCapabilities;
401
+ readonly transport: SonareEngineTransportFacade;
402
+ private readonly realtimeNode;
403
+ private readonly offlineEngine;
404
+ private readonly context;
405
+ private readonly sampleRate;
406
+ private readonly offlineBlockSize;
407
+ private readonly offlineChannelCount;
408
+ private readonly automationLanes;
409
+ private readonly clips;
410
+ private readonly markers;
411
+ private nextClipId;
412
+ private nextMarkerId;
413
+ private destroyed;
414
+ private constructor();
415
+ static create(context: BaseAudioContext, options?: SonareEngineOptions): Promise<SonareEngine>;
416
+ suspend(): Promise<void>;
417
+ resume(): Promise<void>;
418
+ setTempo(bpm: number): void;
419
+ setLoop(startPpq: number, endPpq: number, enabled?: boolean): boolean;
420
+ setParam(nodeId: string, param: string | number, value: number): boolean;
421
+ scheduleParam(nodeId: string, param: string | number, ppq: number, value: number, curve?: number | 'linear' | 'exponential'): void;
422
+ addAutomationPoint(laneId: string | number, ppq: number, value: number, curve?: number | 'linear' | 'exponential'): void;
423
+ listParameters(): EngineParameterInfo[];
424
+ setSoloMute(target: string | number, solo: boolean, mute: boolean): boolean;
425
+ addClip(trackId: string | number, buffer: Float32Array[], startPpq: number, opts?: Partial<Omit<EngineClip, 'channels' | 'startPpq'>>): number;
426
+ removeClip(clipId: number): void;
427
+ armRecord(trackId: string | number, enabled: boolean): boolean;
428
+ punch(inPpq: number, outPpq: number): boolean;
429
+ setMetronome(opts: EngineMetronomeConfig): void;
430
+ addMarker(ppq: number, name?: string): number;
431
+ seekMarker(markerId: number): boolean;
432
+ renderOffline(totalFrames: number): Promise<Float32Array[]>;
433
+ onMeter(callback: (meter: SonareWorkletMeterSnapshot) => void): () => void;
434
+ onTelemetry(callback: (telemetry: SonareEngineTelemetryRecord) => void): () => void;
435
+ pollTelemetry(): SonareEngineTelemetryRecord[];
436
+ destroy(): void;
437
+ private syncClips;
438
+ private syncMarkers;
439
+ private resolveParamId;
440
+ private resolveTargetId;
441
+ private curveCode;
442
+ private ppqToApproxSample;
443
+ }
444
+ declare function registerSonareWorkletProcessor(name?: string): void;
445
+ declare function registerSonareRealtimeEngineWorkletProcessor(name?: string): void;
446
+
447
+ export { SONARE_ENGINE_COMMAND_RECORD_BYTES, SONARE_ENGINE_RING_HEADER_INTS, SONARE_ENGINE_TELEMETRY_RECORD_BYTES, SONARE_METER_RING_HEADER_INTS, SONARE_METER_RING_RECORD_FLOATS, SONARE_SPECTRUM_RING_HEADER_INTS, SonareEngine, type SonareEngineCommandRecord, type SonareEngineCommandRingBuffer, SonareEngineCommandType, type SonareEngineOptions, SonareEngineTelemetryError, type SonareEngineTelemetryRecord, type SonareEngineTelemetryRingBuffer, type SonareEngineTelemetryRingReadResult, SonareEngineTelemetryType, type SonareEngineTransportFacade, type SonareMeterRingBuffer, type SonareMeterRingReadResult, SonareRealtimeEngineNode, type SonareRealtimeEngineNodeCapabilities, type SonareRealtimeEngineNodeOptions, SonareRealtimeEngineWorkletProcessor, type SonareRealtimeEngineWorkletProcessorOptions, SonareRtRealtimeEngineRuntime, type SonareRtRealtimeEngineRuntimeOptions, type SonareSpectrumRingBuffer, type SonareSpectrumRingReadResult, type SonareWorkletDestroyMessage, type SonareWorkletMessage, type SonareWorkletMeterSnapshot, SonareWorkletProcessor, type SonareWorkletProcessorOptions, type SonareWorkletScheduleInsertAutomationMessage, type SonareWorkletSetMeterIntervalMessage, type SonareWorkletSpectrumSnapshot, type SonareWorkletTransportMessage, createSonareEngineCommandRingBuffer, createSonareEngineTelemetryRingBuffer, createSonareMeterRingBuffer, createSonareSpectrumRingBuffer, popSonareEngineCommandRingBuffer, pushSonareEngineCommandRingBuffer, readSonareEngineTelemetryRingBuffer, readSonareMeterRingBuffer, readSonareSpectrumRingBuffer, registerSonareRealtimeEngineWorkletProcessor, registerSonareWorkletProcessor, sonareEngineCommandRingBufferByteLength, sonareEngineTelemetryRingBufferByteLength, sonareMeterRingBufferByteLength, sonareSpectrumRingBufferByteLength, writeSonareEngineTelemetryRingBuffer };