@blibliki/engine 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as _blibliki_utils from '@blibliki/utils';
2
2
  import { Context, Optional, EmptyObject } from '@blibliki/utils';
3
+ export { Context } from '@blibliki/utils';
3
4
  import { Message, Input } from 'webmidi';
4
5
  import * as _blibliki_transport from '@blibliki/transport';
5
6
  import { Seconds, ContextTime, Transport, TransportEvent, TimeSignature } from '@blibliki/transport';
@@ -37,7 +38,7 @@ declare class Note implements INote {
37
38
  declare enum MidiEventType {
38
39
  noteOn = "noteon",
39
40
  noteOff = "noteoff",
40
- cc = "cc"
41
+ cc = "controlchange"
41
42
  }
42
43
  declare class MidiEvent {
43
44
  note?: Note;
@@ -49,6 +50,9 @@ declare class MidiEvent {
49
50
  constructor(message: Message, triggeredAt: ContextTime);
50
51
  get type(): MidiEventType;
51
52
  get isNote(): boolean;
53
+ get isCC(): boolean;
54
+ get cc(): number | undefined;
55
+ get ccValue(): number | undefined;
52
56
  defineNotes(): void;
53
57
  get rawMessage(): Message;
54
58
  clone(voiceNo?: number): MidiEvent;
@@ -169,6 +173,7 @@ declare abstract class PolyModule<T extends ModuleType> implements IPolyModule<T
169
173
  protected superInitialized: boolean;
170
174
  private _voices;
171
175
  private _name;
176
+ private pendingUIUpdates;
172
177
  constructor(engineId: string, params: IPolyModuleConstructor<T>);
173
178
  get name(): string;
174
179
  set name(value: string);
@@ -188,6 +193,8 @@ declare abstract class PolyModule<T extends ModuleType> implements IPolyModule<T
188
193
  protected unPlugAll(): void;
189
194
  dispose(): void;
190
195
  onMidiEvent: (midiEvent: MidiEvent) => void;
196
+ triggerPropsUpdate: () => void;
197
+ private sheduleTriggerUpdate;
191
198
  findVoice(voiceNo: number): Module<T>;
192
199
  protected registerDefaultIOs(value?: "both" | "in" | "out"): void;
193
200
  protected registerAudioInput(props: Omit<PolyAudioInputProps, "ioType">): PolyAudioInput;
@@ -267,6 +274,46 @@ type IModuleSerialize<T extends ModuleType> = IModule<T> & {
267
274
  type IModuleConstructor<T extends ModuleType> = Optional<IModule<T>, "id" | "voiceNo"> & {
268
275
  audioNodeConstructor?: (context: Context) => AudioNode;
269
276
  };
277
+ /**
278
+ * Helper type for type-safe property lifecycle hooks.
279
+ *
280
+ * Hooks are completely optional - only define the ones you need.
281
+ * Use explicit type annotation for automatic type inference.
282
+ *
283
+ * @example
284
+ * ```typescript
285
+ * export type IGainProps = {
286
+ * gain: number;
287
+ * muted: boolean;
288
+ * };
289
+ *
290
+ * export class MonoGain extends Module<ModuleType.Gain> {
291
+ * // ✅ Define only the hooks you need with type annotation
292
+ * // value type is automatically inferred as number!
293
+ * onSetGain: SetterHooks<IGainProps>["onSetGain"] = (value) => {
294
+ * this.audioNode.gain.value = value;
295
+ * return value; // optional: return modified value
296
+ * };
297
+ *
298
+ * // ✅ onAfterSet is called after prop is set
299
+ * onAfterSetMuted: SetterHooks<IGainProps>["onAfterSetMuted"] = (value) => {
300
+ * if (value) this.audioNode.gain.value = 0;
301
+ * };
302
+ *
303
+ * // ✅ You can omit hooks you don't need - they're optional!
304
+ * // No need to define onSetMuted if you don't need it
305
+ *
306
+ * // ❌ This would cause a type error:
307
+ * // onSetGain: SetterHooks<IGainProps>["onSetGain"] = (value: string) => value;
308
+ * // ^^^^^^ Error!
309
+ * }
310
+ * ```
311
+ */
312
+ type SetterHooks<P> = {
313
+ [K in keyof P as `onSet${Capitalize<string & K>}`]: (value: P[K]) => P[K];
314
+ } & {
315
+ [K in keyof P as `onAfterSet${Capitalize<string & K>}`]: (value: P[K]) => void;
316
+ };
270
317
  declare abstract class Module<T extends ModuleType> implements IModule<T> {
271
318
  id: string;
272
319
  engineId: string;
@@ -279,9 +326,11 @@ declare abstract class Module<T extends ModuleType> implements IModule<T> {
279
326
  protected _props: ModuleTypeToPropsMapping[T];
280
327
  protected superInitialized: boolean;
281
328
  protected activeNotes: Note[];
329
+ private pendingUIUpdates;
282
330
  constructor(engineId: string, params: IModuleConstructor<T>);
283
331
  get props(): ModuleTypeToPropsMapping[T];
284
332
  set props(value: Partial<ModuleTypeToPropsMapping[T]>);
333
+ private callPropHook;
285
334
  serialize(): IModuleSerialize<T>;
286
335
  plug({ audioModule, from, to, }: {
287
336
  audioModule: AnyModule;
@@ -294,8 +343,10 @@ declare abstract class Module<T extends ModuleType> implements IModule<T> {
294
343
  stop(_time: ContextTime): void;
295
344
  triggerAttack(note: Note, _triggeredAt: ContextTime): void;
296
345
  triggerRelease(note: Note, _triggeredAt: ContextTime): void;
346
+ handleCC(_event: MidiEvent, _triggeredAt: ContextTime): void;
297
347
  onMidiEvent: (midiEvent: MidiEvent) => void;
298
- protected triggerPropsUpdate(): void;
348
+ triggerPropsUpdate: () => void;
349
+ private sheduleTriggerUpdate;
299
350
  dispose(): void;
300
351
  protected registerDefaultIOs(value?: "both" | "in" | "out"): void;
301
352
  protected registerAudioInput(props: Omit<AudioInputProps, "ioType">): AudioInput;
@@ -352,6 +403,7 @@ type NumberProp = BasePropType & {
352
403
  min?: number;
353
404
  max?: number;
354
405
  step?: number;
406
+ exp?: number;
355
407
  };
356
408
  type EnumProp<T extends string | number> = BasePropType & {
357
409
  kind: "enum";
@@ -367,11 +419,70 @@ type BooleanProp = BasePropType & {
367
419
  type ArrayProp = BasePropType & {
368
420
  kind: "array";
369
421
  };
370
- type PropDefinition<T> = T extends number ? NumberProp | EnumProp<number> : T extends boolean ? BooleanProp : T extends string ? StringProp | EnumProp<string> : T extends (string | number)[] ? ArrayProp : never;
371
- type PropSchema<T> = {
372
- [K in keyof T]: PropDefinition<T[K]>;
422
+ type PropSchema = NumberProp | EnumProp<string> | EnumProp<number> | StringProp | BooleanProp | ArrayProp;
423
+ type PrimarySchemaForType<T> = T extends boolean ? BooleanProp : T extends string ? StringProp : T extends number ? NumberProp : T extends unknown[] ? ArrayProp : never;
424
+ /**
425
+ * Schema type that maps each property to its primary schema type, with optional overrides.
426
+ * This provides excellent IntelliSense for both simple and complex cases.
427
+ *
428
+ * Basic usage:
429
+ * ```typescript
430
+ * type MyProps = { count: number; name: string; enabled: boolean };
431
+ * const mySchema: ModulePropSchema<MyProps> = {
432
+ * count: { kind: "number", min: 0, max: 100 },
433
+ * name: { kind: "string" },
434
+ * enabled: { kind: "boolean" }
435
+ * };
436
+ * ```
437
+ *
438
+ * With overrides for custom schema types:
439
+ * ```typescript
440
+ * type MyProps = { wave: OscillatorWave; frequency: number };
441
+ * const mySchema: ModulePropSchema<MyProps, {
442
+ * wave: EnumProp<OscillatorWave>
443
+ * }> = {
444
+ * wave: { kind: "enum", options: Object.values(OscillatorWave) },
445
+ * frequency: { kind: "number", min: 0, max: 1000 }
446
+ * };
447
+ * ```
448
+ */
449
+ type ModulePropSchema<T, TOverrides extends Partial<Record<keyof T, PropSchema>> = EmptyObject> = {
450
+ [K in keyof T]: K extends keyof TOverrides ? TOverrides[K] : PrimarySchemaForType<T[K]>;
373
451
  };
374
452
 
453
+ type IOscillator = IModule<ModuleType.Oscillator>;
454
+ declare enum OscillatorWave {
455
+ sine = "sine",
456
+ triangle = "triangle",
457
+ square = "square",
458
+ sawtooth = "sawtooth"
459
+ }
460
+ /**
461
+ * Props for the Oscillator module.
462
+ *
463
+ * @property wave - Waveform shape of the oscillator.
464
+ * One of: "sine", "square", "sawtooth", "triangle", or "custom".
465
+ * @property frequency - Base frequency in Hz (e.g. 440 for A4).
466
+ * @property fine - Fine tuning factor in the range [-1, 1], where ±1 represents ±1 semitone.
467
+ * @property coarse - Coarse tuning factor in the range [-1, 1], scaled to ±12 semitones.
468
+ * @property octave - Octave transposition value (e.g. +1 for one octave up, -2 for two octaves down).
469
+ * @property lowGain - Whether to gain reduction (-18dB). When false, oscillator runs at full gain.
470
+ */
471
+ type IOscillatorProps = {
472
+ wave: OscillatorWave;
473
+ frequency: number;
474
+ fine: number;
475
+ coarse: number;
476
+ octave: number;
477
+ lowGain: boolean;
478
+ };
479
+ declare class Oscillator extends PolyModule<ModuleType.Oscillator> {
480
+ constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.Oscillator>);
481
+ start(time: ContextTime): void;
482
+ stop(time: ContextTime): void;
483
+ private registerInputs;
484
+ }
485
+
375
486
  type IVoiceSchedulerProps = EmptyObject;
376
487
  declare class Voice extends Module<ModuleType.VoiceScheduler> {
377
488
  audioNode: undefined;
@@ -390,25 +501,14 @@ declare class VoiceScheduler extends PolyModule<ModuleType.VoiceScheduler> {
390
501
  private registerOutputs;
391
502
  }
392
503
 
393
- type IBiquadFilterProps = {
394
- cutoff: number;
395
- envelopeAmount: number;
396
- type: BiquadFilterType;
397
- Q: number;
398
- };
399
- declare class BiquadFilter extends PolyModule<ModuleType.BiquadFilter> {
400
- constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.BiquadFilter>);
401
- private registerInputs;
402
- }
403
-
404
504
  type IConstantProps = {
405
505
  value: number;
406
506
  };
407
- declare class Constant extends Module<ModuleType.Constant> {
507
+ declare class Constant extends Module<ModuleType.Constant> implements Pick<SetterHooks<IConstantProps>, "onAfterSetValue"> {
408
508
  audioNode: ConstantSourceNode;
409
509
  isStated: boolean;
410
510
  constructor(engineId: string, params: ICreateModule<ModuleType.Constant>);
411
- protected onSetValue(value: IConstantProps["value"]): void;
511
+ onAfterSetValue: SetterHooks<IConstantProps>["onAfterSetValue"];
412
512
  start(time: ContextTime): void;
413
513
  stop(time: ContextTime): void;
414
514
  triggerAttack: (note: Note, triggeredAt: ContextTime) => void;
@@ -428,7 +528,8 @@ declare class Envelope extends PolyModule<ModuleType.Envelope> {
428
528
  type IFilterProps = {
429
529
  cutoff: number;
430
530
  envelopeAmount: number;
431
- resonance: number;
531
+ type: BiquadFilterType;
532
+ Q: number;
432
533
  };
433
534
  declare class Filter extends PolyModule<ModuleType.Filter> {
434
535
  constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.Filter>);
@@ -447,11 +548,11 @@ declare class Gain extends PolyModule<ModuleType.Gain> {
447
548
  type IInspectorProps = {
448
549
  fftSize: number;
449
550
  };
450
- declare class Inspector extends Module<ModuleType.Inspector> {
551
+ declare class Inspector extends Module<ModuleType.Inspector> implements Pick<SetterHooks<IInspectorProps>, "onAfterSetFftSize"> {
451
552
  audioNode: AnalyserNode;
452
553
  private _buffer?;
453
554
  constructor(engineId: string, params: ICreateModule<ModuleType.Inspector>);
454
- protected onSetFftSize(value: number): void;
555
+ onAfterSetFftSize: SetterHooks<IInspectorProps>["onAfterSetFftSize"];
455
556
  get buffer(): Float32Array<ArrayBuffer>;
456
557
  getValue(): number;
457
558
  getValues(): Float32Array;
@@ -464,68 +565,73 @@ declare class Master extends Module<ModuleType.Master> {
464
565
  constructor(engineId: string, params: ICreateModule<ModuleType.Master>);
465
566
  }
466
567
 
568
+ type IMidiMapper = IModule<ModuleType.MidiMapper>;
569
+ type IMidiMapperProps = {
570
+ pages: MidiMappingPage[];
571
+ activePage: number;
572
+ globalMappings: MidiMapping<ModuleType>[];
573
+ };
574
+ type MidiMappingPage = {
575
+ name?: string;
576
+ mappings: MidiMapping<ModuleType>[];
577
+ };
578
+ declare enum MidiMappingMode {
579
+ direct = "direct",
580
+ directRev = "directRev",
581
+ toggleInc = "toggleInc",
582
+ toggleDec = "toggleDec",
583
+ incDec = "incDec",
584
+ incDecRev = "incDecRev"
585
+ }
586
+ type MidiMapping<T extends ModuleType> = {
587
+ cc?: number;
588
+ moduleId?: string;
589
+ moduleType?: T;
590
+ propName?: string;
591
+ autoAssign?: boolean;
592
+ mode?: MidiMappingMode;
593
+ threshold?: number;
594
+ step?: number;
595
+ };
596
+ type MidiMapperSetterHooks = Pick<SetterHooks<IMidiMapperProps>, "onSetActivePage">;
597
+ declare class MidiMapper extends Module<ModuleType.MidiMapper> implements MidiMapperSetterHooks {
598
+ audioNode: undefined;
599
+ constructor(engineId: string, params: ICreateModule<ModuleType.MidiMapper>);
600
+ onSetActivePage: MidiMapperSetterHooks["onSetActivePage"];
601
+ handleCC: (event: MidiEvent, triggeredAt: ContextTime) => void;
602
+ forwardMapping: (event: MidiEvent, mapping: MidiMapping<ModuleType>, _triggeredAt: ContextTime) => void;
603
+ private checkAutoAssign;
604
+ }
605
+
467
606
  type IMidiSelectorProps = {
468
607
  selectedId: string | undefined | null;
469
608
  };
470
- declare class MidiSelector extends Module<ModuleType.MidiSelector> {
609
+ declare class MidiSelector extends Module<ModuleType.MidiSelector> implements Pick<SetterHooks<IMidiSelectorProps>, "onSetSelectedId"> {
471
610
  audioNode: undefined;
472
611
  midiOutput: MidiOutput;
473
612
  _forwardMidiEvent?: (midiEvent: MidiEvent) => void;
474
613
  constructor(engineId: string, params: ICreateModule<ModuleType.MidiSelector>);
475
- protected onSetSelectedId(value: string | null): void;
614
+ onSetSelectedId: SetterHooks<IMidiSelectorProps>["onSetSelectedId"];
476
615
  private get forwardMidiEvent();
477
616
  private addEventListener;
478
617
  private removeEventListener;
479
618
  private registerOutputs;
480
619
  }
481
620
 
482
- type IOscillator = IModule<ModuleType.Oscillator>;
483
- declare enum OscillatorWave {
484
- sine = "sine",
485
- triangle = "triangle",
486
- square = "square",
487
- sawtooth = "sawtooth"
488
- }
489
- /**
490
- * Props for the Oscillator module.
491
- *
492
- * @property wave - Waveform shape of the oscillator.
493
- * One of: "sine", "square", "sawtooth", "triangle", or "custom".
494
- * @property frequency - Base frequency in Hz (e.g. 440 for A4).
495
- * @property fine - Fine tuning factor in the range [-1, 1], where ±1 represents ±1 semitone.
496
- * @property coarse - Coarse tuning factor in the range [-1, 1], scaled to ±12 semitones.
497
- * @property octave - Octave transposition value (e.g. +1 for one octave up, -2 for two octaves down).
498
- * @property lowGain - Whether to gain reduction (-18dB). When false, oscillator runs at full gain.
499
- */
500
- type IOscillatorProps = {
501
- wave: OscillatorWave;
502
- frequency: number;
503
- fine: number;
504
- coarse: number;
505
- octave: number;
506
- lowGain: boolean;
507
- };
508
- declare class Oscillator extends PolyModule<ModuleType.Oscillator> {
509
- constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.Oscillator>);
510
- start(time: ContextTime): void;
511
- stop(time: ContextTime): void;
512
- private registerInputs;
513
- }
514
-
515
621
  type IScaleProps = {
516
622
  min: number;
517
623
  max: number;
518
624
  current: number;
519
625
  };
520
- declare class Scale extends Module<ModuleType.Scale> {
626
+ declare class Scale extends Module<ModuleType.Scale> implements Pick<SetterHooks<IScaleProps>, "onAfterSetMin" | "onAfterSetMax" | "onAfterSetCurrent"> {
521
627
  audioNode: AudioWorkletNode;
522
628
  constructor(engineId: string, params: ICreateModule<ModuleType.Scale>);
523
629
  get current(): AudioParam;
524
630
  get min(): AudioParam;
525
631
  get max(): AudioParam;
526
- protected onSetMin(value: number): void;
527
- protected onSetMax(value: number): void;
528
- protected onSetCurrent(value: number): void;
632
+ onAfterSetMin: SetterHooks<IScaleProps>["onAfterSetMin"];
633
+ onAfterSetMax: SetterHooks<IScaleProps>["onAfterSetMax"];
634
+ onAfterSetCurrent: SetterHooks<IScaleProps>["onAfterSetCurrent"];
529
635
  }
530
636
 
531
637
  type IStepSequencer = IModule<ModuleType.StepSequencer>;
@@ -545,6 +651,14 @@ declare class StepSequencer extends Module<ModuleType.StepSequencer> {
545
651
  constructor(engineId: string, params: ICreateModule<ModuleType.StepSequencer>);
546
652
  }
547
653
 
654
+ type IStereoPannerProps = {
655
+ pan: number;
656
+ };
657
+ declare class StereoPanner extends PolyModule<ModuleType.StereoPanner> {
658
+ constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.StereoPanner>);
659
+ private registerAdditionalInputs;
660
+ }
661
+
548
662
  type IVirtualMidiProps = {
549
663
  activeNotes: string[];
550
664
  };
@@ -566,10 +680,11 @@ declare enum ModuleType {
566
680
  MidiSelector = "MidiSelector",
567
681
  Envelope = "Envelope",
568
682
  Filter = "Filter",
569
- BiquadFilter = "BiquadFilter",
570
683
  Scale = "Scale",
684
+ StereoPanner = "StereoPanner",
571
685
  Inspector = "Inspector",
572
686
  Constant = "Constant",
687
+ MidiMapper = "MidiMapper",
573
688
  VirtualMidi = "VirtualMidi",
574
689
  StepSequencer = "StepSequencer",
575
690
  VoiceScheduler = "VoiceScheduler"
@@ -581,10 +696,11 @@ type ModuleTypeToPropsMapping = {
581
696
  [ModuleType.MidiSelector]: IMidiSelectorProps;
582
697
  [ModuleType.Envelope]: IEnvelopeProps;
583
698
  [ModuleType.Filter]: IFilterProps;
584
- [ModuleType.BiquadFilter]: IBiquadFilterProps;
585
699
  [ModuleType.Scale]: IScaleProps;
700
+ [ModuleType.StereoPanner]: IStereoPannerProps;
586
701
  [ModuleType.Inspector]: IInspectorProps;
587
702
  [ModuleType.Constant]: IConstantProps;
703
+ [ModuleType.MidiMapper]: IMidiMapperProps;
588
704
  [ModuleType.VirtualMidi]: IVirtualMidiProps;
589
705
  [ModuleType.StepSequencer]: IStepSequencerProps;
590
706
  [ModuleType.VoiceScheduler]: IVoiceSchedulerProps;
@@ -596,16 +712,36 @@ type ModuleTypeToModuleMapping = {
596
712
  [ModuleType.MidiSelector]: MidiSelector;
597
713
  [ModuleType.Envelope]: Envelope;
598
714
  [ModuleType.Filter]: Filter;
599
- [ModuleType.BiquadFilter]: BiquadFilter;
600
715
  [ModuleType.Scale]: Scale;
716
+ [ModuleType.StereoPanner]: StereoPanner;
601
717
  [ModuleType.Inspector]: Inspector;
602
718
  [ModuleType.Constant]: Constant;
719
+ [ModuleType.MidiMapper]: MidiMapper;
603
720
  [ModuleType.VirtualMidi]: VirtualMidi;
604
721
  [ModuleType.StepSequencer]: StepSequencer;
605
722
  [ModuleType.VoiceScheduler]: VoiceScheduler;
606
723
  };
607
724
  declare const moduleSchemas: {
608
- [K in ModuleType]: PropSchema<Partial<ModuleTypeToPropsMapping[K]>>;
725
+ Oscillator: ModulePropSchema<IOscillatorProps, {
726
+ wave: EnumProp<OscillatorWave>;
727
+ }>;
728
+ Gain: ModulePropSchema<IGainProps, _blibliki_utils.EmptyObject>;
729
+ Master: ModulePropSchema<_blibliki_utils.EmptyObject, _blibliki_utils.EmptyObject>;
730
+ MidiSelector: ModulePropSchema<IMidiSelectorProps, _blibliki_utils.EmptyObject>;
731
+ Envelope: ModulePropSchema<IEnvelopeProps, _blibliki_utils.EmptyObject>;
732
+ Filter: ModulePropSchema<IFilterProps, {
733
+ type: EnumProp<BiquadFilterType>;
734
+ }>;
735
+ Scale: ModulePropSchema<IScaleProps, _blibliki_utils.EmptyObject>;
736
+ StereoPanner: ModulePropSchema<IStereoPannerProps, _blibliki_utils.EmptyObject>;
737
+ Inspector: ModulePropSchema<IInspectorProps, {
738
+ fftSize: EnumProp<number>;
739
+ }>;
740
+ Constant: ModulePropSchema<IConstantProps, _blibliki_utils.EmptyObject>;
741
+ MidiMapper: ModulePropSchema<IMidiMapperProps, _blibliki_utils.EmptyObject>;
742
+ VirtualMidi: ModulePropSchema<IVirtualMidiProps, _blibliki_utils.EmptyObject>;
743
+ StepSequencer: ModulePropSchema<Omit<IStepSequencerProps, "sequences">, _blibliki_utils.EmptyObject>;
744
+ VoiceScheduler: ModulePropSchema<_blibliki_utils.EmptyObject, _blibliki_utils.EmptyObject>;
609
745
  };
610
746
 
611
747
  type AnyModule = Module<ModuleType>;
@@ -616,7 +752,7 @@ type ICreateModule<T extends ModuleType> = {
616
752
  props: Partial<ModuleTypeToPropsMapping[T]>;
617
753
  };
618
754
  type ModuleParams = {
619
- [K in ModuleType]: K extends ModuleType.Oscillator | ModuleType.Gain | ModuleType.Envelope | ModuleType.Filter | ModuleType.BiquadFilter | ModuleType.VoiceScheduler ? IPolyModuleConstructor<K> : ICreateModule<K>;
755
+ [K in ModuleType]: K extends ModuleType.Oscillator | ModuleType.Gain | ModuleType.Envelope | ModuleType.Filter | ModuleType.StereoPanner | ModuleType.VoiceScheduler ? IPolyModuleConstructor<K> : ICreateModule<K>;
620
756
  }[ModuleType];
621
757
 
622
758
  type IOProps = {
@@ -684,8 +820,8 @@ declare class Engine {
684
820
  constructor(context: Context);
685
821
  get state(): _blibliki_transport.TransportState;
686
822
  initialize(): Promise<void>;
687
- addModule<T extends ModuleType>(params: ICreateModule<T>): IModuleSerialize<ModuleType.Scale> | IPolyModuleSerialize<ModuleType.VoiceScheduler> | IPolyModuleSerialize<ModuleType.Gain> | IPolyModuleSerialize<ModuleType.Oscillator> | IPolyModuleSerialize<ModuleType.Envelope> | IPolyModuleSerialize<ModuleType.Filter> | IPolyModuleSerialize<ModuleType.BiquadFilter> | IModuleSerialize<ModuleType.Master> | IModuleSerialize<ModuleType.MidiSelector> | IModuleSerialize<ModuleType.Inspector> | IModuleSerialize<ModuleType.Constant> | IModuleSerialize<ModuleType.VirtualMidi> | IModuleSerialize<ModuleType.StepSequencer>;
688
- updateModule<T extends ModuleType>(params: IUpdateModule<T>): IModuleSerialize<ModuleType.Scale> | IPolyModuleSerialize<ModuleType.VoiceScheduler> | IPolyModuleSerialize<ModuleType.Gain> | IPolyModuleSerialize<ModuleType.Oscillator> | IPolyModuleSerialize<ModuleType.Envelope> | IPolyModuleSerialize<ModuleType.Filter> | IPolyModuleSerialize<ModuleType.BiquadFilter> | IModuleSerialize<ModuleType.Master> | IModuleSerialize<ModuleType.MidiSelector> | IModuleSerialize<ModuleType.Inspector> | IModuleSerialize<ModuleType.Constant> | IModuleSerialize<ModuleType.VirtualMidi> | IModuleSerialize<ModuleType.StepSequencer>;
823
+ addModule<T extends ModuleType>(params: ICreateModule<T>): IModuleSerialize<ModuleType.Scale> | IPolyModuleSerialize<ModuleType.VoiceScheduler> | IPolyModuleSerialize<ModuleType.Envelope> | IPolyModuleSerialize<ModuleType.Gain> | IPolyModuleSerialize<ModuleType.Oscillator> | IPolyModuleSerialize<ModuleType.Filter> | IPolyModuleSerialize<ModuleType.StereoPanner> | IModuleSerialize<ModuleType.Constant> | IModuleSerialize<ModuleType.Master> | IModuleSerialize<ModuleType.MidiSelector> | IModuleSerialize<ModuleType.Inspector> | IModuleSerialize<ModuleType.MidiMapper> | IModuleSerialize<ModuleType.VirtualMidi> | IModuleSerialize<ModuleType.StepSequencer>;
824
+ updateModule<T extends ModuleType>(params: IUpdateModule<T>): IModuleSerialize<ModuleType.Scale> | IPolyModuleSerialize<ModuleType.VoiceScheduler> | IPolyModuleSerialize<ModuleType.Envelope> | IPolyModuleSerialize<ModuleType.Gain> | IPolyModuleSerialize<ModuleType.Oscillator> | IPolyModuleSerialize<ModuleType.Filter> | IPolyModuleSerialize<ModuleType.StereoPanner> | IModuleSerialize<ModuleType.Constant> | IModuleSerialize<ModuleType.Master> | IModuleSerialize<ModuleType.MidiSelector> | IModuleSerialize<ModuleType.Inspector> | IModuleSerialize<ModuleType.MidiMapper> | IModuleSerialize<ModuleType.VirtualMidi> | IModuleSerialize<ModuleType.StepSequencer>;
689
825
  removeModule(id: string): void;
690
826
  addRoute(props: ICreateRoute): IRoute;
691
827
  removeRoute(id: string): void;
@@ -702,11 +838,11 @@ declare class Engine {
702
838
  findModule(id: string): ModuleTypeToModuleMapping[keyof ModuleTypeToModuleMapping];
703
839
  findIO(moduleId: string, ioName: string, type: "input" | "output"): Base;
704
840
  findMidiDevice(id: string): MidiDevice | ComputerKeyboardInput | undefined;
705
- onPropsUpdate(callback: <T extends ModuleType>(params: IModule<T>) => void): void;
706
- _triggerPropsUpdate<T extends ModuleType>(params: IModule<T>): void;
841
+ onPropsUpdate(callback: <T extends ModuleType>(params: IModule<T> | IPolyModule<T>) => void): void;
842
+ _triggerPropsUpdate<T extends ModuleType>(params: IModule<T> | IPolyModule<T>): void;
707
843
  triggerVirtualMidi(id: string, noteName: string, type: "noteOn" | "noteOff"): void;
708
844
  private onStart;
709
845
  private onStop;
710
846
  }
711
847
 
712
- export { type ArrayProp, type BooleanProp, Engine, type EnumProp, type ICreateModule, type ICreateRoute, type IGain, type IIOSerialize, type IMaster, type IMidiDevice, type IModule, type IModuleSerialize, type INote, type IOscillator, type IPolyModuleSerialize, type IRoute, type ISequence, type IStepSequencer, type IStepSequencerProps, type IUpdateModule, MidiDevice, MidiPortState, type ModuleParams, ModuleType, type ModuleTypeToPropsMapping, Note, type NumberProp, OscillatorWave, type PropDefinition, type PropSchema, type StringProp, moduleSchemas };
848
+ export { type ArrayProp, type BooleanProp, Engine, type EnumProp, type ICreateModule, type ICreateRoute, type IGain, type IIOSerialize, type IMaster, type IMidiDevice, type IMidiMapper, type IMidiMapperProps, type IModule, type IModuleSerialize, type INote, type IOscillator, type IPolyModuleSerialize, type IRoute, type ISequence, type IStepSequencer, type IStepSequencerProps, type IUpdateModule, MidiDevice, type MidiMapping, MidiMappingMode, MidiPortState, type ModuleParams, type ModulePropSchema, ModuleType, type ModuleTypeToPropsMapping, Note, type NumberProp, OscillatorWave, type PropSchema, type StringProp, moduleSchemas };