@weasel-js/audio 1.9.3 → 1.10.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/README.md CHANGED
@@ -17,6 +17,10 @@ dedicated Worker instead (`createTickTimer`). The worker is built from an inline
17
17
  global, or a Content-Security-Policy without `worker-src blob:` — it falls back
18
18
  to `setTimeout`, and a hidden tab books late again.
19
19
 
20
+ The worker times the pass, but the pass itself runs on the main thread, so a
21
+ stall there longer than the lookahead starts whatever came due late. The
22
+ `onLate(lateMs, when)` option reports each one; if it fires, raise `lookahead`.
23
+
20
24
  A suspended `AudioContext` is a separate matter: its clock stops, and on resume
21
25
  the engine drops what came due meanwhile rather than firing it all at once.
22
26
 
@@ -30,6 +34,11 @@ Browsers start an `AudioContext` suspended until a user gesture. The engine
30
34
  resumes on the first gesture automatically; `play()` before that drops the voice
31
35
  with a dev warning rather than queueing it.
32
36
 
37
+ `onDone` is called when a voice's source ends: it played out, or was stopped,
38
+ faded or stolen. A voice that never played calls `onDrop(reason)` instead, with
39
+ `'locked'`, `'disposed'`, `'stopped'`, `'unready'`, `'failed'` or `'stale'`, so
40
+ code chaining one sound after another hears about both.
41
+
33
42
  ## Notes and patterns
34
43
 
35
44
  `playNote` plays a synthesized voice — an `OscillatorNode` under an ADSR
@@ -85,6 +94,45 @@ player.start();
85
94
  player.setTempo(140);
86
95
  ```
87
96
 
97
+ A `step` can be fractional: `{ step: 2.25 }` sounds a quarter of a step after
98
+ step 2, which is how a pattern swings or a hit drags. The player's `detune` is
99
+ cents added to every event, as a number or a function of the event's step, for
100
+ a loop that drifts in pitch. `patternVoicePeaks(events, opts)` returns the most
101
+ voices the pattern holds at once on each bus, to check against `voiceLimit`
102
+ before it plays.
103
+
104
+ ## Generative scoring
105
+
106
+ `createScore` writes music from a mood instead of choosing a clip. A mood is
107
+ three numbers — `valence` (-1 dark to 1 bright), `tension` and `urgency` (0 to
108
+ 1) — and each one moves its own musical parameters: valence picks the mode, the
109
+ register and how open the chords are; tension picks the harmony and how many
110
+ layers build up; urgency picks the tempo, the pulse, the articulation and how
111
+ often the chord changes.
112
+
113
+ ```ts
114
+ const score = createScore(engine, {
115
+ mood: { valence: -1, tension: 1, urgency: 0 },
116
+ bus: 'music',
117
+ onBar: (state) => {
118
+ label.textContent = `${state.cue.name}: ${state.params.mode}, ${state.params.tempo} bpm`;
119
+ },
120
+ });
121
+ score.start();
122
+ score.setMood({ valence: 0, tension: 0.7, urgency: 1 }); // from the next bar line
123
+ ```
124
+
125
+ The corners of that space are the stock devices of documentary and news
126
+ scoring, listed in `scoreCues` with a sentence each on what they do: `dread`,
127
+ `investigation`, `wonder` and `urgency`. They work on a listener without asking
128
+ them, so the score says what it is doing: `state()` and `onBar` give the cue in
129
+ force, each cue's share of the mood (`cue.weights`), and every parameter the bar
130
+ was written from. Show it.
131
+
132
+ The layers underneath are usable on their own: `scoreParams(mood)` resolves a
133
+ mood, `scoreChord` and `scoreBar` write a chord and a bar of pattern events
134
+ from the parameters, and `readScoreCue(mood)` names the cue.
135
+
88
136
  ## Insert effects
89
137
 
90
138
  Each bus has an ordered insert chain, `engine.bus(name).inserts`, between where
@@ -124,7 +172,7 @@ bed.stop(800);
124
172
  ```
125
173
 
126
174
  It is a voice like the others: a `VoiceHandle`, the bus's inserts and voice
127
- pool, `cancelKey`, `onDone`, position and pan. What does not carry over:
175
+ pool, `cancelKey`, `onDone`, `onDrop`, position and pan. What does not carry over:
128
176
 
129
177
  - **No `when`.** The element starts once it has buffered enough; the start is
130
178
  not sample-accurate and cannot be booked ahead on the audio clock.
package/dist/index.d.ts CHANGED
@@ -59,6 +59,7 @@ interface InsertSlot {
59
59
  /** Position in the chain, or -1 once removed. */
60
60
  index(): number;
61
61
  }
62
+ /** Where `InsertChain.add` puts an effect, and whether it starts bypassed. */
62
63
  interface InsertAddOptions {
63
64
  /** Default: the end of the chain. Clamped. */
64
65
  index?: number;
@@ -76,6 +77,7 @@ interface InsertChain {
76
77
  clear(): void;
77
78
  settled(): Promise<void>;
78
79
  }
80
+ /** Options for an insert chain: its crossfade length, and the timers it schedules with. */
79
81
  interface InsertChainOptions extends Partial<Timers> {
80
82
  /** Crossfade length for every edit, in ms. Default 15. */
81
83
  fadeMs?: number;
@@ -186,12 +188,15 @@ interface Envelope {
186
188
  /** Default 30. */
187
189
  release?: number;
188
190
  }
191
+ /** An envelope with every default filled in and every value in range. */
189
192
  type ResolvedEnvelope = Required<Envelope>;
193
+ /** One breakpoint of an envelope's curve: a level at a time. */
190
194
  interface EnvelopePoint {
191
195
  /** ms from the note's start. */
192
196
  at: number;
193
197
  value: number;
194
198
  }
199
+ /** Fill an envelope's defaults, clamping times to zero or more and `sustain` to 0..1. */
195
200
  declare function resolveEnvelope(env?: Envelope): ResolvedEnvelope;
196
201
  /** The level `t` ms after the start. With `gate`, the release begins that many
197
202
  * ms in, from whatever level the envelope had reached. */
@@ -214,6 +219,7 @@ declare function midiToFrequency(midi: number): number;
214
219
  /** MIDI number of a scientific pitch name: C4 is 60. Accepts any run of `#`
215
220
  * or `b` after the letter. */
216
221
  declare function noteToMidi(name: string): number;
222
+ /** A pitch in hertz. Throws on a note name it cannot read, and on a frequency that is not positive and finite. */
217
223
  declare function toFrequency(pitch: Pitch): number;
218
224
 
219
225
  /** Which voice a full pool evicts: the earliest started, or the lowest gain. */
@@ -279,8 +285,24 @@ interface PlayOptions {
279
285
  when?: number;
280
286
  /** `stopKey(key)` stops every voice sharing this key. */
281
287
  cancelKey?: string;
288
+ /** The voice's source ended: it played out, or was stopped, faded, released
289
+ * or stolen after it started. */
282
290
  onDone?: () => void;
291
+ /** The voice never got a source, so `onDone` will not be called. Called
292
+ * after `play()` has returned, never from inside it. */
293
+ onDrop?: (reason: VoiceDropReason) => void;
283
294
  }
295
+ /**
296
+ * Why a voice never played:
297
+ *
298
+ * - `locked` — the context was not running when it was played.
299
+ * - `disposed` — the engine was disposed, before the play or while it waited.
300
+ * - `stopped` — stopped, released or `stopKey`ed before it came due.
301
+ * - `unready` — its sound was not loaded in this engine when it came due.
302
+ * - `failed` — its node threw as it started.
303
+ * - `stale` — it came due while the context was suspended.
304
+ */
305
+ type VoiceDropReason = 'locked' | 'disposed' | 'stopped' | 'unready' | 'failed' | 'stale';
284
306
  /** Controls for one voice from `play()`. Safe to keep past the voice's end:
285
307
  * every setter is then a no-op and `isPlaying()` is false. */
286
308
  interface VoiceHandle {
@@ -424,6 +446,10 @@ interface AudioEngineOptions {
424
446
  * replaces the default, and the missing half falls back to `setTimeout`'s. */
425
447
  setTimer?: (cb: () => void, ms: number) => unknown;
426
448
  clearTimer?: (handle: unknown) => void;
449
+ /** A voice or an `engine.schedule` callback came due `lateMs` after its
450
+ * time `when`, both in engine ms: the main thread stalled for longer than
451
+ * the lookahead covers, and the voice sounded late by that much. */
452
+ onLate?: (lateMs: number, when: number) => void;
427
453
  /** Crossfade for every insert-chain edit and bypass, in ms. Default 15. */
428
454
  insertFadeMs?: number;
429
455
  /** Uniform in [0, 1), for where in its loop a noise voice starts. Default `Math.random`. */
@@ -493,6 +519,7 @@ interface AudioEngine {
493
519
  */
494
520
  declare function createAudioEngine(opts?: AudioEngineOptions): AudioEngine;
495
521
 
522
+ /** Options for `createFilterEffect`. Unset ones keep the node's defaults. */
496
523
  interface FilterEffectOptions {
497
524
  /** Default 'lowpass'. */
498
525
  type?: BiquadFilterType;
@@ -502,6 +529,7 @@ interface FilterEffectOptions {
502
529
  /** dB, for the shelf and peaking types. */
503
530
  gain?: number;
504
531
  }
532
+ /** A filter insert, with its `BiquadFilterNode` exposed. */
505
533
  interface FilterEffect extends InsertEffect {
506
534
  readonly filter: BiquadFilterNode;
507
535
  }
@@ -514,6 +542,7 @@ interface WetDryMix {
514
542
  mix(): number;
515
543
  setMix(mix: number, rampMs?: number): void;
516
544
  }
545
+ /** Options for `createReverbEffect`. */
517
546
  interface ReverbEffectOptions {
518
547
  /** The room: an impulse response, loaded or synthesized like any buffer. */
519
548
  impulse: AudioBuffer;
@@ -522,11 +551,13 @@ interface ReverbEffectOptions {
522
551
  /** Scale the impulse to a consistent level. Default true, the node's own. */
523
552
  normalize?: boolean;
524
553
  }
554
+ /** A reverb insert, with its `ConvolverNode` exposed. */
525
555
  interface ReverbEffect extends InsertEffect, WetDryMix {
526
556
  readonly convolver: ConvolverNode;
527
557
  }
528
558
  /** Convolution reverb from an impulse buffer, with a wet/dry mix. */
529
559
  declare function createReverbEffect(ctx: BaseAudioContext, opts: ReverbEffectOptions): ReverbEffect;
560
+ /** Options for `createDelayEffect`. */
530
561
  interface DelayEffectOptions {
531
562
  /** ms. Default 250. */
532
563
  time?: number;
@@ -538,6 +569,7 @@ interface DelayEffectOptions {
538
569
  * of 1000 and `time`. */
539
570
  maxTime?: number;
540
571
  }
572
+ /** A feedback delay insert, with its `DelayNode` exposed. Ramps are ms. */
541
573
  interface DelayEffect extends InsertEffect, WetDryMix {
542
574
  readonly delay: DelayNode;
543
575
  setTime(ms: number, rampMs?: number): void;
@@ -549,6 +581,7 @@ interface DelayEffect extends InsertEffect, WetDryMix {
549
581
  /** A feedback delay with a wet/dry mix. Ramping `setTime` bends the pitch of
550
582
  * the repeats while it moves, as a tape delay does. */
551
583
  declare function createDelayEffect(ctx: BaseAudioContext, opts?: DelayEffectOptions): DelayEffect;
584
+ /** Options for `createCompressorEffect`. Unset ones keep the node's defaults. */
552
585
  interface CompressorEffectOptions {
553
586
  /** dB. */
554
587
  threshold?: number;
@@ -562,6 +595,7 @@ interface CompressorEffectOptions {
562
595
  /** Linear gain after the compressor, to win back the level it takes. Default 1. */
563
596
  makeup?: number;
564
597
  }
598
+ /** A compressor insert, with its `DynamicsCompressorNode` and makeup `GainNode` exposed. */
565
599
  interface CompressorEffect extends InsertEffect {
566
600
  readonly compressor: DynamicsCompressorNode;
567
601
  readonly makeup: GainNode;
@@ -582,6 +616,11 @@ interface SchedulerOptions {
582
616
  lookahead?: number;
583
617
  /** Time between passes, in ms. Default 25. */
584
618
  interval?: number;
619
+ /** An event fired `lateMs` after its time `when`: the passes that should
620
+ * have reached it inside the lookahead stalled, and whatever it starts will
621
+ * sound late by that much. Never called for an event booked inside the
622
+ * lookahead or for a time already past, which no pass was meant to catch. */
623
+ onLate?: (lateMs: number, when: number) => void;
585
624
  }
586
625
  /** A queue of callbacks keyed to engine time. See `createScheduler`. */
587
626
  interface Scheduler {
@@ -634,7 +673,11 @@ interface TickTimer {
634
673
  */
635
674
  declare function createTickTimer(): TickTimer;
636
675
 
637
- /** A synth note on a step. `length` is its gate in steps, default 1. */
676
+ /** A synth note on a step. `length` is its gate in steps, default 1.
677
+ *
678
+ * Any event's `step` may be fractional: it is booked with the step it sits in
679
+ * and sounds that fraction of a step later, so `2.5` is halfway from step 2 to
680
+ * step 3. That is swing, a flam, or a hit that drags. */
638
681
  interface PatternNote extends Omit<NoteOptions, 'when' | 'duration'> {
639
682
  step: number;
640
683
  length?: number;
@@ -650,6 +693,7 @@ interface PatternHit extends Omit<PlayOptions, 'when'> {
650
693
  step: number;
651
694
  sound: SoundHandle;
652
695
  }
696
+ /** Anything a pattern plays on a step. */
653
697
  type PatternEvent = PatternNote | PatternNoise | PatternHit;
654
698
  /** Options for `createPatternPlayer`. */
655
699
  interface PatternPlayerOptions {
@@ -663,10 +707,16 @@ interface PatternPlayerOptions {
663
707
  length?: number;
664
708
  /** Default true. */
665
709
  loop?: boolean;
710
+ /** Cents added to every event's own `detune`: a number, or a function of
711
+ * the event's `step`, for a pattern that drifts in pitch as it plays. A
712
+ * function is asked as each event is booked. Default 0. */
713
+ detune?: PatternDetune;
666
714
  /** Called as each step is booked — up to a lookahead ahead of it sounding —
667
715
  * with its index in the pattern and its engine time in ms. */
668
716
  onStep?: (step: number, when: number) => void;
669
717
  }
718
+ /** See `PatternPlayerOptions.detune`. */
719
+ type PatternDetune = number | ((step: number) => number);
670
720
  /** A running sequence of steps. See `createPatternPlayer`. */
671
721
  interface PatternPlayer {
672
722
  /** Start from step 0 at engine time `when`, default now. No-op while playing. */
@@ -675,11 +725,17 @@ interface PatternPlayer {
675
725
  stop(): void;
676
726
  playing(): boolean;
677
727
  tempo(): number;
678
- /** Takes effect from the next step not yet booked. */
728
+ /** Takes effect from the next step not yet booked. Called from `onStep`,
729
+ * that is the step after the one reported, which keeps its own length. */
679
730
  setTempo(bpm: number): void;
680
731
  /** Takes effect from the next step not yet booked. */
732
+ setDetune(detune: PatternDetune): void;
733
+ /** Takes effect from the next step not yet booked. */
681
734
  setEvents(events: readonly PatternEvent[], length?: number): void;
682
735
  }
736
+ /** Steps in one pass of `events` when no length is given: through the last
737
+ * event, rounded up to a whole beat. */
738
+ declare function patternLength(events: readonly PatternEvent[], stepsPerBeat?: number): number;
683
739
  /**
684
740
  * A step sequencer over `engine`. Each step is one `engine.schedule` booking;
685
741
  * when it fires, it books that step's events at the step's exact time and then
@@ -693,6 +749,167 @@ interface PatternPlayer {
693
749
  */
694
750
  declare function createPatternPlayer(engine: AudioEngine, opts: PatternPlayerOptions): PatternPlayer;
695
751
 
752
+ /** Options for `patternVoicePeaks`. The first four mean what they mean to
753
+ * `createPatternPlayer`, and should be the values the player is given. */
754
+ interface PatternLoadOptions {
755
+ tempo: number;
756
+ stepsPerBeat?: number;
757
+ length?: number;
758
+ loop?: boolean;
759
+ /** The bus of an event that names none: the engine's first. Default 'sfx'. */
760
+ bus?: string;
761
+ /** The engine's `lookahead` in ms. Default 100. */
762
+ lookahead?: number;
763
+ /** How long a buffer hit sounds, in ms. Default: one step. */
764
+ hitMs?: (hit: PatternHit) => number;
765
+ }
766
+ /**
767
+ * The most voices a pattern holds at once on each bus, to set against the
768
+ * engine's `voiceLimit` before the pattern plays: past the limit, each new
769
+ * event steals a voice that is still ringing.
770
+ *
771
+ * A note or a noise holds its voice through its gate and its envelope's
772
+ * release. With `loop`, what rings past the end of a pass is counted against
773
+ * the start of the next.
774
+ */
775
+ declare function patternVoicePeaks(events: readonly PatternEvent[], opts: PatternLoadOptions): Record<string, number>;
776
+
777
+ /** Where a score sits on the three axes it is steered by. Values outside a
778
+ * range are read as its nearest end. */
779
+ interface ScoreMood {
780
+ /** -1 dark to 1 bright. */
781
+ valence: number;
782
+ /** 0 consonant and settled to 1 dissonant. */
783
+ tension: number;
784
+ /** 0 still to 1 driving. */
785
+ urgency: number;
786
+ }
787
+ /** The scoring devices of factual screen content that a mood can land on. */
788
+ type ScoreCueName = 'dread' | 'investigation' | 'wonder' | 'urgency';
789
+ /** One named device: the mood that produces it, and what it does to a listener
790
+ * in words, for a consumer to show beside the score. */
791
+ interface ScoreCue {
792
+ name: ScoreCueName;
793
+ mood: ScoreMood;
794
+ device: string;
795
+ }
796
+ /** The built-in cues: each names a mood and the musical device that carries it. */
797
+ declare const scoreCues: readonly ScoreCue[];
798
+ /** Which cue a mood is applying: the nearest, and how much of each. */
799
+ interface ScoreCueReading {
800
+ name: ScoreCueName;
801
+ /** Each cue's share, summing to 1. A mood at a cue's own `mood` is all that cue. */
802
+ weights: Record<ScoreCueName, number>;
803
+ }
804
+ /** Name the cue a mood is applying, and weigh the others against it by
805
+ * inverse squared distance. */
806
+ declare function readScoreCue(mood: ScoreMood): ScoreCueReading;
807
+ /** The modes a score draws on, brightest first. */
808
+ type ScoreMode = 'lydian' | 'ionian' | 'dorian' | 'aeolian' | 'phrygian';
809
+ /** Each mode's seven tones, in semitones above its tonic. */
810
+ declare const scoreModes: Record<ScoreMode, readonly number[]>;
811
+ /** The musical parameters a mood resolves to. Each follows one axis only. */
812
+ interface ScoreParams {
813
+ /** From valence. */
814
+ mode: ScoreMode;
815
+ /** MIDI note of the tonic the chords are built up from. From valence. */
816
+ register: number;
817
+ /** Octaves a chord is opened across, 1 to 3. From valence. */
818
+ spread: number;
819
+ /** How the tones above a root are chosen: thirds from the mode, stacked
820
+ * fourths and fifths, or a minor second and a tritone. From tension. */
821
+ harmony: 'triadic' | 'quartal' | 'cluster';
822
+ /** The most layers a pulsed score builds up to. From tension. */
823
+ layers: number;
824
+ /** Beats per minute. From urgency. */
825
+ tempo: number;
826
+ /** Notes to a beat; 0 is no pulse at all. From urgency. */
827
+ density: 0 | 1 | 2 | 4;
828
+ /** From urgency. */
829
+ articulation: 'sustained' | 'plucked';
830
+ /** Bars a chord lasts. From urgency. */
831
+ harmonicRhythm: number;
832
+ /** Envelope attack in ms. From urgency. */
833
+ attack: number;
834
+ }
835
+ /** Resolve a mood to the parameters `scoreBar` writes music from. */
836
+ declare function scoreParams(mood: ScoreMood): ScoreParams;
837
+
838
+ /** Steps in a bar of score: sixteenths in 4/4. */
839
+ declare const SCORE_BAR_STEPS = 16;
840
+ /** How `scoreBar` places and routes its notes. */
841
+ interface ScoreBarOptions {
842
+ /** Semitones above C for the tonic. Default 0. */
843
+ tonic?: number;
844
+ /** Default: the engine's first bus. */
845
+ bus?: string;
846
+ /** The level the notes sounding on one step add up to at most. Default 0.5. */
847
+ gain?: number;
848
+ /** Chooses the order an ostinato takes a chord's tones in. Default: rising. */
849
+ seed?: number;
850
+ }
851
+ /**
852
+ * The chord a score plays, as MIDI notes, root first. `chord` counts chords
853
+ * since the score began; a cluster stays on the tonic, and the other harmonies
854
+ * walk a four-chord progression inside the mode.
855
+ */
856
+ declare function scoreChord(params: ScoreParams, chord: number, tonic?: number): number[];
857
+ /**
858
+ * One bar of score as pattern events, for a player `SCORE_BAR_STEPS` long.
859
+ * `bar` counts bars since the score began: it picks the chord, by the harmonic
860
+ * rhythm, and how many layers a pulsed score has built up to, one more every
861
+ * two bars. The same arguments always write the same bar.
862
+ *
863
+ * With no pulse, the bar is its chord held throughout. With one, the layers
864
+ * are an ostinato over the chord's tones, a bass on the root, the ostinato
865
+ * doubled an octave up on the off pulses, and the chord held as a pad.
866
+ */
867
+ declare function scoreBar(params: ScoreParams, bar: number, opts?: ScoreBarOptions): PatternNote[];
868
+
869
+ /** What a score is playing in one bar, and why: the mood it was given, the cue
870
+ * that mood applies, and the parameters the bar was written from. */
871
+ interface ScoreState {
872
+ /** Bars since `start`. */
873
+ bar: number;
874
+ /** Bars since the cue last changed, which is what a pulsed score's layers
875
+ * build up from. */
876
+ cueBar: number;
877
+ mood: ScoreMood;
878
+ cue: ScoreCueReading;
879
+ params: ScoreParams;
880
+ }
881
+ /** Options for `createScore`. */
882
+ interface ScoreOptions extends ScoreBarOptions {
883
+ mood: ScoreMood;
884
+ /** Called as each bar's first step is booked — up to a lookahead before it
885
+ * sounds — with what the bar plays and its engine time in ms. */
886
+ onBar?: (state: ScoreState, when: number) => void;
887
+ }
888
+ /** A running generative score. See `createScore`. */
889
+ interface Score {
890
+ /** Start from bar 0 at engine time `when`, default now. No-op while playing. */
891
+ start(when?: number): void;
892
+ /** Book nothing further, and release every voice the score started. */
893
+ stop(): void;
894
+ playing(): boolean;
895
+ /** The mood last set, which the next bar will take. */
896
+ mood(): ScoreMood;
897
+ /** Takes effect at the next bar line. */
898
+ setMood(mood: ScoreMood): void;
899
+ /** The bar most recently booked. */
900
+ state(): ScoreState;
901
+ }
902
+ /**
903
+ * Music written continuously from a mood rather than chosen from clips. Each
904
+ * bar is `scoreBar` of the mood's `scoreParams`, booked through a pattern
905
+ * player, and a new mood lands on the next bar line with its tempo.
906
+ *
907
+ * These devices work on a listener without asking them, which is what they are
908
+ * for. `state()` and `onBar` name the cue in force and every parameter behind
909
+ * it, so a consumer can show what is being applied as well as play it.
910
+ */
911
+ declare function createScore(engine: AudioEngine, opts: ScoreOptions): Score;
912
+
696
913
  /** Samples of `color` noise, seeded so every context gets the same loop. The
697
914
  * end is pulled onto the start, so the loop point does not click. */
698
915
  declare function noiseSamples(color: NoiseColor, length: number): Float32Array;
@@ -727,4 +944,4 @@ declare const partialPresets: {
727
944
  };
728
945
  };
729
946
 
730
- export { type Acquisition, type AnalyserTap, type AnalyserTapOptions, type AudioEngine, type AudioEngineOptions, type BusGraph, type BusGraphOptions, type BusHandle, type CompressorEffect, type CompressorEffectOptions, type DelayEffect, type DelayEffectOptions, type Envelope, type EnvelopePoint, type FilterEffect, type FilterEffectOptions, type Glide, type Inharmonic, type InsertAddOptions, type InsertChain, type InsertChainOptions, type InsertEffect, type InsertSlot, type NoiseColor, type NoiseOptions, type NoisePatch, type NoteOptions, type PatternEvent, type PatternHit, type PatternNoise, type PatternNote, type PatternPlayer, type PatternPlayerOptions, type Pitch, type PlayOptions, type ResolvedEnvelope, type ReverbEffect, type ReverbEffectOptions, type Scheduler, type SchedulerOptions, type SoundCache, type SoundHandle, type SpatialOptions, type StealPolicy, type StreamOptions, type SynthPartial, type SynthPatch, type TickTimer, type Vec2, type VoiceFilter, type VoiceHandle, type VoicePool, type VoicePoolOptions, type VoiceRecord, type Waveform, type WetDryMix, createAnalyserTap, createAudioEngine, createBusGraph, createCompressorEffect, createDelayEffect, createFilterEffect, createPatternPlayer, createReverbEffect, createScheduler, createSoundCache, createTickTimer, createVoicePool, envelopeLevel, envelopePoints, midiToFrequency, noiseSamples, noteToMidi, partialPresets, resolveEnvelope, spatialize, toFrequency };
947
+ export { type Acquisition, type AnalyserTap, type AnalyserTapOptions, type AudioEngine, type AudioEngineOptions, type BusGraph, type BusGraphOptions, type BusHandle, type CompressorEffect, type CompressorEffectOptions, type DelayEffect, type DelayEffectOptions, type Envelope, type EnvelopePoint, type FilterEffect, type FilterEffectOptions, type Glide, type Inharmonic, type InsertAddOptions, type InsertChain, type InsertChainOptions, type InsertEffect, type InsertSlot, type NoiseColor, type NoiseOptions, type NoisePatch, type NoteOptions, type PatternDetune, type PatternEvent, type PatternHit, type PatternLoadOptions, type PatternNoise, type PatternNote, type PatternPlayer, type PatternPlayerOptions, type Pitch, type PlayOptions, type ResolvedEnvelope, type ReverbEffect, type ReverbEffectOptions, SCORE_BAR_STEPS, type Scheduler, type SchedulerOptions, type Score, type ScoreBarOptions, type ScoreCue, type ScoreCueName, type ScoreCueReading, type ScoreMode, type ScoreMood, type ScoreOptions, type ScoreParams, type ScoreState, type SoundCache, type SoundHandle, type SpatialOptions, type StealPolicy, type StreamOptions, type SynthPartial, type SynthPatch, type TickTimer, type Vec2, type VoiceDropReason, type VoiceFilter, type VoiceHandle, type VoicePool, type VoicePoolOptions, type VoiceRecord, type Waveform, type WetDryMix, createAnalyserTap, createAudioEngine, createBusGraph, createCompressorEffect, createDelayEffect, createFilterEffect, createPatternPlayer, createReverbEffect, createScheduler, createScore, createSoundCache, createTickTimer, createVoicePool, envelopeLevel, envelopePoints, midiToFrequency, noiseSamples, noteToMidi, partialPresets, patternLength, patternVoicePeaks, readScoreCue, resolveEnvelope, scoreBar, scoreChord, scoreCues, scoreModes, scoreParams, spatialize, toFrequency };