@blibliki/engine 0.3.5 → 0.3.7

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
@@ -38,7 +38,7 @@ declare class Note implements INote {
38
38
  declare enum MidiEventType {
39
39
  noteOn = "noteon",
40
40
  noteOff = "noteoff",
41
- cc = "cc"
41
+ cc = "controlchange"
42
42
  }
43
43
  declare class MidiEvent {
44
44
  note?: Note;
@@ -50,6 +50,9 @@ declare class MidiEvent {
50
50
  constructor(message: Message, triggeredAt: ContextTime);
51
51
  get type(): MidiEventType;
52
52
  get isNote(): boolean;
53
+ get isCC(): boolean;
54
+ get cc(): number | undefined;
55
+ get ccValue(): number | undefined;
53
56
  defineNotes(): void;
54
57
  get rawMessage(): Message;
55
58
  clone(voiceNo?: number): MidiEvent;
@@ -170,6 +173,7 @@ declare abstract class PolyModule<T extends ModuleType> implements IPolyModule<T
170
173
  protected superInitialized: boolean;
171
174
  private _voices;
172
175
  private _name;
176
+ private pendingUIUpdates;
173
177
  constructor(engineId: string, params: IPolyModuleConstructor<T>);
174
178
  get name(): string;
175
179
  set name(value: string);
@@ -189,6 +193,8 @@ declare abstract class PolyModule<T extends ModuleType> implements IPolyModule<T
189
193
  protected unPlugAll(): void;
190
194
  dispose(): void;
191
195
  onMidiEvent: (midiEvent: MidiEvent) => void;
196
+ triggerPropsUpdate: () => void;
197
+ private sheduleTriggerUpdate;
192
198
  findVoice(voiceNo: number): Module<T>;
193
199
  protected registerDefaultIOs(value?: "both" | "in" | "out"): void;
194
200
  protected registerAudioInput(props: Omit<PolyAudioInputProps, "ioType">): PolyAudioInput;
@@ -268,6 +274,46 @@ type IModuleSerialize<T extends ModuleType> = IModule<T> & {
268
274
  type IModuleConstructor<T extends ModuleType> = Optional<IModule<T>, "id" | "voiceNo"> & {
269
275
  audioNodeConstructor?: (context: Context) => AudioNode;
270
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
+ };
271
317
  declare abstract class Module<T extends ModuleType> implements IModule<T> {
272
318
  id: string;
273
319
  engineId: string;
@@ -280,9 +326,11 @@ declare abstract class Module<T extends ModuleType> implements IModule<T> {
280
326
  protected _props: ModuleTypeToPropsMapping[T];
281
327
  protected superInitialized: boolean;
282
328
  protected activeNotes: Note[];
329
+ private pendingUIUpdates;
283
330
  constructor(engineId: string, params: IModuleConstructor<T>);
284
331
  get props(): ModuleTypeToPropsMapping[T];
285
332
  set props(value: Partial<ModuleTypeToPropsMapping[T]>);
333
+ private callPropHook;
286
334
  serialize(): IModuleSerialize<T>;
287
335
  plug({ audioModule, from, to, }: {
288
336
  audioModule: AnyModule;
@@ -295,8 +343,10 @@ declare abstract class Module<T extends ModuleType> implements IModule<T> {
295
343
  stop(_time: ContextTime): void;
296
344
  triggerAttack(note: Note, _triggeredAt: ContextTime): void;
297
345
  triggerRelease(note: Note, _triggeredAt: ContextTime): void;
346
+ handleCC(_event: MidiEvent, _triggeredAt: ContextTime): void;
298
347
  onMidiEvent: (midiEvent: MidiEvent) => void;
299
- protected triggerPropsUpdate(): void;
348
+ triggerPropsUpdate: () => void;
349
+ private sheduleTriggerUpdate;
300
350
  dispose(): void;
301
351
  protected registerDefaultIOs(value?: "both" | "in" | "out"): void;
302
352
  protected registerAudioInput(props: Omit<AudioInputProps, "ioType">): AudioInput;
@@ -353,6 +403,7 @@ type NumberProp = BasePropType & {
353
403
  min?: number;
354
404
  max?: number;
355
405
  step?: number;
406
+ exp?: number;
356
407
  };
357
408
  type EnumProp<T extends string | number> = BasePropType & {
358
409
  kind: "enum";
@@ -368,11 +419,70 @@ type BooleanProp = BasePropType & {
368
419
  type ArrayProp = BasePropType & {
369
420
  kind: "array";
370
421
  };
371
- 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;
372
- type PropSchema<T> = {
373
- [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]>;
374
451
  };
375
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
+
376
486
  type IVoiceSchedulerProps = EmptyObject;
377
487
  declare class Voice extends Module<ModuleType.VoiceScheduler> {
378
488
  audioNode: undefined;
@@ -391,25 +501,14 @@ declare class VoiceScheduler extends PolyModule<ModuleType.VoiceScheduler> {
391
501
  private registerOutputs;
392
502
  }
393
503
 
394
- type IBiquadFilterProps = {
395
- cutoff: number;
396
- envelopeAmount: number;
397
- type: BiquadFilterType;
398
- Q: number;
399
- };
400
- declare class BiquadFilter extends PolyModule<ModuleType.BiquadFilter> {
401
- constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.BiquadFilter>);
402
- private registerInputs;
403
- }
404
-
405
504
  type IConstantProps = {
406
505
  value: number;
407
506
  };
408
- declare class Constant extends Module<ModuleType.Constant> {
507
+ declare class Constant extends Module<ModuleType.Constant> implements Pick<SetterHooks<IConstantProps>, "onAfterSetValue"> {
409
508
  audioNode: ConstantSourceNode;
410
509
  isStated: boolean;
411
510
  constructor(engineId: string, params: ICreateModule<ModuleType.Constant>);
412
- protected onSetValue(value: IConstantProps["value"]): void;
511
+ onAfterSetValue: SetterHooks<IConstantProps>["onAfterSetValue"];
413
512
  start(time: ContextTime): void;
414
513
  stop(time: ContextTime): void;
415
514
  triggerAttack: (note: Note, triggeredAt: ContextTime) => void;
@@ -429,7 +528,8 @@ declare class Envelope extends PolyModule<ModuleType.Envelope> {
429
528
  type IFilterProps = {
430
529
  cutoff: number;
431
530
  envelopeAmount: number;
432
- resonance: number;
531
+ type: BiquadFilterType;
532
+ Q: number;
433
533
  };
434
534
  declare class Filter extends PolyModule<ModuleType.Filter> {
435
535
  constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.Filter>);
@@ -448,11 +548,11 @@ declare class Gain extends PolyModule<ModuleType.Gain> {
448
548
  type IInspectorProps = {
449
549
  fftSize: number;
450
550
  };
451
- declare class Inspector extends Module<ModuleType.Inspector> {
551
+ declare class Inspector extends Module<ModuleType.Inspector> implements Pick<SetterHooks<IInspectorProps>, "onAfterSetFftSize"> {
452
552
  audioNode: AnalyserNode;
453
553
  private _buffer?;
454
554
  constructor(engineId: string, params: ICreateModule<ModuleType.Inspector>);
455
- protected onSetFftSize(value: number): void;
555
+ onAfterSetFftSize: SetterHooks<IInspectorProps>["onAfterSetFftSize"];
456
556
  get buffer(): Float32Array<ArrayBuffer>;
457
557
  getValue(): number;
458
558
  getValues(): Float32Array;
@@ -465,68 +565,73 @@ declare class Master extends Module<ModuleType.Master> {
465
565
  constructor(engineId: string, params: ICreateModule<ModuleType.Master>);
466
566
  }
467
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
+
468
606
  type IMidiSelectorProps = {
469
607
  selectedId: string | undefined | null;
470
608
  };
471
- declare class MidiSelector extends Module<ModuleType.MidiSelector> {
609
+ declare class MidiSelector extends Module<ModuleType.MidiSelector> implements Pick<SetterHooks<IMidiSelectorProps>, "onSetSelectedId"> {
472
610
  audioNode: undefined;
473
611
  midiOutput: MidiOutput;
474
612
  _forwardMidiEvent?: (midiEvent: MidiEvent) => void;
475
613
  constructor(engineId: string, params: ICreateModule<ModuleType.MidiSelector>);
476
- protected onSetSelectedId(value: string | null): void;
614
+ onSetSelectedId: SetterHooks<IMidiSelectorProps>["onSetSelectedId"];
477
615
  private get forwardMidiEvent();
478
616
  private addEventListener;
479
617
  private removeEventListener;
480
618
  private registerOutputs;
481
619
  }
482
620
 
483
- type IOscillator = IModule<ModuleType.Oscillator>;
484
- declare enum OscillatorWave {
485
- sine = "sine",
486
- triangle = "triangle",
487
- square = "square",
488
- sawtooth = "sawtooth"
489
- }
490
- /**
491
- * Props for the Oscillator module.
492
- *
493
- * @property wave - Waveform shape of the oscillator.
494
- * One of: "sine", "square", "sawtooth", "triangle", or "custom".
495
- * @property frequency - Base frequency in Hz (e.g. 440 for A4).
496
- * @property fine - Fine tuning factor in the range [-1, 1], where ±1 represents ±1 semitone.
497
- * @property coarse - Coarse tuning factor in the range [-1, 1], scaled to ±12 semitones.
498
- * @property octave - Octave transposition value (e.g. +1 for one octave up, -2 for two octaves down).
499
- * @property lowGain - Whether to gain reduction (-18dB). When false, oscillator runs at full gain.
500
- */
501
- type IOscillatorProps = {
502
- wave: OscillatorWave;
503
- frequency: number;
504
- fine: number;
505
- coarse: number;
506
- octave: number;
507
- lowGain: boolean;
508
- };
509
- declare class Oscillator extends PolyModule<ModuleType.Oscillator> {
510
- constructor(engineId: string, params: IPolyModuleConstructor<ModuleType.Oscillator>);
511
- start(time: ContextTime): void;
512
- stop(time: ContextTime): void;
513
- private registerInputs;
514
- }
515
-
516
621
  type IScaleProps = {
517
622
  min: number;
518
623
  max: number;
519
624
  current: number;
520
625
  };
521
- declare class Scale extends Module<ModuleType.Scale> {
626
+ declare class Scale extends Module<ModuleType.Scale> implements Pick<SetterHooks<IScaleProps>, "onAfterSetMin" | "onAfterSetMax" | "onAfterSetCurrent"> {
522
627
  audioNode: AudioWorkletNode;
523
628
  constructor(engineId: string, params: ICreateModule<ModuleType.Scale>);
524
629
  get current(): AudioParam;
525
630
  get min(): AudioParam;
526
631
  get max(): AudioParam;
527
- protected onSetMin(value: number): void;
528
- protected onSetMax(value: number): void;
529
- protected onSetCurrent(value: number): void;
632
+ onAfterSetMin: SetterHooks<IScaleProps>["onAfterSetMin"];
633
+ onAfterSetMax: SetterHooks<IScaleProps>["onAfterSetMax"];
634
+ onAfterSetCurrent: SetterHooks<IScaleProps>["onAfterSetCurrent"];
530
635
  }
531
636
 
532
637
  type IStepSequencer = IModule<ModuleType.StepSequencer>;
@@ -546,6 +651,14 @@ declare class StepSequencer extends Module<ModuleType.StepSequencer> {
546
651
  constructor(engineId: string, params: ICreateModule<ModuleType.StepSequencer>);
547
652
  }
548
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
+
549
662
  type IVirtualMidiProps = {
550
663
  activeNotes: string[];
551
664
  };
@@ -567,10 +680,11 @@ declare enum ModuleType {
567
680
  MidiSelector = "MidiSelector",
568
681
  Envelope = "Envelope",
569
682
  Filter = "Filter",
570
- BiquadFilter = "BiquadFilter",
571
683
  Scale = "Scale",
684
+ StereoPanner = "StereoPanner",
572
685
  Inspector = "Inspector",
573
686
  Constant = "Constant",
687
+ MidiMapper = "MidiMapper",
574
688
  VirtualMidi = "VirtualMidi",
575
689
  StepSequencer = "StepSequencer",
576
690
  VoiceScheduler = "VoiceScheduler"
@@ -582,10 +696,11 @@ type ModuleTypeToPropsMapping = {
582
696
  [ModuleType.MidiSelector]: IMidiSelectorProps;
583
697
  [ModuleType.Envelope]: IEnvelopeProps;
584
698
  [ModuleType.Filter]: IFilterProps;
585
- [ModuleType.BiquadFilter]: IBiquadFilterProps;
586
699
  [ModuleType.Scale]: IScaleProps;
700
+ [ModuleType.StereoPanner]: IStereoPannerProps;
587
701
  [ModuleType.Inspector]: IInspectorProps;
588
702
  [ModuleType.Constant]: IConstantProps;
703
+ [ModuleType.MidiMapper]: IMidiMapperProps;
589
704
  [ModuleType.VirtualMidi]: IVirtualMidiProps;
590
705
  [ModuleType.StepSequencer]: IStepSequencerProps;
591
706
  [ModuleType.VoiceScheduler]: IVoiceSchedulerProps;
@@ -597,16 +712,36 @@ type ModuleTypeToModuleMapping = {
597
712
  [ModuleType.MidiSelector]: MidiSelector;
598
713
  [ModuleType.Envelope]: Envelope;
599
714
  [ModuleType.Filter]: Filter;
600
- [ModuleType.BiquadFilter]: BiquadFilter;
601
715
  [ModuleType.Scale]: Scale;
716
+ [ModuleType.StereoPanner]: StereoPanner;
602
717
  [ModuleType.Inspector]: Inspector;
603
718
  [ModuleType.Constant]: Constant;
719
+ [ModuleType.MidiMapper]: MidiMapper;
604
720
  [ModuleType.VirtualMidi]: VirtualMidi;
605
721
  [ModuleType.StepSequencer]: StepSequencer;
606
722
  [ModuleType.VoiceScheduler]: VoiceScheduler;
607
723
  };
608
724
  declare const moduleSchemas: {
609
- [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>;
610
745
  };
611
746
 
612
747
  type AnyModule = Module<ModuleType>;
@@ -617,7 +752,7 @@ type ICreateModule<T extends ModuleType> = {
617
752
  props: Partial<ModuleTypeToPropsMapping[T]>;
618
753
  };
619
754
  type ModuleParams = {
620
- [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>;
621
756
  }[ModuleType];
622
757
 
623
758
  type IOProps = {
@@ -685,8 +820,8 @@ declare class Engine {
685
820
  constructor(context: Context);
686
821
  get state(): _blibliki_transport.TransportState;
687
822
  initialize(): Promise<void>;
688
- 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>;
689
- 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>;
690
825
  removeModule(id: string): void;
691
826
  addRoute(props: ICreateRoute): IRoute;
692
827
  removeRoute(id: string): void;
@@ -703,11 +838,11 @@ declare class Engine {
703
838
  findModule(id: string): ModuleTypeToModuleMapping[keyof ModuleTypeToModuleMapping];
704
839
  findIO(moduleId: string, ioName: string, type: "input" | "output"): Base;
705
840
  findMidiDevice(id: string): MidiDevice | ComputerKeyboardInput | undefined;
706
- onPropsUpdate(callback: <T extends ModuleType>(params: IModule<T>) => void): void;
707
- _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;
708
843
  triggerVirtualMidi(id: string, noteName: string, type: "noteOn" | "noteOff"): void;
709
844
  private onStart;
710
845
  private onStop;
711
846
  }
712
847
 
713
- 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 };