@kidlib/web-audio 0.1.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.
- package/LICENSE +21 -0
- package/README.md +24 -0
- package/dist/components.d.ts +94 -0
- package/dist/components.js +398 -0
- package/dist/index.d.ts +1283 -0
- package/dist/index.js +7550 -0
- package/dist/io.d.ts +239 -0
- package/dist/io.js +193 -0
- package/dist/keymap-3lZMR1Ak.js +167 -0
- package/dist/processors/processors.js +1627 -0
- package/package.json +72 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,1283 @@
|
|
|
1
|
+
declare type AudioContextConfig = {
|
|
2
|
+
sampleRate?: number;
|
|
3
|
+
latencyHint?: AudioContextLatencyCategory;
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
declare const AudioRecorderState: {
|
|
7
|
+
readonly IDLE: "IDLE";
|
|
8
|
+
readonly ARMED: "ARMED";
|
|
9
|
+
readonly RECORDING: "RECORDING";
|
|
10
|
+
readonly STOPPED: "STOPPED";
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
declare type AudioRecorderState = (typeof AudioRecorderState)[keyof typeof AudioRecorderState];
|
|
14
|
+
|
|
15
|
+
declare type BaseNodeType = 'instrument' | 'voice' | 'fx' | 'param' | 'container' | 'recorder' | 'audiograph';
|
|
16
|
+
|
|
17
|
+
declare type BusNodeName = 'input' | 'output' | 'dryMix' | 'wetMix' | 'hpf' | 'lpf' | 'distortion' | 'feedback' | 'reverb' | 'compressor' | 'limiter' | 'delay';
|
|
18
|
+
|
|
19
|
+
declare type BusNodeTypeMap = {
|
|
20
|
+
input: ILibAudioNode<GainNode>;
|
|
21
|
+
lpf: ILibAudioNode<BiquadFilterNode>;
|
|
22
|
+
hpf: ILibAudioNode<BiquadFilterNode>;
|
|
23
|
+
dryMix: ILibAudioNode<GainNode>;
|
|
24
|
+
wetMix: ILibAudioNode<GainNode>;
|
|
25
|
+
output: ILibAudioNode<GainNode>;
|
|
26
|
+
compressor: ILibAudioNode<DynamicsCompressorNode>;
|
|
27
|
+
limiter: ILibAudioNode<DynamicsCompressorNode>;
|
|
28
|
+
feedback: HarmonicFeedback;
|
|
29
|
+
distortion: ILibAudioNode<DistortionWorklet>;
|
|
30
|
+
reverb: DattorroReverb;
|
|
31
|
+
delay?: ILibAudioNode<DelayWorklet>;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
declare type BusSendName = `${BusNodeName}_send`;
|
|
35
|
+
|
|
36
|
+
/** False in Safari — AudioContext.setSinkId is Chromium/Firefox only */
|
|
37
|
+
export declare function canSetOutputDevice(): boolean;
|
|
38
|
+
|
|
39
|
+
declare type ContainerType = 'pool' | 'chain' | 'audiolib';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Creates and initializes a new audio recorder
|
|
43
|
+
*
|
|
44
|
+
* @param context - Optional AudioContext to use. If not provided, the global audio context will be used.
|
|
45
|
+
* @returns A promise that resolves to the initialized Recorder instance // ! unnecessary async
|
|
46
|
+
*/
|
|
47
|
+
export declare function createAudioRecorder(context?: AudioContext): Promise<Recorder>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Creates a new SamplePlayer instance
|
|
51
|
+
*
|
|
52
|
+
* @param buffer - Optional audio buffer to use (will use default if not provided)
|
|
53
|
+
* @param polyphony - Number of voices for polyphony (default: 16)
|
|
54
|
+
* @param context - Optional AudioContext (will use global context if not provided)
|
|
55
|
+
* @returns A new SamplePlayer instance
|
|
56
|
+
*/
|
|
57
|
+
export declare function createSamplePlayer(buffer?: AudioBuffer | ArrayBuffer, polyphony?: number, context?: AudioContext): Promise<SamplePlayer>;
|
|
58
|
+
|
|
59
|
+
/** Custom Audiolib waveform */
|
|
60
|
+
declare const CUSTOM_WAVEFORMS: readonly ["pulse", "bandlimited-sawtooth", "supersaw", "warm-pad", "metallic", "formant", "white-noise", "pink-noise", "brown-noise", "colored-noise", "random-harmonic", "custom-function"];
|
|
61
|
+
|
|
62
|
+
export declare class CustomEnvelope implements LibNode {
|
|
63
|
+
#private;
|
|
64
|
+
readonly nodeId: NodeID_2;
|
|
65
|
+
readonly nodeType: EnvelopeType;
|
|
66
|
+
envelopeType: EnvelopeType;
|
|
67
|
+
constructor(context: AudioContext, envelopeType: EnvelopeType, sharedData?: EnvelopeData, initialPoints?: EnvelopePoint[], envPointValueRange?: [number, number], durationSeconds?: number, initEnable?: boolean);
|
|
68
|
+
addPoint: (time: number, value: number, curve?: "linear" | "exponential") => void;
|
|
69
|
+
deletePoint: (index: number) => void;
|
|
70
|
+
updatePoint: (index: number, time?: number, value?: number) => void;
|
|
71
|
+
setSampleDuration(seconds: number): this;
|
|
72
|
+
setValueRange: (range: [number, number]) => [number, number];
|
|
73
|
+
enable: () => boolean;
|
|
74
|
+
disable: () => boolean;
|
|
75
|
+
get initialized(): boolean;
|
|
76
|
+
get data(): EnvelopeData;
|
|
77
|
+
get param(): string;
|
|
78
|
+
get isEnabled(): boolean;
|
|
79
|
+
get points(): EnvelopePoint[];
|
|
80
|
+
get baseDuration(): number;
|
|
81
|
+
get effectiveDuration(): number;
|
|
82
|
+
get timeScale(): number;
|
|
83
|
+
/**
|
|
84
|
+
* The range of values applied to the audio param
|
|
85
|
+
**/
|
|
86
|
+
get envPointValueRange(): [number, number];
|
|
87
|
+
get loopEnabled(): boolean;
|
|
88
|
+
get syncedToPlaybackRate(): boolean;
|
|
89
|
+
get numPoints(): number;
|
|
90
|
+
getEffectivePointTime(index: number): number;
|
|
91
|
+
triggerEnvelope(audioParam: AudioParam, startTime: number, options?: {
|
|
92
|
+
baseValue: number;
|
|
93
|
+
playbackRate: number;
|
|
94
|
+
voiceId?: string;
|
|
95
|
+
midiNote?: number;
|
|
96
|
+
}): void;
|
|
97
|
+
releaseEnvelope(audioParam: AudioParam, startTime: number, options?: {
|
|
98
|
+
baseValue?: number;
|
|
99
|
+
playbackRate?: number;
|
|
100
|
+
voiceId?: string;
|
|
101
|
+
midiNote?: number;
|
|
102
|
+
minValue?: number;
|
|
103
|
+
maxValue?: number;
|
|
104
|
+
}, debugLog?: boolean): void;
|
|
105
|
+
setTimeScale: (timeScale: number) => void;
|
|
106
|
+
setLoopEnabled: (enabled: boolean, mode?: "normal" | "ping-pong" | "reverse") => void;
|
|
107
|
+
syncToPlaybackRate: (sync: boolean) => void;
|
|
108
|
+
setSustainPoint: (index: number | null) => void;
|
|
109
|
+
setReleasePoint: (index: number) => void;
|
|
110
|
+
get sustainPointIndex(): number | null;
|
|
111
|
+
get releasePointIndex(): number;
|
|
112
|
+
get releasePoint(): EnvelopePoint | null;
|
|
113
|
+
get effectiveReleaseStartTime(): number;
|
|
114
|
+
get baseReleaseDuration(): number;
|
|
115
|
+
get effectiveReleaseDuration(): number;
|
|
116
|
+
get sustainEnabled(): boolean;
|
|
117
|
+
get sustainPoint(): EnvelopePoint | null;
|
|
118
|
+
get currentPlaybackRate(): number;
|
|
119
|
+
setCurrentPlaybackRate(playbackRate: number): void;
|
|
120
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
121
|
+
sendUpstreamMessage(type: string, data: any): this;
|
|
122
|
+
hasVariation(): boolean;
|
|
123
|
+
static getDefaults(envType: EnvelopeType, durationSeconds?: number): {
|
|
124
|
+
points: {
|
|
125
|
+
time: number;
|
|
126
|
+
value: number;
|
|
127
|
+
curve: "exponential";
|
|
128
|
+
}[];
|
|
129
|
+
envPointValueRange: [number, number];
|
|
130
|
+
initEnable: boolean;
|
|
131
|
+
sustainPointIndex: null;
|
|
132
|
+
releasePointIndex: number;
|
|
133
|
+
} | {
|
|
134
|
+
points: {
|
|
135
|
+
time: number;
|
|
136
|
+
value: number;
|
|
137
|
+
curve: "linear";
|
|
138
|
+
}[];
|
|
139
|
+
envPointValueRange: [number, number];
|
|
140
|
+
initEnable: boolean;
|
|
141
|
+
sustainPointIndex: null;
|
|
142
|
+
releasePointIndex: number;
|
|
143
|
+
};
|
|
144
|
+
dispose(): void;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
declare type CustomFxType = 'feedback-delay' | 'harmonic-feedback' | 'distortion' | 'dattorro-reverb';
|
|
148
|
+
|
|
149
|
+
declare type CustomLibWaveform = (typeof CUSTOM_WAVEFORMS)[number];
|
|
150
|
+
|
|
151
|
+
declare class DattorroReverb implements ILibAudioNode {
|
|
152
|
+
#private;
|
|
153
|
+
readonly nodeId: NodeID_2;
|
|
154
|
+
readonly nodeType: NodeType;
|
|
155
|
+
static readonly PRESETS: {
|
|
156
|
+
readonly room: {
|
|
157
|
+
readonly preDelay: 1525;
|
|
158
|
+
readonly bandwidth: 0.5683;
|
|
159
|
+
readonly inputDiffusion1: 0.4666;
|
|
160
|
+
readonly inputDiffusion2: 0.5853;
|
|
161
|
+
readonly decay: 0.3226;
|
|
162
|
+
readonly decayDiffusion1: 0.6954;
|
|
163
|
+
readonly decayDiffusion2: 0.6022;
|
|
164
|
+
readonly damping: 0.6446;
|
|
165
|
+
readonly excursionRate: 0;
|
|
166
|
+
readonly excursionDepth: 0;
|
|
167
|
+
};
|
|
168
|
+
readonly church: {
|
|
169
|
+
readonly preDelay: 0;
|
|
170
|
+
readonly bandwidth: 0.928;
|
|
171
|
+
readonly inputDiffusion1: 0.7331;
|
|
172
|
+
readonly inputDiffusion2: 0.4534;
|
|
173
|
+
readonly decay: 0.7;
|
|
174
|
+
readonly decayDiffusion1: 0.7839;
|
|
175
|
+
readonly decayDiffusion2: 0.1992;
|
|
176
|
+
readonly damping: 0.5975;
|
|
177
|
+
readonly excursionRate: 0;
|
|
178
|
+
readonly excursionDepth: 0;
|
|
179
|
+
};
|
|
180
|
+
readonly freeze: {
|
|
181
|
+
readonly preDelay: 0;
|
|
182
|
+
readonly bandwidth: 0.999;
|
|
183
|
+
readonly inputDiffusion1: 0.75;
|
|
184
|
+
readonly inputDiffusion2: 0.625;
|
|
185
|
+
readonly decay: 1;
|
|
186
|
+
readonly decayDiffusion1: 0.5;
|
|
187
|
+
readonly decayDiffusion2: 0.711;
|
|
188
|
+
readonly damping: 0.005;
|
|
189
|
+
readonly excursionRate: 0.3;
|
|
190
|
+
readonly excursionDepth: 1.4;
|
|
191
|
+
};
|
|
192
|
+
readonly ether: {
|
|
193
|
+
readonly preDelay: 0;
|
|
194
|
+
readonly bandwidth: 0.999;
|
|
195
|
+
readonly inputDiffusion1: 0.23;
|
|
196
|
+
readonly inputDiffusion2: 0.667;
|
|
197
|
+
readonly decay: 0.45;
|
|
198
|
+
readonly decayDiffusion1: 0.7;
|
|
199
|
+
readonly decayDiffusion2: 0.5;
|
|
200
|
+
readonly damping: 0.3;
|
|
201
|
+
readonly excursionRate: 0.85;
|
|
202
|
+
readonly excursionDepth: 1.2;
|
|
203
|
+
};
|
|
204
|
+
readonly default: {
|
|
205
|
+
readonly preDelay: 0;
|
|
206
|
+
readonly bandwidth: 0.85;
|
|
207
|
+
readonly inputDiffusion1: 0.4;
|
|
208
|
+
readonly inputDiffusion2: 0.45;
|
|
209
|
+
readonly decay: 0.1;
|
|
210
|
+
readonly decayDiffusion1: 0.5;
|
|
211
|
+
readonly decayDiffusion2: 0.45;
|
|
212
|
+
readonly damping: 0.25;
|
|
213
|
+
readonly excursionRate: 0.3;
|
|
214
|
+
readonly excursionDepth: 0.3;
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
constructor(context?: AudioContext);
|
|
218
|
+
connect(destination: ILibAudioNode | AudioNode): void;
|
|
219
|
+
disconnect(destination?: ILibAudioNode | AudioNode): void;
|
|
220
|
+
addIncoming(source: ILibAudioNode): void;
|
|
221
|
+
removeIncoming(source: ILibAudioNode): void;
|
|
222
|
+
setParam(name: string, value: number, time?: number): void;
|
|
223
|
+
getAudioParam(name: string): AudioParam | null;
|
|
224
|
+
setAmountMacro(amount: number): void;
|
|
225
|
+
setPreset(preset?: 'room' | 'church' | 'freeze' | 'ether' | 'default', rampTime?: number): void;
|
|
226
|
+
/**
|
|
227
|
+
DIFFUSION PARAMETER (0.0 - 1.0, default: 0.7)
|
|
228
|
+
Controls reverb density and scatter. Higher = more complex tail.
|
|
229
|
+
|
|
230
|
+
0.0 - No diffusion, echoes/delays only | Special effects, rhythmic delays
|
|
231
|
+
0.3 - Light scatter, clear open sound | Vocals, acoustic instruments
|
|
232
|
+
0.5 - Moderate density, balanced | General purpose, drums
|
|
233
|
+
0.7 - Rich diffusion, full reverb tail | Orchestral, ambient music
|
|
234
|
+
0.9 - Very dense, thick complex tail | Dense mixes, sound design
|
|
235
|
+
1.0 - Maximum density, can sound harsh | Experimental/aggressive sounds
|
|
236
|
+
**/
|
|
237
|
+
setDiffusionMacro(value: number): void;
|
|
238
|
+
getDiffusionMacroValue(): number;
|
|
239
|
+
getCurrentSettings(): Record<string, number>;
|
|
240
|
+
get audioNode(): AudioWorkletNode;
|
|
241
|
+
get context(): AudioContext;
|
|
242
|
+
get input(): AudioNode;
|
|
243
|
+
get output(): AudioNode;
|
|
244
|
+
get now(): number;
|
|
245
|
+
get initialized(): boolean;
|
|
246
|
+
get currentPreset(): "default" | "room" | "church" | "freeze" | "ether";
|
|
247
|
+
get connections(): {
|
|
248
|
+
outgoing: string[];
|
|
249
|
+
incoming: string[];
|
|
250
|
+
};
|
|
251
|
+
get numberOfInputs(): number;
|
|
252
|
+
get numberOfOutputs(): number;
|
|
253
|
+
get workletInfo(): {
|
|
254
|
+
numberOfInputs: number;
|
|
255
|
+
numberOfOutputs: number;
|
|
256
|
+
channelCount: number;
|
|
257
|
+
channelCountMode: ChannelCountMode;
|
|
258
|
+
};
|
|
259
|
+
dispose(): void;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export declare const DEFAULT_KEYMAP_KEY: KeymapKey;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Default keyboard-to-MIDI note mapping for audio input.
|
|
266
|
+
* Provides a piano-like layout across the QWERTY keyboard.
|
|
267
|
+
* Used by KeyboardInputManager to translate keyboard events to MIDI notes.
|
|
268
|
+
*/
|
|
269
|
+
export declare const defaultKeymap: KeyMap;
|
|
270
|
+
|
|
271
|
+
declare interface DefaultWorkletConfig extends WorkletConfig {
|
|
272
|
+
params: WorkletParameters;
|
|
273
|
+
message: WorkletMessage;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
declare type DelayCharacter = 'clean' | 'bitCrushed' | 'filtered';
|
|
277
|
+
|
|
278
|
+
declare type DelayConfig = {
|
|
279
|
+
params: DelayParams;
|
|
280
|
+
message: DelayMsg;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
declare type DelayMsg = SetDelayCharacterMsg | TriggerDelayMsg;
|
|
284
|
+
|
|
285
|
+
declare type DelayParams = {
|
|
286
|
+
delayTime: number;
|
|
287
|
+
feedbackAmount: number;
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
declare type DelayWorklet = WorkletNode<DelayConfig>;
|
|
291
|
+
|
|
292
|
+
declare type Destination = ILibAudioNode | AudioNode | AudioParam;
|
|
293
|
+
|
|
294
|
+
declare type DistortionConfig = {
|
|
295
|
+
params: DistortionParams;
|
|
296
|
+
message: DistortionMsg;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
declare type DistortionMsg = {
|
|
300
|
+
type: 'setLimitingMode';
|
|
301
|
+
mode: 'soft-clipping' | 'hard-clipping';
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
declare type DistortionParams = {
|
|
305
|
+
clippingThreshold: number;
|
|
306
|
+
clippingAmount: number;
|
|
307
|
+
distortionDrive: number;
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
declare type DistortionWorklet = WorkletNode<DistortionConfig>;
|
|
311
|
+
|
|
312
|
+
export declare function ensureAudioCtx(config?: AudioContextConfig): Promise<AudioContext>;
|
|
313
|
+
|
|
314
|
+
export declare class EnvelopeData {
|
|
315
|
+
#private;
|
|
316
|
+
points: EnvelopePoint[];
|
|
317
|
+
constructor(points: EnvelopePoint[] | undefined, valueRange: [number, number] | undefined, durationSeconds: number, sustainIdx?: number, releaseIdx?: number);
|
|
318
|
+
addPoint(time: number, value: number, curve?: 'linear' | 'exponential'): void;
|
|
319
|
+
updatePoint(index: number, time?: number, value?: number): void;
|
|
320
|
+
updateStartPoint: (time?: number, value?: number) => void;
|
|
321
|
+
updateEndPoint: (time?: number, value?: number) => void;
|
|
322
|
+
deletePoint(index: number): void;
|
|
323
|
+
interpolateValueAtTime(timeSeconds: number): number;
|
|
324
|
+
setSustainPoint(index: number | null): void;
|
|
325
|
+
setReleasePoint(index: number): void;
|
|
326
|
+
get startPointIndex(): number;
|
|
327
|
+
get sustainPointIndex(): number | null;
|
|
328
|
+
get releasePointIndex(): number;
|
|
329
|
+
get endPointIndex(): number;
|
|
330
|
+
get pointValueRange(): [number, number];
|
|
331
|
+
setValueRange: (range: [number, number]) => [number, number];
|
|
332
|
+
get startTime(): number;
|
|
333
|
+
get endTime(): number;
|
|
334
|
+
get durationSeconds(): number;
|
|
335
|
+
setDurationSeconds(seconds: number): void;
|
|
336
|
+
get hasSharpTransitions(): boolean;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
export declare type EnvelopePoint = {
|
|
340
|
+
time: number;
|
|
341
|
+
value: number;
|
|
342
|
+
curve?: 'linear' | 'exponential';
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
export declare type EnvelopeType = 'amp-env' | 'pitch-env' | 'filter-env' | 'loop-env' | 'default-env';
|
|
346
|
+
|
|
347
|
+
declare type FbDelayConfig = {
|
|
348
|
+
params: FbDelayParams;
|
|
349
|
+
message: FbDelayMsg;
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
declare type FbDelayMsg = {
|
|
353
|
+
type: 'setAutoGain';
|
|
354
|
+
enabled: boolean;
|
|
355
|
+
amount: number;
|
|
356
|
+
} | {
|
|
357
|
+
type: 'triggerDecay';
|
|
358
|
+
baseFeedbackAmount: number;
|
|
359
|
+
} | {
|
|
360
|
+
type: 'stopDecay';
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
declare type FbDelayParams = {
|
|
364
|
+
delayTime: number;
|
|
365
|
+
feedbackAmount: number;
|
|
366
|
+
decayAmount: number;
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
declare type FbDelayWorklet = WorkletNode<FbDelayConfig>;
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Generate a keymap from a base note and scale intervals.
|
|
373
|
+
* Each QWERTY row is mapped one octave above the previous (bottom row lowest).
|
|
374
|
+
*/
|
|
375
|
+
export declare function generateKeymap(config: {
|
|
376
|
+
baseNote: number;
|
|
377
|
+
scale: number[];
|
|
378
|
+
}): KeyMap;
|
|
379
|
+
|
|
380
|
+
export declare function getAudioContext(config?: AudioContextConfig): AudioContext;
|
|
381
|
+
|
|
382
|
+
/** Device labels are only populated once mic permission has been granted */
|
|
383
|
+
export declare function getAudioInputDevices(): Promise<MediaDeviceInfo[]>;
|
|
384
|
+
|
|
385
|
+
/** Device labels are only populated once mic permission has been granted */
|
|
386
|
+
export declare function getAudioOutputDevices(): Promise<MediaDeviceInfo[]>;
|
|
387
|
+
|
|
388
|
+
export declare function getCurrentOutputDeviceId(): string;
|
|
389
|
+
|
|
390
|
+
declare class HarmonicFeedback implements ILibAudioNode {
|
|
391
|
+
#private;
|
|
392
|
+
readonly nodeId: NodeID;
|
|
393
|
+
readonly nodeType: NodeType;
|
|
394
|
+
constructor(context?: AudioContext);
|
|
395
|
+
trigger(midiNote: number, options?: {
|
|
396
|
+
glideTime?: number;
|
|
397
|
+
velocity?: number;
|
|
398
|
+
secondsFromNow?: number;
|
|
399
|
+
cents?: number;
|
|
400
|
+
triggerDecay?: boolean;
|
|
401
|
+
}): this;
|
|
402
|
+
setAmountMacro(amount: number): this;
|
|
403
|
+
get currentAmount(): number;
|
|
404
|
+
setPitch(midiNote: number, cents?: number, timestamp?: number, glideTime?: number): number;
|
|
405
|
+
setDelay(seconds: number, timestamp?: number, glideTime?: number): this;
|
|
406
|
+
setDelayMultiplier(value: number, timestamp?: number, glideTime?: number): this | undefined;
|
|
407
|
+
setFeedbackAmount(amount: number, timestamp?: number): this;
|
|
408
|
+
setAutoGain(enabled: boolean, amount: number): this;
|
|
409
|
+
setDecay(amount: number, timestamp?: number): this;
|
|
410
|
+
setLowpassCutoff(freqHz: number): void;
|
|
411
|
+
connect(destination: ILibAudioNode | AudioNode): void;
|
|
412
|
+
disconnect(destination?: ILibAudioNode | AudioNode): void;
|
|
413
|
+
addIncoming(source: ILibAudioNode): void;
|
|
414
|
+
removeIncoming(source: ILibAudioNode): void;
|
|
415
|
+
setParam(name: string, value: number, time?: number): void;
|
|
416
|
+
getAudioParam(name: string): AudioParam | null;
|
|
417
|
+
get audioNode(): FbDelayWorklet;
|
|
418
|
+
get context(): AudioContext;
|
|
419
|
+
get now(): number;
|
|
420
|
+
get input(): GainNode;
|
|
421
|
+
get output(): GainNode;
|
|
422
|
+
get connections(): {
|
|
423
|
+
outgoing: string[];
|
|
424
|
+
incoming: string[];
|
|
425
|
+
};
|
|
426
|
+
get initialized(): boolean;
|
|
427
|
+
get decayActive(): boolean;
|
|
428
|
+
get numberOfInputs(): number;
|
|
429
|
+
get numberOfOutputs(): number;
|
|
430
|
+
get workletInfo(): {
|
|
431
|
+
numberOfInputs: number;
|
|
432
|
+
numberOfOutputs: number;
|
|
433
|
+
channelCount: number;
|
|
434
|
+
channelCountMode: ChannelCountMode;
|
|
435
|
+
};
|
|
436
|
+
dispose(): void;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/** Adapter interface for web native and Audiolib's custom audio nodes */
|
|
440
|
+
declare interface ILibAudioNode<T extends AudioNode | AudioWorkletNode = AudioNode> extends LibNode {
|
|
441
|
+
connect(destination: ILibAudioNode | AudioNode): void;
|
|
442
|
+
disconnect(destination?: ILibAudioNode | AudioNode): void;
|
|
443
|
+
setParam(name: string, value: number, time?: number): void;
|
|
444
|
+
getAudioParam(name: string): AudioParam | null;
|
|
445
|
+
onMessage?(type: string, handler: MessageHandler<Message>): () => void;
|
|
446
|
+
readonly now: number;
|
|
447
|
+
readonly audioNode: T;
|
|
448
|
+
readonly context: AudioContext | BaseAudioContext;
|
|
449
|
+
readonly connections: {
|
|
450
|
+
outgoing: NodeID_2[];
|
|
451
|
+
incoming: NodeID_2[];
|
|
452
|
+
};
|
|
453
|
+
readonly input: AudioNode;
|
|
454
|
+
readonly output: AudioNode;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/** Extends ILibAudioNode with core Instrument features */
|
|
458
|
+
declare interface ILibInstrumentNode extends ILibAudioNode {
|
|
459
|
+
play(midiNote: MidiValue, velocity?: number): MidiValue | null;
|
|
460
|
+
release(note: MidiValue): this;
|
|
461
|
+
releaseAll(releaseTime?: number): this;
|
|
462
|
+
outBus?: InstrumentBus;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
declare class InstrumentBus implements ILibAudioNode {
|
|
466
|
+
#private;
|
|
467
|
+
readonly nodeId: NodeID_2;
|
|
468
|
+
readonly nodeType = "InstrumentBus";
|
|
469
|
+
constructor(context?: AudioContext);
|
|
470
|
+
createGainNode(context: AudioContext, options?: {
|
|
471
|
+
initialGain?: number;
|
|
472
|
+
}): ILibAudioNode<GainNode>;
|
|
473
|
+
init(): Promise<void>;
|
|
474
|
+
getNode<K extends BusNodeName>(name: K): BusNodeTypeMap[K];
|
|
475
|
+
getNode(name: BusSendName): ILibAudioNode<GainNode> | undefined;
|
|
476
|
+
getSendNode: (name: BusNodeName) => ILibAudioNode<GainNode> | undefined;
|
|
477
|
+
removeNode(name: string): this;
|
|
478
|
+
noteOn(midiNote: number, velocity?: number, secondsFromNow?: number, glideTime?: number): this;
|
|
479
|
+
setSendAmount(effect: BusNodeName, amount: number): this;
|
|
480
|
+
setHpfCutoff(hz: number): this;
|
|
481
|
+
setLpfCutoff(hz: number): this;
|
|
482
|
+
setCompressorParams(params: {
|
|
483
|
+
threshold?: number;
|
|
484
|
+
knee?: number;
|
|
485
|
+
ratio?: number;
|
|
486
|
+
attack?: number;
|
|
487
|
+
release?: number;
|
|
488
|
+
}): this;
|
|
489
|
+
setDryWetMix(mix: {
|
|
490
|
+
dry: number;
|
|
491
|
+
wet: number;
|
|
492
|
+
}): this;
|
|
493
|
+
setDelayTime(seconds: number): this;
|
|
494
|
+
setDelayFeedback(amount: number): this;
|
|
495
|
+
/**
|
|
496
|
+
* Set the character modes for the delay processor, in the order in which to process (e.g. ['filtered', 'bitCrushed'])
|
|
497
|
+
*/
|
|
498
|
+
setDelayCharacter(modes: Array<'clean' | 'bitCrushed' | 'filtered'>): this;
|
|
499
|
+
setReverbSize(amount: number): this;
|
|
500
|
+
setReverbDecay(decay: number): this;
|
|
501
|
+
setDistortionMacro(amount: number): void;
|
|
502
|
+
setDrive(amount: number): this;
|
|
503
|
+
setClippingMacro(amount: number): this;
|
|
504
|
+
setClippingMode(mode: 'soft-clipping' | 'hard-clipping'): void;
|
|
505
|
+
setFeedbackAmount(amount: number): this;
|
|
506
|
+
setFeedbackPitchScale(value: number): this;
|
|
507
|
+
setFeedbackDecay(amount: number): this;
|
|
508
|
+
setFeedbackLowpassCutoff(amount: number): this;
|
|
509
|
+
connect(destination: ILibAudioNode | AudioNode): void;
|
|
510
|
+
disconnect(destination?: ILibAudioNode | AudioNode): void;
|
|
511
|
+
addIncoming(sourceNodeId: NodeID_2): void;
|
|
512
|
+
removeIncoming(sourceNodeId: NodeID_2): void;
|
|
513
|
+
setParam(name: string, value: number): void;
|
|
514
|
+
getAudioParam(name: string): AudioParam | null;
|
|
515
|
+
getInput(): ILibAudioNode<GainNode>;
|
|
516
|
+
getOutput(): ILibAudioNode<GainNode>;
|
|
517
|
+
getLpf(): ILibAudioNode<BiquadFilterNode>;
|
|
518
|
+
getHpf(): ILibAudioNode<BiquadFilterNode>;
|
|
519
|
+
getDryMix(): ILibAudioNode<GainNode>;
|
|
520
|
+
getWetMix(): ILibAudioNode<GainNode>;
|
|
521
|
+
getCompressor(): ILibAudioNode<DynamicsCompressorNode>;
|
|
522
|
+
getLimiter(): ILibAudioNode<DynamicsCompressorNode>;
|
|
523
|
+
getDistortion(): ILibAudioNode<DistortionWorklet>;
|
|
524
|
+
getReverb(): DattorroReverb;
|
|
525
|
+
getFeedback(): HarmonicFeedback;
|
|
526
|
+
dispose(): void;
|
|
527
|
+
get audioNode(): GainNode;
|
|
528
|
+
get context(): AudioContext;
|
|
529
|
+
get connections(): {
|
|
530
|
+
outgoing: string[];
|
|
531
|
+
incoming: string[];
|
|
532
|
+
};
|
|
533
|
+
get input(): GainNode;
|
|
534
|
+
get output(): GainNode;
|
|
535
|
+
get now(): number;
|
|
536
|
+
set outputLevel(level: number);
|
|
537
|
+
get outputLevel(): number;
|
|
538
|
+
get initialized(): boolean;
|
|
539
|
+
get dryWetMix(): {
|
|
540
|
+
dry: number;
|
|
541
|
+
wet: number;
|
|
542
|
+
};
|
|
543
|
+
getSendAmount(effect: BusNodeName): number;
|
|
544
|
+
getRoutingMap(): Record<string, string[]>;
|
|
545
|
+
debugRouting(): void;
|
|
546
|
+
debugSends(): void;
|
|
547
|
+
listNodes(): string[];
|
|
548
|
+
startLevelMonitoring(intervalMs?: number, fftSize?: number, logOutput?: boolean): void;
|
|
549
|
+
stopLevelMonitoring(): void;
|
|
550
|
+
logLevels(): void;
|
|
551
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
declare type InstrumentType = 'sample-player' | 'synth';
|
|
555
|
+
|
|
556
|
+
export declare type KeyMap = Record<string, number>;
|
|
557
|
+
|
|
558
|
+
export declare type KeymapKey = 'piano' | 'major' | 'minor' | 'pentatonic' | 'chromatic';
|
|
559
|
+
|
|
560
|
+
export declare const keymaps: Record<KeymapKey, KeyMap>;
|
|
561
|
+
|
|
562
|
+
declare class LFO {
|
|
563
|
+
#private;
|
|
564
|
+
constructor(context: AudioContext);
|
|
565
|
+
setFrequency(hz: number, timestamp?: number): void;
|
|
566
|
+
setDepth(amount: number, timestamp?: number): void;
|
|
567
|
+
setWaveform(waveform: OscillatorType | PeriodicWave | CustomLibWaveform, customWaveOptions?: WaveformOptions): void;
|
|
568
|
+
setPeriodicWave(wave: PeriodicWave): void;
|
|
569
|
+
connect(audioParam: AudioParam): void;
|
|
570
|
+
disconnect(audioParam?: AudioParam): void;
|
|
571
|
+
setMusicalNote(midiNote: number, options?: {
|
|
572
|
+
divisor?: number;
|
|
573
|
+
glideTime?: number;
|
|
574
|
+
timestamp?: number;
|
|
575
|
+
glideFromMidiNote?: number;
|
|
576
|
+
}): this | undefined;
|
|
577
|
+
storeCurrentValues: () => void;
|
|
578
|
+
getStoredValues: () => {
|
|
579
|
+
rate: number;
|
|
580
|
+
depth?: number;
|
|
581
|
+
} | null;
|
|
582
|
+
getPitchWobbleWaveform(): PeriodicWave;
|
|
583
|
+
get now(): number;
|
|
584
|
+
dispose(): void;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
export declare class LibAudioNode<T extends AudioNode | AudioWorkletNode = AudioNode> implements ILibAudioNode<T> {
|
|
588
|
+
#private;
|
|
589
|
+
readonly nodeId: NodeID_2;
|
|
590
|
+
readonly nodeType: NodeType;
|
|
591
|
+
constructor(node: T, context: AudioContext, nodeType: NodeType, options?: LibAudioNodeOptions);
|
|
592
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
593
|
+
sendUpstreamMessage(type: string, data: any): this;
|
|
594
|
+
connect(destination: ILibAudioNode | AudioNode): void;
|
|
595
|
+
disconnect(destination?: ILibAudioNode | AudioNode): void;
|
|
596
|
+
addIncoming(sourceNodeId: NodeID_2): void;
|
|
597
|
+
removeIncoming(sourceNodeId: NodeID_2): void;
|
|
598
|
+
get connections(): {
|
|
599
|
+
outgoing: string[];
|
|
600
|
+
incoming: string[];
|
|
601
|
+
};
|
|
602
|
+
setParam(name: string, value: number, timestamp?: number): void;
|
|
603
|
+
getAudioParam(name: string): AudioParam | null;
|
|
604
|
+
get audioNode(): T;
|
|
605
|
+
get input(): AudioNode | AudioWorkletNode;
|
|
606
|
+
get output(): AudioNode | AudioWorkletNode;
|
|
607
|
+
get context(): BaseAudioContext;
|
|
608
|
+
get now(): number;
|
|
609
|
+
get initialized(): boolean;
|
|
610
|
+
dispose(): void;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
declare interface LibAudioNodeOptions {
|
|
614
|
+
createIOGains?: boolean;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
export declare interface LibNode {
|
|
618
|
+
readonly nodeId: NodeID_2;
|
|
619
|
+
readonly nodeType: NodeType;
|
|
620
|
+
readonly initialized: boolean;
|
|
621
|
+
dispose(): void;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
declare class MacroParam {
|
|
625
|
+
#private;
|
|
626
|
+
readonly nodeType: string;
|
|
627
|
+
readonly nodeId: NodeID;
|
|
628
|
+
constructor(context: BaseAudioContext, initialValue: number);
|
|
629
|
+
init(): Promise<void>;
|
|
630
|
+
addTarget(targetParam: AudioParam, paramType: string, scaleFactor?: number): this;
|
|
631
|
+
ramp(targetValue: number, duration: number, constant: number, options?: {
|
|
632
|
+
method?: 'exponential' | 'linear';
|
|
633
|
+
debounceMs?: number;
|
|
634
|
+
onComplete?: () => void;
|
|
635
|
+
onCompleteDelayMs?: number;
|
|
636
|
+
}): this;
|
|
637
|
+
debugProcessVal(value: number, constant: number, targetPeriod: number): void;
|
|
638
|
+
setAllowedParamValues(values: number[], normalize: NormalizeOptions | false): number[];
|
|
639
|
+
setAllowedPeriods(periods: number[], normalize: NormalizeOptions | false, snapToZeroCrossings?: number[] | false): number[];
|
|
640
|
+
setScale(options: {
|
|
641
|
+
rootNote: keyof typeof ROOT_NOTES;
|
|
642
|
+
scale: keyof typeof SCALE_PATTERNS | number[];
|
|
643
|
+
tuningOffset: number;
|
|
644
|
+
highestOctave: number;
|
|
645
|
+
lowestOctave: number;
|
|
646
|
+
snapToZeroCrossings: number[] | false;
|
|
647
|
+
normalize: NormalizeOptions | false;
|
|
648
|
+
}): number[];
|
|
649
|
+
setValue(value: number, timestamp?: number): this;
|
|
650
|
+
getValue: () => number;
|
|
651
|
+
get targetValue(): number;
|
|
652
|
+
get targets(): {
|
|
653
|
+
param: AudioParam;
|
|
654
|
+
scaler?: GainNode;
|
|
655
|
+
}[];
|
|
656
|
+
get snapper(): ValueSnapper;
|
|
657
|
+
get rootNote(): "C" | "C#" | "Db" | "D" | "D#" | "Eb" | "E" | "F" | "F#" | "Gb" | "G" | "G#" | "Ab" | "A" | "A#" | "Bb" | "B";
|
|
658
|
+
setRootNote(rootNote: keyof typeof ROOT_NOTES): void;
|
|
659
|
+
get scalePattern(): number[];
|
|
660
|
+
get isReady(): boolean;
|
|
661
|
+
get now(): number;
|
|
662
|
+
get audioParam(): AudioParam;
|
|
663
|
+
get type(): string;
|
|
664
|
+
get longestPeriod(): number;
|
|
665
|
+
onChange(callback: MessageHandler<Message>): () => void;
|
|
666
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
667
|
+
protected sendMessage(type: string, data: any): void;
|
|
668
|
+
dispose(): void;
|
|
669
|
+
connect(target: AudioParam, nodeType: NodeType, scaleFactor?: number): this;
|
|
670
|
+
disconnect(target?: AudioParam | TODO): void;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
declare interface Message {
|
|
674
|
+
readonly type: string;
|
|
675
|
+
readonly senderId: NodeID_2;
|
|
676
|
+
[key: string]: any;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
declare type MessageHandler<T> = (data: T) => void;
|
|
680
|
+
|
|
681
|
+
declare type NativeAudioNode = 'AudioWorkletNode' | 'GainNode' | 'BiquadFilterNode' | 'AudioBufferSourceNode' | 'DynamicsCompressorNode';
|
|
682
|
+
|
|
683
|
+
declare type NodeID_2 = string;
|
|
684
|
+
|
|
685
|
+
declare type NodeType = NativeAudioNode | BaseNodeType | InstrumentType | VoiceType | ContainerType | string | CustomFxType;
|
|
686
|
+
|
|
687
|
+
declare type NormalizeOptions = {
|
|
688
|
+
from: [number, number];
|
|
689
|
+
to: [number, number];
|
|
690
|
+
};
|
|
691
|
+
|
|
692
|
+
/**
|
|
693
|
+
* Represents a musical note with all its properties
|
|
694
|
+
*/
|
|
695
|
+
declare type Note = {
|
|
696
|
+
name: string;
|
|
697
|
+
octave: number;
|
|
698
|
+
midiNote: number;
|
|
699
|
+
frequency: number;
|
|
700
|
+
period: number;
|
|
701
|
+
};
|
|
702
|
+
|
|
703
|
+
export declare class Oscilloscope {
|
|
704
|
+
private node;
|
|
705
|
+
private canvas;
|
|
706
|
+
private canvasCtx;
|
|
707
|
+
private get width();
|
|
708
|
+
private get height();
|
|
709
|
+
constructor(ctx: AudioContext, input: AudioNode, canvas: HTMLCanvasElement);
|
|
710
|
+
run(): void;
|
|
711
|
+
render(data: Uint8Array): void;
|
|
712
|
+
getWaveform(data: Uint8Array): Uint8Array;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
declare type PreProcessOptions = {
|
|
716
|
+
skipPreProcessing?: boolean;
|
|
717
|
+
normalize?: {
|
|
718
|
+
enabled: boolean;
|
|
719
|
+
maxAmplitudePeak?: number;
|
|
720
|
+
};
|
|
721
|
+
compress?: {
|
|
722
|
+
enabled: boolean;
|
|
723
|
+
threshold?: number;
|
|
724
|
+
ratio?: number;
|
|
725
|
+
makeupGain?: number;
|
|
726
|
+
};
|
|
727
|
+
trimSilence?: {
|
|
728
|
+
enabled: boolean;
|
|
729
|
+
threshold?: number;
|
|
730
|
+
};
|
|
731
|
+
fadeInOutMs?: number;
|
|
732
|
+
tune?: {
|
|
733
|
+
detectPitch?: boolean;
|
|
734
|
+
autotune: boolean;
|
|
735
|
+
targetMidiNote?: number;
|
|
736
|
+
};
|
|
737
|
+
hpf?: {
|
|
738
|
+
auto?: boolean;
|
|
739
|
+
} | {
|
|
740
|
+
cutoff?: number;
|
|
741
|
+
};
|
|
742
|
+
getZeroCrossings?: boolean;
|
|
743
|
+
};
|
|
744
|
+
|
|
745
|
+
export declare class Recorder implements LibNode {
|
|
746
|
+
#private;
|
|
747
|
+
readonly nodeId: NodeID_2;
|
|
748
|
+
readonly nodeType = "recorder";
|
|
749
|
+
constructor(context: AudioContext);
|
|
750
|
+
init(): Promise<Recorder>;
|
|
751
|
+
start(options?: RecorderStartOptions): Promise<this>;
|
|
752
|
+
forceStart(): boolean;
|
|
753
|
+
/**
|
|
754
|
+
* Aborts an armed or in-progress recording without producing a buffer.
|
|
755
|
+
* Releases the input stream, so a new `start()` is required to record again.
|
|
756
|
+
*
|
|
757
|
+
* @returns true if a recording was cancelled, false if there was nothing to cancel.
|
|
758
|
+
*/
|
|
759
|
+
cancel(): boolean;
|
|
760
|
+
stop(): Promise<AudioBuffer>;
|
|
761
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
762
|
+
protected sendMessage(type: string, data: any): void;
|
|
763
|
+
connect(destination: LibNode & SampleLoader): this;
|
|
764
|
+
disconnect(): void;
|
|
765
|
+
dispose(): void;
|
|
766
|
+
get isArmed(): boolean;
|
|
767
|
+
get isRecording(): boolean;
|
|
768
|
+
get state(): AudioRecorderState;
|
|
769
|
+
get initialized(): boolean;
|
|
770
|
+
get now(): number;
|
|
771
|
+
get destination(): (LibNode & SampleLoader) | null;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
export declare type RecorderInput = {
|
|
775
|
+
type: 'microphone';
|
|
776
|
+
deviceId?: string;
|
|
777
|
+
} | {
|
|
778
|
+
type: 'display';
|
|
779
|
+
} | {
|
|
780
|
+
type: 'audio-node';
|
|
781
|
+
node: AudioNode;
|
|
782
|
+
};
|
|
783
|
+
|
|
784
|
+
declare type RecorderOptions = {
|
|
785
|
+
mediaRecorderOptions: MediaRecorderOptions;
|
|
786
|
+
useThreshold: boolean;
|
|
787
|
+
startThreshold: number;
|
|
788
|
+
autoStop: boolean;
|
|
789
|
+
stopThreshold: number;
|
|
790
|
+
silenceTimeoutMs: number;
|
|
791
|
+
preprocess: boolean;
|
|
792
|
+
preprocessOptions: object;
|
|
793
|
+
};
|
|
794
|
+
|
|
795
|
+
export declare type RecorderStartOptions = Partial<RecorderOptions> & {
|
|
796
|
+
input?: RecorderInput;
|
|
797
|
+
};
|
|
798
|
+
|
|
799
|
+
declare const ROOT_NOTES: {
|
|
800
|
+
readonly C: 0;
|
|
801
|
+
readonly 'C#': 1;
|
|
802
|
+
readonly Db: 1;
|
|
803
|
+
readonly D: 2;
|
|
804
|
+
readonly 'D#': 3;
|
|
805
|
+
readonly Eb: 3;
|
|
806
|
+
readonly E: 4;
|
|
807
|
+
readonly F: 5;
|
|
808
|
+
readonly 'F#': 6;
|
|
809
|
+
readonly Gb: 6;
|
|
810
|
+
readonly G: 7;
|
|
811
|
+
readonly 'G#': 8;
|
|
812
|
+
readonly Ab: 8;
|
|
813
|
+
readonly A: 9;
|
|
814
|
+
readonly 'A#': 10;
|
|
815
|
+
readonly Bb: 10;
|
|
816
|
+
readonly B: 11;
|
|
817
|
+
};
|
|
818
|
+
|
|
819
|
+
export declare interface SampleLoader {
|
|
820
|
+
loadSample(...args: TODO[]): Promise<TODO>;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
export declare class SamplePlayer implements ILibInstrumentNode {
|
|
824
|
+
#private;
|
|
825
|
+
readonly nodeId: NodeID_2;
|
|
826
|
+
readonly nodeType: "sample-player";
|
|
827
|
+
readonly context: AudioContext;
|
|
828
|
+
randomizeVelocity: boolean;
|
|
829
|
+
voicePool: SampleVoicePool;
|
|
830
|
+
outBus: InstrumentBus;
|
|
831
|
+
constructor(context: AudioContext, polyphony?: number, audioBuffer?: AudioBuffer);
|
|
832
|
+
init(): Promise<void>;
|
|
833
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
834
|
+
sendUpstreamMessage(type: string, data: any): this;
|
|
835
|
+
connect(destination: ILibInstrumentNode | AudioNode): void;
|
|
836
|
+
disconnect(destination?: ILibInstrumentNode | AudioNode): void;
|
|
837
|
+
addIncoming(source: ILibInstrumentNode): void;
|
|
838
|
+
removeIncoming(source: ILibInstrumentNode): void;
|
|
839
|
+
get connections(): {
|
|
840
|
+
outgoing: string[];
|
|
841
|
+
incoming: string[];
|
|
842
|
+
};
|
|
843
|
+
get audioNode(): GainNode;
|
|
844
|
+
get input(): GainNode;
|
|
845
|
+
get output(): GainNode;
|
|
846
|
+
get now(): number;
|
|
847
|
+
get initialized(): boolean;
|
|
848
|
+
getMacrosAudioParam(paramName: 'loopStart' | 'loopEnd'): AudioParam;
|
|
849
|
+
getMacro(paramName: 'loopStart' | 'loopEnd'): MacroParam;
|
|
850
|
+
setModulationAmount: (modType: "AM" | "FM", amount: number) => void;
|
|
851
|
+
setModulationWaveform(modType?: 'AM' | 'FM', waveform?: CustomLibWaveform | OscillatorType | PeriodicWave, customWaveOptions?: WaveformOptions): void;
|
|
852
|
+
syncLFOsToNoteFreq(lfoId: 'gain-lfo' | 'pitch-lfo', enabled: boolean): void;
|
|
853
|
+
freezeActiveVoices(freeze: boolean): this;
|
|
854
|
+
loadSample(buffer: AudioBuffer | ArrayBuffer, modSampleRate?: number, preprocessOptions?: Partial<PreProcessOptions>): Promise<AudioBuffer | null>;
|
|
855
|
+
cropSample(startSeconds?: number, endSeconds?: number, fadeMs?: number): Promise<AudioBuffer | null>;
|
|
856
|
+
detectPitch(buffer: AudioBuffer): Promise<{
|
|
857
|
+
frequency: number;
|
|
858
|
+
confidence: number;
|
|
859
|
+
midiFloat: number;
|
|
860
|
+
targetNoteInfo: Note;
|
|
861
|
+
}>;
|
|
862
|
+
detectedPitchToTransposition(detectedMidiFloat: number, targetMidiNote: number): number;
|
|
863
|
+
play(midiNote: MidiValue, velocity?: MidiValue, glideTime?: number): MidiValue | null;
|
|
864
|
+
release(midiNote: MidiValue): this;
|
|
865
|
+
releaseAll(releaseTime?: number): this;
|
|
866
|
+
panic: (releaseTime?: number) => this;
|
|
867
|
+
get transposedBySemitones(): number;
|
|
868
|
+
set transposeSemitones(semitones: number);
|
|
869
|
+
setScale(options: {
|
|
870
|
+
rootNote: keyof typeof ROOT_NOTES;
|
|
871
|
+
scale: number[];
|
|
872
|
+
tuningOffset: number;
|
|
873
|
+
highestOctave: number;
|
|
874
|
+
lowestOctave: number;
|
|
875
|
+
normalize: NormalizeOptions | false;
|
|
876
|
+
}): this;
|
|
877
|
+
setRootNote(note: keyof typeof ROOT_NOTES): this;
|
|
878
|
+
/** PARAM SETTERS */
|
|
879
|
+
setVolume(volume: number): this;
|
|
880
|
+
setSampleStartPoint(seconds: number): this;
|
|
881
|
+
setSampleEndPoint(seconds: number): this;
|
|
882
|
+
setLoopRampDuration(seconds: number): this;
|
|
883
|
+
setGlideTime(seconds: number): this;
|
|
884
|
+
setLoopEnabled(enabled: boolean): this;
|
|
885
|
+
setLoopLocked(locked: boolean): this;
|
|
886
|
+
setHoldEnabled(enabled: boolean): this;
|
|
887
|
+
setHoldLocked(locked: boolean): this;
|
|
888
|
+
setSustainPedal(pressed: boolean): this;
|
|
889
|
+
sustainPedalOn: () => this;
|
|
890
|
+
sustainPedalOff: () => this;
|
|
891
|
+
setPlaybackDirection(direction: 'forward' | 'reverse'): this;
|
|
892
|
+
setLoopDurationDriftAmount(amount: number): this;
|
|
893
|
+
setPanDriftEnabled: (enabled: boolean) => this;
|
|
894
|
+
setTimestretchEnabled: (enabled: boolean) => this;
|
|
895
|
+
isNormalized: (value: number, range?: number[]) => boolean;
|
|
896
|
+
readonly MIN_LOOP_DURATION_SECONDS: number;
|
|
897
|
+
setLoopStart: (seconds: number, rampTime?: number) => this;
|
|
898
|
+
setLoopEnd: (seconds: number, rampTime?: number) => this;
|
|
899
|
+
setLoopDuration: (seconds: number, rampTime?: number) => this;
|
|
900
|
+
debugcounter: number;
|
|
901
|
+
setTempo(bpm: number): this | undefined;
|
|
902
|
+
syncLoopToTempo(enabled: boolean): this;
|
|
903
|
+
setKeytrackLoopAmount(amount: number): this;
|
|
904
|
+
getKeytrackLoopAmount: () => number;
|
|
905
|
+
get tempo(): number;
|
|
906
|
+
setLoopPoint(loopPoint: 'start' | 'end', loopStartSeconds: number, loopEndSeconds: number, rampDuration?: number): this;
|
|
907
|
+
scrollLoopPoints(loopStart: number, loopEnd: number): this;
|
|
908
|
+
setParam(name: string, value: number): this;
|
|
909
|
+
applyParams(params: SamplerParamPatch): this;
|
|
910
|
+
/** PARAM GETTERS */
|
|
911
|
+
getAudioParam(name: string): AudioParam | null;
|
|
912
|
+
getStartPoint(): number;
|
|
913
|
+
getEndPoint(): number;
|
|
914
|
+
getLoopRampDuration(): number;
|
|
915
|
+
getGlideTime(): number;
|
|
916
|
+
getHpfCutoff: () => number;
|
|
917
|
+
getLpfCutoff: () => number;
|
|
918
|
+
getParameterValue(name: string): number | undefined;
|
|
919
|
+
enablePitch: () => void;
|
|
920
|
+
disablePitch: () => void;
|
|
921
|
+
enableEnvelope: (envType: EnvelopeType) => void;
|
|
922
|
+
disableEnvelope: (envType: EnvelopeType) => void;
|
|
923
|
+
getEnvelope(envType: EnvelopeType): CustomEnvelope;
|
|
924
|
+
setEnvelopeLoop: (envType: EnvelopeType, loop: boolean, mode?: "normal" | "ping-pong" | "reverse") => void;
|
|
925
|
+
setEnvelopeSync: (envType: EnvelopeType, sync: boolean) => void;
|
|
926
|
+
setEnvelopeTimeScale: (envType: EnvelopeType, timeScale: number) => void;
|
|
927
|
+
setEnvelopeSustainPoint(envType: EnvelopeType, index: number | null): void;
|
|
928
|
+
setEnvelopeReleasePoint(envType: EnvelopeType, index: number): void;
|
|
929
|
+
updateEnvelopePoint(envType: EnvelopeType, index: number, time: number, value: number): void;
|
|
930
|
+
addEnvelopePoint(envType: EnvelopeType, time: number, value: number): void;
|
|
931
|
+
deleteEnvelopePoint(envType: EnvelopeType, index: number): void;
|
|
932
|
+
startLevelMonitoring(intervalMs?: number): void;
|
|
933
|
+
setDryWetMix: (mix: {
|
|
934
|
+
dry: number;
|
|
935
|
+
wet: number;
|
|
936
|
+
}) => void;
|
|
937
|
+
sendToFx: (effect: BusNodeName, amount: number) => void;
|
|
938
|
+
setLpfCutoff: (hz: number, preOrPostFx?: "pre" | "post") => void;
|
|
939
|
+
setHpfCutoff: (hz: number, preOrPostFx?: "pre" | "post") => void;
|
|
940
|
+
setReverbAmount: (amount: number) => void;
|
|
941
|
+
setFeedbackDecay(value: number): void;
|
|
942
|
+
setFeedbackLowpassCutoff(freqHz: number): void;
|
|
943
|
+
setFeedbackAmount: (amount: number) => void;
|
|
944
|
+
setFeedbackMode(mode: 'monophonic' | 'polyphonic' | 'double-trouble'): void;
|
|
945
|
+
setFeedbackPitchScale(value: number): void;
|
|
946
|
+
get mainOut(): GainNode;
|
|
947
|
+
get outputBus(): InstrumentBus;
|
|
948
|
+
get sampleDuration(): number;
|
|
949
|
+
get volume(): number;
|
|
950
|
+
set volume(value: number);
|
|
951
|
+
get loopEnabled(): boolean;
|
|
952
|
+
get holdEnabled(): boolean;
|
|
953
|
+
get gainLFO(): LFO | null;
|
|
954
|
+
get pitchLFO(): LFO | null;
|
|
955
|
+
get loopStart(): number;
|
|
956
|
+
get loopEnd(): number;
|
|
957
|
+
get isLoaded(): boolean;
|
|
958
|
+
get audiobuffer(): AudioBuffer | null;
|
|
959
|
+
dispose(): void;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
export declare interface SamplerParamDescriptor {
|
|
963
|
+
label: string;
|
|
964
|
+
min: number;
|
|
965
|
+
max: number;
|
|
966
|
+
defaultValue: number;
|
|
967
|
+
/** UI taper hint: 1 = linear, >1 = more resolution at the low end */
|
|
968
|
+
curve?: number;
|
|
969
|
+
/** Snap increment for UI controls */
|
|
970
|
+
step?: number;
|
|
971
|
+
/** Discrete values only (e.g. pitch scale ratios) */
|
|
972
|
+
allowedValues?: readonly number[];
|
|
973
|
+
format?: (value: number, sampleDurationSeconds: number) => string;
|
|
974
|
+
apply: (player: SamplePlayer, value: number) => void;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
export declare type SamplerParamKey = keyof typeof samplerParams;
|
|
978
|
+
|
|
979
|
+
export declare type SamplerParamPatch = Partial<SamplerParamValues>;
|
|
980
|
+
|
|
981
|
+
export declare const samplerParams: Record<"distortion" | "delayTime" | "feedback" | "feedbackDecay" | "drive" | "loopEnd" | "loopStart" | "volume" | "dryWet" | "glide" | "tempo" | "lowpassFilter" | "highpassFilter" | "feedbackPitch" | "feedbackLpf" | "clipping" | "amMod" | "reverbSend" | "reverbSize" | "delaySend" | "delayFeedback" | "gainLFORate" | "gainLFODepth" | "pitchLFORate" | "pitchLFODepth" | "trimStart" | "trimEnd" | "loopDuration" | "loopRampDuration" | "loopDurationDrift" | "keytrackLoop", SamplerParamDescriptor>;
|
|
982
|
+
|
|
983
|
+
export declare type SamplerParamValues = Record<SamplerParamKey, number>;
|
|
984
|
+
|
|
985
|
+
export declare interface SamplerToggleDescriptor {
|
|
986
|
+
label: string;
|
|
987
|
+
defaultValue: boolean;
|
|
988
|
+
format: (enabled: boolean) => string;
|
|
989
|
+
apply: (player: SamplePlayer, enabled: boolean) => void;
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
export declare type SamplerToggleKey = keyof typeof samplerToggles;
|
|
993
|
+
|
|
994
|
+
export declare const samplerToggles: {
|
|
995
|
+
readonly timestretch: {
|
|
996
|
+
readonly label: "Timestretch";
|
|
997
|
+
readonly defaultValue: false;
|
|
998
|
+
readonly format: (enabled: boolean) => "Warp" | "RePitch";
|
|
999
|
+
readonly apply: (player: SamplePlayer, enabled: boolean) => SamplePlayer;
|
|
1000
|
+
};
|
|
1001
|
+
readonly panDrift: {
|
|
1002
|
+
readonly label: "Pan drift";
|
|
1003
|
+
readonly defaultValue: true;
|
|
1004
|
+
readonly format: (enabled: boolean) => "◐" | "○";
|
|
1005
|
+
readonly apply: (player: SamplePlayer, enabled: boolean) => SamplePlayer;
|
|
1006
|
+
};
|
|
1007
|
+
readonly feedbackMode: {
|
|
1008
|
+
readonly label: "Feedback mode";
|
|
1009
|
+
readonly defaultValue: true;
|
|
1010
|
+
readonly format: (enabled: boolean) => "Poly" | "Mono";
|
|
1011
|
+
readonly apply: (player: SamplePlayer, enabled: boolean) => void;
|
|
1012
|
+
};
|
|
1013
|
+
readonly gainLFOSync: {
|
|
1014
|
+
readonly label: "Amp LFO sync";
|
|
1015
|
+
readonly defaultValue: false;
|
|
1016
|
+
readonly format: (enabled: boolean) => "Sync" | "Free";
|
|
1017
|
+
readonly apply: (player: SamplePlayer, enabled: boolean) => void;
|
|
1018
|
+
};
|
|
1019
|
+
readonly pitchLFOSync: {
|
|
1020
|
+
readonly label: "Pitch LFO sync";
|
|
1021
|
+
readonly defaultValue: false;
|
|
1022
|
+
readonly format: (enabled: boolean) => "Sync" | "Free";
|
|
1023
|
+
readonly apply: (player: SamplePlayer, enabled: boolean) => void;
|
|
1024
|
+
};
|
|
1025
|
+
};
|
|
1026
|
+
|
|
1027
|
+
declare class SampleVoice {
|
|
1028
|
+
#private;
|
|
1029
|
+
private context;
|
|
1030
|
+
readonly nodeId: NodeID_2;
|
|
1031
|
+
readonly nodeType: NodeType;
|
|
1032
|
+
constructor(context?: AudioContext, options?: {
|
|
1033
|
+
processorOptions?: any;
|
|
1034
|
+
enableFilters?: boolean;
|
|
1035
|
+
});
|
|
1036
|
+
init(): Promise<void>;
|
|
1037
|
+
loadBuffer(buffer: AudioBuffer, zeroCrossings?: number[]): Promise<boolean>;
|
|
1038
|
+
freeze(freeze: boolean): this;
|
|
1039
|
+
setGlideTime(seconds: number): void;
|
|
1040
|
+
trigger(options: {
|
|
1041
|
+
midiNote: MidiValue;
|
|
1042
|
+
velocity: MidiValue;
|
|
1043
|
+
secondsFromNow?: number;
|
|
1044
|
+
glide?: {
|
|
1045
|
+
prevMidiNote: number;
|
|
1046
|
+
glideTime?: number;
|
|
1047
|
+
};
|
|
1048
|
+
}): MidiValue | null;
|
|
1049
|
+
applyEnvelopes(timestamp: number, playbackRate: number, velocity?: number, midiNote?: number): void;
|
|
1050
|
+
release({ releaseTime, secondsFromNow }: {
|
|
1051
|
+
releaseTime?: number | undefined;
|
|
1052
|
+
secondsFromNow?: number | undefined;
|
|
1053
|
+
}): this;
|
|
1054
|
+
stop(timestamp?: number): this;
|
|
1055
|
+
setModulationAmount(modType: 'AM' | 'FM', amount: number): this;
|
|
1056
|
+
setModulationWaveform(modType?: 'AM' | 'FM', waveform?: CustomLibWaveform | OscillatorType | PeriodicWave, customWaveOptions?: WaveformOptions): this;
|
|
1057
|
+
enableEnvelope: (envType: EnvelopeType) => void;
|
|
1058
|
+
disableEnvelope: (envType: EnvelopeType) => void;
|
|
1059
|
+
setEnvelopeTimeScale: (envType: EnvelopeType, timeScale: number) => void;
|
|
1060
|
+
setEnvelopeSustainPoint: (envType: EnvelopeType, index: number | null) => void;
|
|
1061
|
+
setEnvelopeReleasePoint: (envType: EnvelopeType, index: number) => void;
|
|
1062
|
+
addEnvelopePoint(envType: EnvelopeType, time: number, value: number): void;
|
|
1063
|
+
updateEnvelopePoint(envType: EnvelopeType, index: number, time?: number, value?: number): void;
|
|
1064
|
+
deleteEnvelopePoint(envType: EnvelopeType, index: number): void;
|
|
1065
|
+
getEnvelope: (envType: EnvelopeType) => CustomEnvelope | undefined;
|
|
1066
|
+
get envelopes(): Map<EnvelopeType, CustomEnvelope>;
|
|
1067
|
+
setStartPoint: (time: number, timestamp?: number) => void;
|
|
1068
|
+
setEndPoint: (time: number, timestamp?: number) => void;
|
|
1069
|
+
setParam(name: string, targetValue: number, timestamp?: number, options?: {
|
|
1070
|
+
glideTime?: number;
|
|
1071
|
+
cancelPrevious?: boolean;
|
|
1072
|
+
}): this;
|
|
1073
|
+
protected setParams(paramsAndValues: Array<{
|
|
1074
|
+
name: string;
|
|
1075
|
+
value: number;
|
|
1076
|
+
}>, atTime: number, options?: {
|
|
1077
|
+
glideTime?: number;
|
|
1078
|
+
cancelPrevious?: boolean;
|
|
1079
|
+
}): this;
|
|
1080
|
+
setLoopPoints(start: number, end: number, timestamp?: number, rampTime?: number): this;
|
|
1081
|
+
syncLoopToTempo(enabled: boolean): this;
|
|
1082
|
+
setKeytrackLoopAmount(amount: number): this;
|
|
1083
|
+
setTempo(bpm: number): this;
|
|
1084
|
+
setAllowedPeriods(periods: number[]): this;
|
|
1085
|
+
disablePitch: () => void;
|
|
1086
|
+
enablePitch: () => void;
|
|
1087
|
+
/** CONNECTIONS */
|
|
1088
|
+
connect(destination: Destination, output?: number, input?: number): Destination;
|
|
1089
|
+
disconnect(output?: string, destination?: Destination): this;
|
|
1090
|
+
/** MESSAGES */
|
|
1091
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
1092
|
+
sendToProcessor(data: any): this;
|
|
1093
|
+
sendUpstreamMessage(type: string, data: any): this;
|
|
1094
|
+
getPlaybackDuration(): number;
|
|
1095
|
+
get isActive(): boolean;
|
|
1096
|
+
get feedback(): HarmonicFeedback | null;
|
|
1097
|
+
get currMidiNote(): number | null;
|
|
1098
|
+
get hpf(): BiquadFilterNode | null;
|
|
1099
|
+
get lpf(): BiquadFilterNode | null;
|
|
1100
|
+
get in(): null;
|
|
1101
|
+
get out(): GainNode;
|
|
1102
|
+
get state(): VoiceState;
|
|
1103
|
+
get initialized(): boolean;
|
|
1104
|
+
get now(): number;
|
|
1105
|
+
get activeNoteId(): number | string | null;
|
|
1106
|
+
get triggerTimestamp(): number;
|
|
1107
|
+
get sampleDurationSeconds(): number;
|
|
1108
|
+
get startPoint(): number;
|
|
1109
|
+
get endPoint(): number;
|
|
1110
|
+
get releaseTime(): number;
|
|
1111
|
+
setMasterGain(gain: number): void;
|
|
1112
|
+
enablePositionTracking(enabled: boolean): this;
|
|
1113
|
+
setLoopEnabled(enabled: boolean): this;
|
|
1114
|
+
setEnvelopeLoop: (envType: EnvelopeType, loop: boolean, mode?: "normal" | "ping-pong" | "reverse") => this;
|
|
1115
|
+
syncEnvelopeToPlaybackRate: (envType: EnvelopeType, sync: boolean) => this;
|
|
1116
|
+
setPlaybackRate(rate: number, atTime?: number, options?: {
|
|
1117
|
+
glideTime?: number;
|
|
1118
|
+
cancelPrevious?: boolean;
|
|
1119
|
+
}): this;
|
|
1120
|
+
setHpfCutoff(hz: number, atTime?: number, options?: {
|
|
1121
|
+
glideTime?: number;
|
|
1122
|
+
cancelPrevious?: boolean;
|
|
1123
|
+
}): this;
|
|
1124
|
+
setLpfCutoff(hz: number, atTime?: number, options?: {
|
|
1125
|
+
glideTime?: number;
|
|
1126
|
+
cancelPrevious?: boolean;
|
|
1127
|
+
}): this;
|
|
1128
|
+
setPlaybackDirection(direction: 'forward' | 'reverse'): this;
|
|
1129
|
+
setLoopDurationDriftAmount(amount: number): this;
|
|
1130
|
+
setPanDriftEnabled: (enabled: boolean) => this;
|
|
1131
|
+
setTimestretchEnabled: (enabled: boolean) => this;
|
|
1132
|
+
debugDuration(): void;
|
|
1133
|
+
dispose(): void;
|
|
1134
|
+
getParam(name: string): AudioParam | null;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
declare class SampleVoicePool implements LibNode {
|
|
1138
|
+
#private;
|
|
1139
|
+
readonly nodeId: NodeID_2;
|
|
1140
|
+
readonly nodeType = "pool";
|
|
1141
|
+
constructor(context: AudioContext, polyphony: number);
|
|
1142
|
+
init(): Promise<void>;
|
|
1143
|
+
connect(destination: AudioNode): void;
|
|
1144
|
+
disconnect(): void;
|
|
1145
|
+
onMessage(type: string, handler: MessageHandler<Message>): () => void;
|
|
1146
|
+
sendUpstreamMessage(type: string, data: any): this;
|
|
1147
|
+
setBuffer(buffer: AudioBuffer, zeroCrossings?: number[]): this;
|
|
1148
|
+
allocate(available?: Set<SampleVoice>, releasing?: Set<SampleVoice>): SampleVoice | undefined;
|
|
1149
|
+
prevMidiNote: number;
|
|
1150
|
+
noteOn(midiNote: MidiValue, velocity?: MidiValue, secondsFromNow?: number, glideTime?: number): MidiValue | null;
|
|
1151
|
+
noteOff(midiNote: MidiValue, secondsFromNow?: number, releaseTime?: number): this | undefined;
|
|
1152
|
+
allNotesOff(releaseTime?: number): this;
|
|
1153
|
+
applyToAllVoices(fn: (voice: SampleVoice) => void): void;
|
|
1154
|
+
applyToActiveVoices(fn: (voice: SampleVoice) => void): void;
|
|
1155
|
+
applyToInactiveVoices(fn: (voice: SampleVoice) => void): void;
|
|
1156
|
+
applyToActiveNote(midiNote: MidiValue, fn: (voice: SampleVoice) => void): void;
|
|
1157
|
+
debug(): void;
|
|
1158
|
+
dispose(): void;
|
|
1159
|
+
get initialized(): boolean;
|
|
1160
|
+
get availableVoices(): Set<SampleVoice>;
|
|
1161
|
+
get playingVoicesCount(): number;
|
|
1162
|
+
get releasingVoicesCount(): number;
|
|
1163
|
+
get availableVoicesCount(): number;
|
|
1164
|
+
get allVoices(): SampleVoice[];
|
|
1165
|
+
get allVoicesCount(): number;
|
|
1166
|
+
get assignedVoicesMidiMap(): Map<number, SampleVoice>;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
declare const SCALE_PATTERNS: {
|
|
1170
|
+
chromatic: number[];
|
|
1171
|
+
major: number[];
|
|
1172
|
+
minor: number[];
|
|
1173
|
+
harmonic_minor: number[];
|
|
1174
|
+
melodic_minor: number[];
|
|
1175
|
+
lydian: number[];
|
|
1176
|
+
dorian: number[];
|
|
1177
|
+
phrygian: number[];
|
|
1178
|
+
mixolydian: number[];
|
|
1179
|
+
locrian: number[];
|
|
1180
|
+
diminished: number[];
|
|
1181
|
+
augmented: number[];
|
|
1182
|
+
major_pentatonic: number[];
|
|
1183
|
+
minor_pentatonic: number[];
|
|
1184
|
+
blues: number[];
|
|
1185
|
+
whole_tone: number[];
|
|
1186
|
+
};
|
|
1187
|
+
|
|
1188
|
+
/** Routes the global AudioContext (all audiolib output) to the given output device.
|
|
1189
|
+
* Pass '' or 'default' to restore the system default output. */
|
|
1190
|
+
export declare function setAudioOutputDevice(deviceId: string): Promise<void>;
|
|
1191
|
+
|
|
1192
|
+
declare type SetDelayCharacterMsg = {
|
|
1193
|
+
type: 'setCharacter';
|
|
1194
|
+
modes: DelayCharacter[];
|
|
1195
|
+
};
|
|
1196
|
+
|
|
1197
|
+
/** All supported oscillator waveforms */
|
|
1198
|
+
export declare const SUPPORTED_WAVEFORMS: readonly SupportedWaveform[];
|
|
1199
|
+
|
|
1200
|
+
/** Union type of all supported waveforms */
|
|
1201
|
+
export declare type SupportedWaveform = 'sine' | 'sawtooth' | 'square' | 'triangle' | CustomLibWaveform;
|
|
1202
|
+
|
|
1203
|
+
declare type TriggerDelayMsg = {
|
|
1204
|
+
type: 'trigger';
|
|
1205
|
+
};
|
|
1206
|
+
|
|
1207
|
+
declare class ValueSnapper {
|
|
1208
|
+
#private;
|
|
1209
|
+
paramType: string | null;
|
|
1210
|
+
setScale(rootNote: keyof typeof ROOT_NOTES, scalePattern: readonly number[] | number[], tuningOffset: number | undefined, // in semitones
|
|
1211
|
+
lowestOctave: number | undefined, highestOctave: number | undefined, normalize: NormalizeOptions | false, snapToZeroCrossings?: number[] | false): number[];
|
|
1212
|
+
setRootNote(rootNote: keyof typeof ROOT_NOTES): void;
|
|
1213
|
+
setAllowedPeriods(periods: number[], normalize: NormalizeOptions | false, snapToZeroCrossings?: number[] | false, direction?: 'left' | 'right' | 'any'): number[];
|
|
1214
|
+
snapToValue(target: number, allowedValues?: number[], tolerance?: number, preferDirection?: 'left' | 'right' | 'any'): number;
|
|
1215
|
+
snapToMusicalPeriod(targetPeriod: number, allowedPeriods?: number[]): number;
|
|
1216
|
+
setAllowedValues(values: number[], normalize: NormalizeOptions | false): number[];
|
|
1217
|
+
get rootNote(): "C" | "C#" | "Db" | "D" | "D#" | "Eb" | "E" | "F" | "F#" | "Gb" | "G" | "G#" | "Ab" | "A" | "A#" | "Bb" | "B";
|
|
1218
|
+
get scalePattern(): number[];
|
|
1219
|
+
get periods(): number[];
|
|
1220
|
+
get shortestPeriod(): number;
|
|
1221
|
+
get longestPeriod(): number;
|
|
1222
|
+
get hasValueSnapping(): boolean;
|
|
1223
|
+
get hasPeriodSnapping(): boolean;
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
declare const VoiceState: {
|
|
1227
|
+
readonly NOT_READY: "NOT_READY";
|
|
1228
|
+
readonly LOADED: "LOADED";
|
|
1229
|
+
readonly PLAYING: "PLAYING";
|
|
1230
|
+
readonly RELEASING: "RELEASING";
|
|
1231
|
+
readonly STOPPING: "STOPPING";
|
|
1232
|
+
readonly STOPPED: "STOPPED";
|
|
1233
|
+
};
|
|
1234
|
+
|
|
1235
|
+
declare type VoiceState = (typeof VoiceState)[keyof typeof VoiceState];
|
|
1236
|
+
|
|
1237
|
+
declare type VoiceType = 'sample-voice' | 'karplus-strong-voice' | 'osc-voice' | 'noise-voice';
|
|
1238
|
+
|
|
1239
|
+
/**
|
|
1240
|
+
* Generic options interface that can be used with any CustomLibWaveform type
|
|
1241
|
+
*/
|
|
1242
|
+
declare interface WaveformOptions {
|
|
1243
|
+
harmonics?: number;
|
|
1244
|
+
seed?: number;
|
|
1245
|
+
dutyCycle?: number;
|
|
1246
|
+
rolloff?: number;
|
|
1247
|
+
voices?: number;
|
|
1248
|
+
detune?: number;
|
|
1249
|
+
brightness?: number;
|
|
1250
|
+
inharmonicity?: number;
|
|
1251
|
+
formantFreqs?: number[];
|
|
1252
|
+
formantBandwidths?: number[];
|
|
1253
|
+
fundamentalFreq?: number;
|
|
1254
|
+
slope?: number;
|
|
1255
|
+
chaos?: number;
|
|
1256
|
+
harmonicDensity?: number;
|
|
1257
|
+
waveFunction?: (phase: number) => number;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
declare interface WorkletConfig {
|
|
1261
|
+
params: WorkletParameters;
|
|
1262
|
+
message: WorkletMessage;
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
declare type WorkletMessage = Record<string, any>;
|
|
1266
|
+
|
|
1267
|
+
declare class WorkletNode<TConfig extends WorkletConfig = DefaultWorkletConfig> extends AudioWorkletNode {
|
|
1268
|
+
private _processorReady;
|
|
1269
|
+
private _messageQueue;
|
|
1270
|
+
constructor(audioContext: AudioContext, processorName: string, options?: AudioWorkletNodeOptions);
|
|
1271
|
+
setParam<K extends keyof TConfig['params']>(name: K, value: TConfig['params'][K]): this;
|
|
1272
|
+
getParam<K extends keyof TConfig['params']>(name: K): AudioParam | undefined;
|
|
1273
|
+
sendProcessorMessage(message: TConfig['message']): this;
|
|
1274
|
+
private _onProcessorMessage?;
|
|
1275
|
+
onProcessorMessage(callback: (event: MessageEvent<TConfig['message']>) => void): this;
|
|
1276
|
+
dispose(): void;
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
declare interface WorkletParameters {
|
|
1280
|
+
[key: string]: number;
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
export { }
|