@fluex/fluexgl-dsp 0.4.1 → 0.4.3

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.
Files changed (85) hide show
  1. package/README.md +16 -38
  2. package/lib/dist/console-codes.d.ts +22 -7
  3. package/lib/dist/console-codes.d.ts.map +1 -1
  4. package/lib/dist/console-codes.js +22 -7
  5. package/lib/dist/core/classes/AudioClip.d.ts +3 -1
  6. package/lib/dist/core/classes/AudioClip.d.ts.map +1 -1
  7. package/lib/dist/core/classes/AudioClip.js +23 -17
  8. package/lib/dist/core/classes/AudioClipPlayer.d.ts +10 -2
  9. package/lib/dist/core/classes/AudioClipPlayer.d.ts.map +1 -1
  10. package/lib/dist/core/classes/AudioClipPlayer.js +56 -2
  11. package/lib/dist/core/classes/AudioDevice.d.ts +2 -0
  12. package/lib/dist/core/classes/AudioDevice.d.ts.map +1 -1
  13. package/lib/dist/core/classes/AudioDevice.js +5 -0
  14. package/lib/dist/core/classes/Channel.d.ts +14 -4
  15. package/lib/dist/core/classes/Channel.d.ts.map +1 -1
  16. package/lib/dist/core/classes/Channel.js +93 -7
  17. package/lib/dist/core/classes/DpsPipeline.d.ts +1 -1
  18. package/lib/dist/core/classes/DpsPipeline.d.ts.map +1 -1
  19. package/lib/dist/core/classes/DpsPipeline.js +7 -3
  20. package/lib/dist/core/classes/Effector.d.ts +2 -2
  21. package/lib/dist/core/classes/Effector.d.ts.map +1 -1
  22. package/lib/dist/core/classes/Effector.js +1 -1
  23. package/lib/dist/core/classes/Master.d.ts +12 -0
  24. package/lib/dist/core/classes/Master.d.ts.map +1 -1
  25. package/lib/dist/core/classes/Master.js +80 -9
  26. package/lib/dist/effects/classes/Analyser.d.ts +16 -0
  27. package/lib/dist/effects/classes/Analyser.d.ts.map +1 -0
  28. package/lib/dist/effects/classes/Analyser.js +62 -0
  29. package/lib/dist/effects/classes/Chorus.d.ts +4 -3
  30. package/lib/dist/effects/classes/Chorus.d.ts.map +1 -1
  31. package/lib/dist/effects/classes/Chorus.js +21 -12
  32. package/lib/dist/effects/classes/clips/HardClip.d.ts +4 -3
  33. package/lib/dist/effects/classes/clips/HardClip.d.ts.map +1 -1
  34. package/lib/dist/effects/classes/clips/HardClip.js +15 -9
  35. package/lib/dist/effects/classes/clips/SoftClip.d.ts +4 -3
  36. package/lib/dist/effects/classes/clips/SoftClip.d.ts.map +1 -1
  37. package/lib/dist/effects/classes/clips/SoftClip.js +15 -9
  38. package/lib/dist/effects/classes/filters/LowPassFilter.d.ts +4 -3
  39. package/lib/dist/effects/classes/filters/LowPassFilter.d.ts.map +1 -1
  40. package/lib/dist/effects/classes/filters/LowPassFilter.js +23 -14
  41. package/lib/dist/effects/exports.d.ts +1 -0
  42. package/lib/dist/effects/exports.d.ts.map +1 -1
  43. package/lib/dist/effects/exports.js +1 -0
  44. package/lib/dist/index.d.ts +5 -4
  45. package/lib/dist/index.d.ts.map +1 -1
  46. package/lib/dist/index.js +13 -18
  47. package/lib/dist/typings.d.ts +13 -11
  48. package/lib/dist/typings.d.ts.map +1 -1
  49. package/lib/dist/typings.js +5 -0
  50. package/lib/dist/utilities/debugger.js +6 -6
  51. package/lib/dist/utilities/helpers.d.ts +2 -0
  52. package/lib/dist/utilities/helpers.d.ts.map +1 -1
  53. package/lib/dist/utilities/helpers.js +35 -12
  54. package/lib/dist/utilities/web-assembly.d.ts.map +1 -1
  55. package/lib/dist/utilities/web-assembly.js +6 -0
  56. package/lib/src/console-codes.ts +22 -7
  57. package/lib/src/core/classes/AudioClip.ts +28 -19
  58. package/lib/src/core/classes/AudioClipPlayer.ts +77 -8
  59. package/lib/src/core/classes/AudioDevice.ts +6 -1
  60. package/lib/src/core/classes/Channel.ts +126 -13
  61. package/lib/src/core/classes/DpsPipeline.ts +7 -3
  62. package/lib/src/core/classes/Effector.ts +3 -2
  63. package/lib/src/core/classes/Master.ts +101 -13
  64. package/lib/src/effects/classes/Analyser.ts +84 -0
  65. package/lib/src/effects/classes/Chorus.ts +22 -13
  66. package/lib/src/effects/classes/clips/HardClip.ts +17 -10
  67. package/lib/src/effects/classes/clips/SoftClip.ts +17 -10
  68. package/lib/src/effects/classes/filters/LowPassFilter.ts +28 -15
  69. package/lib/src/effects/exports.ts +2 -1
  70. package/lib/src/index.ts +27 -29
  71. package/lib/src/typings.ts +14 -14
  72. package/lib/src/utilities/debugger.ts +6 -6
  73. package/lib/src/utilities/helpers.ts +39 -15
  74. package/lib/src/utilities/web-assembly.ts +8 -0
  75. package/package.json +1 -1
  76. package/lib/dist/effects/classes/Filter.d.ts +0 -3
  77. package/lib/dist/effects/classes/Filter.d.ts.map +0 -1
  78. package/lib/dist/effects/classes/Filter.js +0 -2
  79. package/lib/dist/effects/classes/SoftClip.d.ts +0 -10
  80. package/lib/dist/effects/classes/SoftClip.d.ts.map +0 -1
  81. package/lib/dist/effects/classes/SoftClip.js +0 -39
  82. package/lib/dist/test/linkable-channels.d.ts +0 -2
  83. package/lib/dist/test/linkable-channels.d.ts.map +0 -1
  84. package/lib/dist/test/linkable-channels.js +0 -16
  85. package/lib/src/core/functions/rebuild-effect-chain.ts +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"DpsPipeline.d.ts","sourceRoot":"","sources":["../../../src/core/classes/DpsPipeline.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AAEjE;;;GAGG;AACH,qBAAa,WAAW;IAEpB;;OAEG;IACI,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC;;OAEG;IACI,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C;;OAEG;IACI,EAAE,EAAE,MAAM,CAAQ;IAEzB;;OAEG;IACI,cAAc,EAAE,OAAO,CAAS;IAEvC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAuB;IAEtC;;;;;OAKG;gBACS,OAAO,EAAE,gCAAgC;IAKrD;;;;;OAKG;IACU,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;;;;;OAMG;IACU,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IA0CtD;;;;;;OAMG;IACU,+BAA+B;IA+BrC,6CAA6C;CAGvD"}
1
+ {"version":3,"file":"DpsPipeline.d.ts","sourceRoot":"","sources":["../../../src/core/classes/DpsPipeline.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AAGjE;;;GAGG;AACH,qBAAa,WAAW;IAEpB;;OAEG;IACI,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC;;OAEG;IACI,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C;;OAEG;IACI,EAAE,EAAE,MAAM,CAAQ;IAEzB;;OAEG;IACI,cAAc,EAAE,OAAO,CAAS;IAEvC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAuB;IAEtC;;;;;OAKG;gBACS,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,gCAAgC;IAQpF;;;;;OAKG;IACU,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;;;;;OAMG;IACU,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IA0CtD;;;;;;OAMG;IACU,+BAA+B;IA+BrC,6CAA6C;CAGvD"}
@@ -4,6 +4,7 @@ import { Debug } from "../../utilities/debugger";
4
4
  import { LoadWebAssemblyModule } from "../../utilities/web-assembly";
5
5
  import { ConstructProcessorWorklet, LoadWorkletOnAudioDevice } from "../../utilities/helpers";
6
6
  import { ErrorCodes, WarningCodes } from "../../console-codes";
7
+ import { DSP } from "../../index";
7
8
  /**
8
9
  * Represents the digital signal processing (DSP) pipeline responsible for initializing
9
10
  * WebAssembly modules, AudioWorklet processors, and resolving audio output devices.
@@ -35,9 +36,12 @@ export class DspPipeline {
35
36
  * @param options - Initialization options for the DSP pipeline.
36
37
  * Must include valid paths to the WebAssembly and AudioWorklet files.
37
38
  */
38
- constructor(options) {
39
- this.pathToWasm = options.pathToWasm;
40
- this.pathToWorklet = options.pathToWorklet;
39
+ constructor({ pathToWasm, pathToWorklet, options }) {
40
+ this.pathToWasm = pathToWasm;
41
+ this.pathToWorklet = pathToWorklet;
42
+ // @ts-ignore
43
+ for (const key in options)
44
+ DSP[key] = options[key];
41
45
  }
42
46
  /**
43
47
  * Initializes the DSP pipeline.
@@ -4,7 +4,7 @@ export declare abstract class Effector {
4
4
  label: string | null;
5
5
  name: string;
6
6
  audioWorkletNode: AudioWorkletNode | null;
7
- parentialContext: AudioContext | null;
7
+ context: AudioContext | null;
8
8
  private hasRegisteredMessageEventListener;
9
9
  private events;
10
10
  private handleIncomingMessages;
@@ -13,6 +13,6 @@ export declare abstract class Effector {
13
13
  Once<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): () => void;
14
14
  RemoveEventListener<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): Effector;
15
15
  ClearEventListeners(event?: keyof EffectorEventMap): Effector;
16
- abstract InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
16
+ abstract InitializeOnAttachment(context: AudioContext): Promise<void>;
17
17
  }
18
18
  //# sourceMappingURL=Effector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Effector.d.ts","sourceRoot":"","sources":["../../../src/core/classes/Effector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGhH,8BAAsB,QAAQ;IAEnB,EAAE,EAAE,MAAM,CAAQ;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,IAAI,EAAE,MAAM,CAAc;IAC1B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACjD,gBAAgB,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEpD,OAAO,CAAC,iCAAiC,CAAkB;IAE3D,OAAO,CAAC,MAAM,CAMb;IAED,OAAO,CAAC,sBAAsB;IAgB9B,SAAS,CAAC,4BAA4B,CAAC,IAAI,EAAE,gBAAgB;IAOtD,gBAAgB,CAAC,CAAC,SAAS,MAAM,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAOjG,IAAI,CAAC,CAAC,SAAS,MAAM,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAarF,mBAAmB,CAAC,CAAC,SAAS,MAAM,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ;IAalG,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,gBAAgB,GAAG,QAAQ;aAWpD,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CACxF"}
1
+ {"version":3,"file":"Effector.d.ts","sourceRoot":"","sources":["../../../src/core/classes/Effector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGhH,8BAAsB,QAAQ;IAEnB,EAAE,EAAE,MAAM,CAAQ;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,IAAI,EAAE,MAAM,CAAc;IAE1B,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACjD,OAAO,EAAE,YAAY,GAAG,IAAI,CAAQ;IAE3C,OAAO,CAAC,iCAAiC,CAAkB;IAE3D,OAAO,CAAC,MAAM,CAMb;IAED,OAAO,CAAC,sBAAsB;IAgB9B,SAAS,CAAC,4BAA4B,CAAC,IAAI,EAAE,gBAAgB;IAOtD,gBAAgB,CAAC,CAAC,SAAS,MAAM,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAOjG,IAAI,CAAC,CAAC,SAAS,MAAM,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAarF,mBAAmB,CAAC,CAAC,SAAS,MAAM,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ;IAalG,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,gBAAgB,GAAG,QAAQ;aAWpD,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAC/E"}
@@ -5,7 +5,7 @@ export class Effector {
5
5
  label = null;
6
6
  name = "Effector";
7
7
  audioWorkletNode = null;
8
- parentialContext = null;
8
+ context = null;
9
9
  hasRegisteredMessageEventListener = false;
10
10
  events = {
11
11
  "incoming-processor-error": [],
@@ -1,12 +1,24 @@
1
1
  import { Channel } from "./Channel";
2
+ import { Effector } from "./Effector";
3
+ import { AudioClipPlayer } from "./AudioClipPlayer";
4
+ import { AudioClip } from "./AudioClip";
2
5
  export declare class Master {
3
6
  id: string;
4
7
  channels: Channel[];
8
+ effects: Effector[];
9
+ input: GainNode | null;
5
10
  gainNode: GainNode | null;
6
11
  analyserNode: AnalyserNode | null;
7
12
  context: AudioContext | null;
13
+ audioClipPlayer: AudioClipPlayer | null;
8
14
  constructor(context: AudioContext);
15
+ private disconnectAudioNodes;
16
+ private rebuildEffectChain;
17
+ AttachEffect(effect: Effector): void;
18
+ DetachEffect(effect: Effector): void;
9
19
  AttachChannel(channel: Channel): void;
10
20
  DetachChannel(channel: Channel): void;
21
+ HasAudioClipPlayer(): boolean;
22
+ AttachAudioClip(audioClip: AudioClip): void;
11
23
  }
12
24
  //# sourceMappingURL=Master.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Master.d.ts","sourceRoot":"","sources":["../../../src/core/classes/Master.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,qBAAa,MAAM;IAER,EAAE,EAAE,MAAM,CAAQ;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAM;IAEzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACjC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEzC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAQ;gBAE/B,OAAO,EAAE,YAAY;IAW1B,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAcrC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAmB/C"}
1
+ {"version":3,"file":"Master.d.ts","sourceRoot":"","sources":["../../../src/core/classes/Master.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,qBAAa,MAAM;IAER,EAAE,EAAE,MAAM,CAAQ;IAElB,QAAQ,EAAE,OAAO,EAAE,CAAM;IACzB,OAAO,EAAE,QAAQ,EAAE,CAAM;IAEzB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAC9B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACjC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IACzC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAQ;IACpC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAQ;gBAE1C,OAAO,EAAE,YAAY;IAmBjC,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,kBAAkB;IAuBnB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;IAapC,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;IAkBpC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAcrC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAkBrC,kBAAkB,IAAI,OAAO;IAI7B,eAAe,CAAC,SAAS,EAAE,SAAS;CAM9C"}
@@ -1,41 +1,112 @@
1
1
  import { v4 } from "uuid";
2
2
  import { Debug } from "../../utilities/debugger";
3
+ import { AudioClipPlayer } from "./AudioClipPlayer";
4
+ import { ErrorCodes } from "lib/src/console-codes";
3
5
  export class Master {
4
6
  id = v4();
5
7
  channels = [];
8
+ effects = [];
9
+ input = null;
6
10
  gainNode = null;
7
11
  analyserNode = null;
8
12
  context = null;
13
+ audioClipPlayer = null;
9
14
  constructor(context) {
10
15
  this.context = context;
16
+ this.disconnectAudioNodes();
17
+ this.audioClipPlayer = new AudioClipPlayer(context);
18
+ this.input = new GainNode(context);
11
19
  this.gainNode = new GainNode(context);
12
20
  this.analyserNode = new AnalyserNode(context);
21
+ this.input.connect(this.gainNode);
13
22
  this.gainNode.connect(this.analyserNode);
14
23
  this.analyserNode.connect(this.context.destination);
24
+ this.audioClipPlayer.Send(this);
25
+ }
26
+ disconnectAudioNodes() {
27
+ if (this.input)
28
+ this.input.disconnect();
29
+ if (this.gainNode)
30
+ this.gainNode.disconnect();
31
+ if (this.analyserNode)
32
+ this.analyserNode.disconnect();
33
+ this.effects.forEach(function (effect) {
34
+ if (effect.audioWorkletNode)
35
+ effect.audioWorkletNode.disconnect();
36
+ });
37
+ }
38
+ rebuildEffectChain() {
39
+ if (!this.context)
40
+ return;
41
+ if (!this.input || !this.gainNode || !this.analyserNode)
42
+ return;
43
+ this.disconnectAudioNodes();
44
+ let currentNode = this.input;
45
+ this.effects.forEach(function (effect) {
46
+ if (!effect.audioWorkletNode)
47
+ return;
48
+ currentNode.connect(effect.audioWorkletNode);
49
+ currentNode = effect.audioWorkletNode;
50
+ });
51
+ currentNode.connect(this.gainNode);
52
+ this.gainNode.connect(this.analyserNode);
53
+ this.analyserNode.connect(this.context.destination);
54
+ }
55
+ AttachEffect(effect) {
56
+ if (this.effects.includes(effect))
57
+ return Debug.Error("Could not attach the effect because it is already part of this master channel.", [
58
+ "Call .DetachEffect([effect Effector]) before attaching the effect."
59
+ ], ErrorCodes.EFFECT_ALREADY_ATTACHED);
60
+ if (!this.context)
61
+ return this.rebuildEffectChain();
62
+ this.effects.push(effect);
63
+ effect.InitializeOnAttachment(this.context);
64
+ this.rebuildEffectChain();
65
+ }
66
+ DetachEffect(effect) {
67
+ if (!this.effects.includes(effect))
68
+ return Debug.Error("Could not detach the effect because it is not part of this master channel.", [
69
+ "Call .AttachEffect([effect Effector]) before detaching the effect."
70
+ ], ErrorCodes.EFFECT_NOT_FOUND);
71
+ const self = this;
72
+ this.effects.forEach(function (_effect, index) {
73
+ if (effect.id === _effect.id) {
74
+ self.effects.splice(index, 1);
75
+ return;
76
+ }
77
+ });
78
+ this.rebuildEffectChain();
15
79
  }
16
80
  AttachChannel(channel) {
17
81
  if (this.channels.includes(channel))
18
82
  return Debug.Error("Could not attach the channel because it is already part of this master channel.", [
19
83
  "Call .DetachChannel([channel Channel]) before attaching the channel."
20
- ]);
84
+ ], ErrorCodes.CHANNEL_ALREADY_ATTACHED);
21
85
  this.channels.push(channel);
22
- if (channel.output && this.gainNode)
23
- channel.output.connect(this.gainNode);
86
+ if (channel.output && this.input)
87
+ channel.output.connect(this.input);
24
88
  return;
25
89
  }
26
90
  DetachChannel(channel) {
27
91
  if (!this.channels.includes(channel))
28
92
  return Debug.Error("Could not detach the channel because it is not part of this master channel.", [
29
93
  "Call .AttachChannel([channel Channel]) before detaching the channel."
30
- ]);
31
- if (channel.output && this.gainNode)
32
- channel.output.disconnect(this.gainNode);
94
+ ], ErrorCodes.CHANNEL_NOT_FOUND);
95
+ if (channel.output && this.input)
96
+ channel.output.disconnect(this.input);
33
97
  const self = this;
34
98
  this.channels.forEach(function (_channel, index) {
35
- if (channel.id === _channel.id) {
36
- self.channels.splice(index, 1);
99
+ if (channel.id !== _channel.id)
37
100
  return;
38
- }
101
+ self.channels.splice(index, 1);
39
102
  });
40
103
  }
104
+ HasAudioClipPlayer() {
105
+ return !!this.audioClipPlayer;
106
+ }
107
+ AttachAudioClip(audioClip) {
108
+ if (!this.audioClipPlayer)
109
+ return Debug.Error("Cannot not link AudioClip to this channel because this channel's AudioClipPlayer is undefined.");
110
+ this.audioClipPlayer.AttachAudioClip(audioClip);
111
+ }
41
112
  }
@@ -0,0 +1,16 @@
1
+ import { Effector } from "../../core/exports";
2
+ export declare class Analyser extends Effector {
3
+ label: string | null;
4
+ name: string;
5
+ analyserNode: AnalyserNode | null;
6
+ float32ArrayBuffer: Float32Array<ArrayBuffer>;
7
+ uint8ArrayBuffer: Uint8Array<ArrayBuffer>;
8
+ private options;
9
+ constructor(options?: Partial<AnalyserOptions>);
10
+ InitializeOnAttachment(context: AudioContext): Promise<void>;
11
+ SetOptions(options: Partial<AnalyserOptions>): void;
12
+ GetWaveformFloatData(): Float32Array | null;
13
+ GetWaveformByteData(): Uint8Array | null;
14
+ private allocateBuffers;
15
+ }
16
+ //# sourceMappingURL=Analyser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Analyser.d.ts","sourceRoot":"","sources":["../../../src/effects/classes/Analyser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI9C,qBAAa,QAAS,SAAQ,QAAQ;IAE3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAc;IAClC,IAAI,EAAE,MAAM,CAAc;IAE1B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEzC,kBAAkB,4BAAsB;IACxC,gBAAgB,0BAAoB;IAE3C,OAAO,CAAC,OAAO,CAKb;gBAEU,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAMjC,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAwBnD,oBAAoB,IAAI,YAAY,GAAG,IAAI;IAQ3C,mBAAmB,IAAI,UAAU,GAAG,IAAI;IAQ/C,OAAO,CAAC,eAAe;CAO1B"}
@@ -0,0 +1,62 @@
1
+ import { Effector } from "../../core/exports";
2
+ export class Analyser extends Effector {
3
+ label = "Analyser";
4
+ name = "Analyser";
5
+ analyserNode = null;
6
+ float32ArrayBuffer = new Float32Array();
7
+ uint8ArrayBuffer = new Uint8Array();
8
+ options = {
9
+ fftSize: 32,
10
+ smoothingTimeConstant: 0.8,
11
+ minDecibels: -90,
12
+ maxDecibels: -10,
13
+ };
14
+ constructor(options) {
15
+ super();
16
+ if (options)
17
+ this.SetOptions(options);
18
+ }
19
+ async InitializeOnAttachment(context) {
20
+ this.context = context;
21
+ this.analyserNode = new AnalyserNode(context, this.options);
22
+ this.audioWorkletNode = this.analyserNode;
23
+ this.allocateBuffers();
24
+ }
25
+ SetOptions(options) {
26
+ Object.keys(options).forEach((key) => {
27
+ const value = options[key];
28
+ if (typeof value === "undefined")
29
+ return;
30
+ if (key === "fftSize" && value) {
31
+ const allowed = [32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768];
32
+ if (!allowed.includes(value))
33
+ return;
34
+ }
35
+ this.options[key] = value;
36
+ if (this.analyserNode) {
37
+ this.analyserNode[key] = value;
38
+ }
39
+ });
40
+ if (options.fftSize && this.analyserNode) {
41
+ this.allocateBuffers();
42
+ }
43
+ }
44
+ GetWaveformFloatData() {
45
+ if (!this.analyserNode)
46
+ return null;
47
+ this.analyserNode.getFloatTimeDomainData(this.float32ArrayBuffer);
48
+ return this.float32ArrayBuffer;
49
+ }
50
+ GetWaveformByteData() {
51
+ if (!this.analyserNode)
52
+ return null;
53
+ this.analyserNode.getByteTimeDomainData(this.uint8ArrayBuffer);
54
+ return this.uint8ArrayBuffer;
55
+ }
56
+ allocateBuffers() {
57
+ if (!this.analyserNode)
58
+ return;
59
+ this.float32ArrayBuffer = new Float32Array(this.analyserNode.fftSize);
60
+ this.uint8ArrayBuffer = new Uint8Array(this.analyserNode.fftSize);
61
+ }
62
+ }
@@ -1,5 +1,5 @@
1
1
  import { Effector } from "../../core/classes/Effector";
2
- import { ChorusEffectOptions } from "../../typings";
2
+ import { ChorusEffectOptions, StrictMode } from "../../typings";
3
3
  export declare class Chorus extends Effector {
4
4
  label: string | null;
5
5
  name: string;
@@ -8,8 +8,9 @@ export declare class Chorus extends Effector {
8
8
  rateHz: number;
9
9
  mix: number;
10
10
  feedback: number;
11
- constructor({ baseDelayMs, depthMs, rateHz, mix, feedback }: Partial<ChorusEffectOptions>);
12
- InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
11
+ strictMode: StrictMode;
12
+ constructor({ baseDelayMs, depthMs, rateHz, mix, feedback, strictMode }: Partial<ChorusEffectOptions>);
13
+ InitializeOnAttachment(context: AudioContext): Promise<void>;
13
14
  ReturnOptionsAsObject(): ChorusEffectOptions;
14
15
  SetBaseDelayMs(value: number): boolean;
15
16
  SetDepthMs(value: number): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Chorus.d.ts","sourceRoot":"","sources":["../../../src/effects/classes/Chorus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAsD,MAAM,eAAe,CAAC;AAExG,qBAAa,MAAO,SAAQ,QAAQ;IAEzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAY;IAChC,IAAI,EAAE,MAAM,CAAY;IAExB,WAAW,EAAE,MAAM,CAAM;IACzB,OAAO,EAAE,MAAM,CAAK;IACpB,MAAM,EAAE,MAAM,CAAO;IACrB,GAAG,EAAE,MAAM,CAAO;IAClB,QAAQ,EAAE,MAAM,CAAO;gBAElB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAU5E,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E,qBAAqB,IAAI,mBAAmB;IAU5C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKtC,UAAU,CAAC,KAAK,EAAE,MAAM;IAKxB,SAAS,CAAC,KAAK,EAAE,MAAM;IAKvB,MAAM,CAAC,KAAK,EAAE,MAAM;IAKpB,WAAW,CAAC,KAAK,EAAE,MAAM;CAInC"}
1
+ {"version":3,"file":"Chorus.d.ts","sourceRoot":"","sources":["../../../src/effects/classes/Chorus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAsD,UAAU,EAAE,MAAM,eAAe,CAAC;AAEpH,qBAAa,MAAO,SAAQ,QAAQ;IAEzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAY;IAChC,IAAI,EAAE,MAAM,CAAY;IAExB,WAAW,EAAE,MAAM,CAAM;IACzB,OAAO,EAAE,MAAM,CAAK;IACpB,MAAM,EAAE,MAAM,CAAO;IACrB,GAAG,EAAE,MAAM,CAAO;IAClB,QAAQ,EAAE,MAAM,CAAO;IACvB,UAAU,EAAE,UAAU,CAAuB;gBAExC,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAaxF,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,qBAAqB,IAAI,mBAAmB;IAW5C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMtC,UAAU,CAAC,KAAK,EAAE,MAAM;IAMxB,SAAS,CAAC,KAAK,EAAE,MAAM;IAMvB,MAAM,CAAC,KAAK,EAAE,MAAM;IAMpB,WAAW,CAAC,KAAK,EAAE,MAAM;CAKnC"}
@@ -1,6 +1,6 @@
1
- import { SendMessageToWorklet, CreateAudioWorkletNode } from "../../utilities/helpers";
1
+ import { CoerceFiniteNumber, SendMessageToWorklet, CreateAudioWorkletNode } from "../../utilities/helpers";
2
2
  import { Effector } from "../../core/classes/Effector";
3
- import { ChorusMessageCommandId, AudioWorkletProcessorNames } from "../../typings";
3
+ import { ChorusMessageCommandId, AudioWorkletProcessorNames, StrictMode } from "../../typings";
4
4
  export class Chorus extends Effector {
5
5
  label = "Chorus";
6
6
  name = "Chorus";
@@ -9,17 +9,20 @@ export class Chorus extends Effector {
9
9
  rateHz = 1.5;
10
10
  mix = 0.5;
11
11
  feedback = 0.2;
12
- constructor({ baseDelayMs, depthMs, rateHz, mix, feedback }) {
12
+ strictMode = StrictMode.Disabled;
13
+ constructor({ baseDelayMs, depthMs, rateHz, mix, feedback, strictMode }) {
13
14
  super();
14
- this.baseDelayMs = baseDelayMs ?? this.baseDelayMs;
15
- this.depthMs = depthMs ?? this.depthMs;
16
- this.rateHz = rateHz ?? this.rateHz;
17
- this.mix = mix ?? this.mix;
18
- this.feedback = feedback ?? this.feedback;
19
- }
20
- async InitializeOnAttachment(parentialContext) {
21
- this.parentialContext = parentialContext;
22
- this.audioWorkletNode = CreateAudioWorkletNode(parentialContext, AudioWorkletProcessorNames.Chorus, this.ReturnOptionsAsObject());
15
+ this.baseDelayMs = Math.max(0, CoerceFiniteNumber(baseDelayMs, this.baseDelayMs));
16
+ this.depthMs = Math.max(0, CoerceFiniteNumber(depthMs, this.depthMs));
17
+ this.rateHz = Math.max(0, CoerceFiniteNumber(rateHz, this.rateHz));
18
+ this.mix = Math.max(0, Math.min(1, CoerceFiniteNumber(mix, this.mix)));
19
+ this.feedback = Math.max(0, Math.min(1, CoerceFiniteNumber(feedback, this.feedback)));
20
+ const mode = CoerceFiniteNumber(strictMode, this.strictMode);
21
+ this.strictMode = mode === StrictMode.Enabled ? StrictMode.Enabled : StrictMode.Disabled;
22
+ }
23
+ async InitializeOnAttachment(context) {
24
+ this.context = context;
25
+ this.audioWorkletNode = CreateAudioWorkletNode(context, AudioWorkletProcessorNames.Chorus, this.ReturnOptionsAsObject());
23
26
  }
24
27
  ReturnOptionsAsObject() {
25
28
  return {
@@ -28,25 +31,31 @@ export class Chorus extends Effector {
28
31
  rateHz: this.rateHz,
29
32
  mix: this.mix,
30
33
  feedback: this.feedback,
34
+ strictMode: this.strictMode
31
35
  };
32
36
  }
33
37
  SetBaseDelayMs(value) {
38
+ value = Math.max(0, CoerceFiniteNumber(value, this.baseDelayMs));
34
39
  this.baseDelayMs = value;
35
40
  return SendMessageToWorklet(this.audioWorkletNode, ChorusMessageCommandId.SetBaseDelayMs, value);
36
41
  }
37
42
  SetDepthMs(value) {
43
+ value = Math.max(0, CoerceFiniteNumber(value, this.depthMs));
38
44
  this.depthMs = value;
39
45
  return SendMessageToWorklet(this.audioWorkletNode, ChorusMessageCommandId.SetDepthMs, value);
40
46
  }
41
47
  SetRateHz(value) {
48
+ value = Math.max(0, CoerceFiniteNumber(value, this.rateHz));
42
49
  this.rateHz = value;
43
50
  return SendMessageToWorklet(this.audioWorkletNode, ChorusMessageCommandId.SetRateHz, value);
44
51
  }
45
52
  SetMix(value) {
53
+ value = Math.max(0, Math.min(1, CoerceFiniteNumber(value, this.mix)));
46
54
  this.mix = value;
47
55
  return SendMessageToWorklet(this.audioWorkletNode, ChorusMessageCommandId.SetMix, value);
48
56
  }
49
57
  SetFeedback(value) {
58
+ value = Math.max(0, Math.min(1, CoerceFiniteNumber(value, this.feedback)));
50
59
  this.feedback = value;
51
60
  return SendMessageToWorklet(this.audioWorkletNode, ChorusMessageCommandId.SetFeedback, value);
52
61
  }
@@ -1,12 +1,13 @@
1
1
  import { Effector } from "../../../core/classes/Effector";
2
- import { HardClipOptions } from "../../../typings";
2
+ import { HardClipOptions, StrictMode } from "../../../typings";
3
3
  export declare class HardClip extends Effector {
4
4
  label: string | null;
5
5
  name: string;
6
6
  drive: number;
7
7
  gain: number;
8
- constructor({ drive, gain }: Partial<HardClipOptions>);
9
- InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
8
+ strictMode: StrictMode;
9
+ constructor({ drive, gain, strictMode }: Partial<HardClipOptions>);
10
+ InitializeOnAttachment(context: AudioContext): Promise<void>;
10
11
  ReturnOptionsAsObject(): HardClipOptions;
11
12
  SetDrive(drive: number): boolean;
12
13
  SetGain(gain: number): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"HardClip.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/clips/HardClip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE1D,OAAO,EAAwD,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEzG,qBAAa,QAAS,SAAQ,QAAQ;IAE3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAc;IAClC,IAAI,EAAE,MAAM,CAAc;IAE1B,KAAK,EAAE,MAAM,CAAK;IAClB,IAAI,EAAE,MAAM,CAAK;gBAEZ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,eAAe,CAAC;IAOxC,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3E,qBAAqB,IAAI,eAAe;IAOvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKjC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAIxC"}
1
+ {"version":3,"file":"HardClip.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/clips/HardClip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAE1D,OAAO,EAAwD,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAErH,qBAAa,QAAS,SAAQ,QAAQ;IAE3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAc;IAClC,IAAI,EAAE,MAAM,CAAc;IAE1B,KAAK,EAAE,MAAM,CAAK;IAClB,IAAI,EAAE,MAAM,CAAK;IACjB,UAAU,EAAE,UAAU,CAAuB;gBAExC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,eAAe,CAAC;IAUpD,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,qBAAqB,IAAI,eAAe;IAQvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMjC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAKxC"}
@@ -1,31 +1,37 @@
1
1
  import { Effector } from "../../../core/classes/Effector";
2
- import { CreateAudioWorkletNode, SendMessageToWorklet } from "../../../utilities/helpers";
3
- import { HardClipMessageCommandId, AudioWorkletProcessorNames } from "../../../typings";
2
+ import { CoerceFiniteNumber, CreateAudioWorkletNode, SendMessageToWorklet } from "../../../utilities/helpers";
3
+ import { HardClipMessageCommandId, AudioWorkletProcessorNames, StrictMode } from "../../../typings";
4
4
  export class HardClip extends Effector {
5
5
  label = "HardClip";
6
6
  name = "HardClip";
7
7
  drive = 1;
8
8
  gain = 1;
9
- constructor({ drive, gain }) {
9
+ strictMode = StrictMode.Disabled;
10
+ constructor({ drive, gain, strictMode }) {
10
11
  super();
11
- this.drive = drive ?? this.drive;
12
- this.gain = gain ?? this.gain;
12
+ this.drive = Math.max(0, CoerceFiniteNumber(drive, this.drive));
13
+ this.gain = Math.max(0, CoerceFiniteNumber(gain, this.gain));
14
+ const mode = CoerceFiniteNumber(strictMode, this.strictMode);
15
+ this.strictMode = mode === StrictMode.Enabled ? StrictMode.Enabled : StrictMode.Disabled;
13
16
  }
14
- async InitializeOnAttachment(parentialContext) {
15
- this.parentialContext = parentialContext;
16
- this.audioWorkletNode = CreateAudioWorkletNode(parentialContext, AudioWorkletProcessorNames.HardClip, this.ReturnOptionsAsObject());
17
+ async InitializeOnAttachment(context) {
18
+ this.context = context;
19
+ this.audioWorkletNode = CreateAudioWorkletNode(context, AudioWorkletProcessorNames.HardClip, this.ReturnOptionsAsObject());
17
20
  }
18
21
  ReturnOptionsAsObject() {
19
22
  return {
20
23
  drive: this.drive,
21
- gain: this.gain
24
+ gain: this.gain,
25
+ strictMode: this.strictMode
22
26
  };
23
27
  }
24
28
  SetDrive(drive) {
29
+ drive = Math.max(0, CoerceFiniteNumber(drive, this.drive));
25
30
  this.drive = drive;
26
31
  return SendMessageToWorklet(this.audioWorkletNode, HardClipMessageCommandId.SetDrive, drive);
27
32
  }
28
33
  SetGain(gain) {
34
+ gain = Math.max(0, CoerceFiniteNumber(gain, this.gain));
29
35
  this.gain = gain;
30
36
  return SendMessageToWorklet(this.audioWorkletNode, HardClipMessageCommandId.SetGain, gain);
31
37
  }
@@ -1,12 +1,13 @@
1
1
  import { Effector } from "../../../core/classes/Effector";
2
- import { SoftClipOptions } from "../../../typings";
2
+ import { SoftClipOptions, StrictMode } from "../../../typings";
3
3
  export declare class SoftClip extends Effector {
4
4
  label: string | null;
5
5
  name: string;
6
6
  drive: number;
7
7
  gain: number;
8
- constructor({ drive, gain }: Partial<SoftClipOptions>);
9
- InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
8
+ strictMode: StrictMode;
9
+ constructor({ drive, gain, strictMode }: Partial<SoftClipOptions>);
10
+ InitializeOnAttachment(context: AudioContext): Promise<void>;
10
11
  ReturnOptionsAsObject(): SoftClipOptions;
11
12
  SetDrive(drive: number): boolean;
12
13
  SetGain(gain: number): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"SoftClip.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/clips/SoftClip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAwD,MAAM,kBAAkB,CAAC;AAEzG,qBAAa,QAAS,SAAQ,QAAQ;IAE3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAc;IAClC,IAAI,EAAE,MAAM,CAAc;IAE1B,KAAK,EAAE,MAAM,CAAK;IAClB,IAAI,EAAE,MAAM,CAAK;gBAEZ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,eAAe,CAAC;IAOxC,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3E,qBAAqB,IAAI,eAAe;IAOxC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKhC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAIxC"}
1
+ {"version":3,"file":"SoftClip.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/clips/SoftClip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAwD,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAErH,qBAAa,QAAS,SAAQ,QAAQ;IAE3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAc;IAClC,IAAI,EAAE,MAAM,CAAc;IAE1B,KAAK,EAAE,MAAM,CAAK;IAClB,IAAI,EAAE,MAAM,CAAK;IACjB,UAAU,EAAE,UAAU,CAAuB;gBAExC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,eAAe,CAAC;IAUpD,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,qBAAqB,IAAI,eAAe;IAQxC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMhC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAKxC"}
@@ -1,31 +1,37 @@
1
- import { CreateAudioWorkletNode, SendMessageToWorklet } from "../../../utilities/helpers";
1
+ import { CoerceFiniteNumber, CreateAudioWorkletNode, SendMessageToWorklet } from "../../../utilities/helpers";
2
2
  import { Effector } from "../../../core/classes/Effector";
3
- import { AudioWorkletProcessorNames, SoftClipMessageCommandId } from "../../../typings";
3
+ import { AudioWorkletProcessorNames, SoftClipMessageCommandId, StrictMode } from "../../../typings";
4
4
  export class SoftClip extends Effector {
5
5
  label = "SoftClip";
6
6
  name = "SoftClip";
7
7
  drive = 1;
8
8
  gain = 1;
9
- constructor({ drive, gain }) {
9
+ strictMode = StrictMode.Disabled;
10
+ constructor({ drive, gain, strictMode }) {
10
11
  super();
11
- this.drive = drive ?? this.drive;
12
- this.gain = gain ?? this.gain;
12
+ this.drive = Math.max(0, CoerceFiniteNumber(drive, this.drive));
13
+ this.gain = Math.max(0, CoerceFiniteNumber(gain, this.gain));
14
+ const mode = CoerceFiniteNumber(strictMode, this.strictMode);
15
+ this.strictMode = mode === StrictMode.Enabled ? StrictMode.Enabled : StrictMode.Disabled;
13
16
  }
14
- async InitializeOnAttachment(parentialContext) {
15
- this.parentialContext = parentialContext;
16
- this.audioWorkletNode = CreateAudioWorkletNode(parentialContext, AudioWorkletProcessorNames.SoftClip, this.ReturnOptionsAsObject());
17
+ async InitializeOnAttachment(context) {
18
+ this.context = context;
19
+ this.audioWorkletNode = CreateAudioWorkletNode(context, AudioWorkletProcessorNames.SoftClip, this.ReturnOptionsAsObject());
17
20
  }
18
21
  ReturnOptionsAsObject() {
19
22
  return {
20
23
  drive: this.drive,
21
- gain: this.gain
24
+ gain: this.gain,
25
+ strictMode: this.strictMode
22
26
  };
23
27
  }
24
28
  SetDrive(drive) {
29
+ drive = Math.max(0, CoerceFiniteNumber(drive, this.drive));
25
30
  this.drive = drive;
26
31
  return SendMessageToWorklet(this.audioWorkletNode, SoftClipMessageCommandId.SetDrive, drive);
27
32
  }
28
33
  SetGain(gain) {
34
+ gain = Math.max(0, CoerceFiniteNumber(gain, this.gain));
29
35
  this.gain = gain;
30
36
  return SendMessageToWorklet(this.audioWorkletNode, SoftClipMessageCommandId.SetGain, gain);
31
37
  }
@@ -1,13 +1,14 @@
1
1
  import { Effector } from "../../../core/classes/Effector";
2
- import { LowPassFilterOptions } from "../../../typings";
2
+ import { LowPassFilterOptions, StrictMode } from "../../../typings";
3
3
  export declare class LowPassFilter extends Effector {
4
4
  name: string;
5
5
  label: string | null;
6
6
  cutoff: number;
7
7
  q: number;
8
8
  minFrequency: number;
9
- constructor({ cutoff, minFrequency, q }: Partial<LowPassFilterOptions>);
10
- InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
9
+ strictMode: StrictMode;
10
+ constructor({ cutoff, minFrequency, q, strictMode }: Partial<LowPassFilterOptions>);
11
+ InitializeOnAttachment(context: AudioContext): Promise<void>;
11
12
  ReturnOptionsAsObject(): LowPassFilterOptions;
12
13
  SetCutoff(cutoff?: number): boolean;
13
14
  SetMinFrequency(minFrequency?: number): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"LowPassFilter.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/filters/LowPassFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAI1D,OAAO,EAAE,oBAAoB,EAA6D,MAAM,kBAAkB,CAAC;AAEnH,qBAAa,aAAc,SAAQ,QAAQ;IAEhC,IAAI,EAAE,MAAM,CAAmB;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAmB;IAEvC,MAAM,EAAE,MAAM,CAAQ;IACtB,CAAC,EAAE,MAAM,CAAO;IAChB,YAAY,EAAE,MAAM,CAAM;gBAErB,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAQzD,sBAAsB,CAAC,gBAAgB,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3E,qBAAqB,IAAI,oBAAoB;IAQ7C,SAAS,CAAC,MAAM,GAAE,MAAa,GAAG,OAAO;IAWzC,eAAe,CAAC,YAAY,GAAE,MAAW,GAAG,OAAO;IASnD,IAAI,CAAC,CAAC,GAAE,MAAY,GAAG,OAAO;CAQxC"}
1
+ {"version":3,"file":"LowPassFilter.d.ts","sourceRoot":"","sources":["../../../../src/effects/classes/filters/LowPassFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAI1D,OAAO,EAAE,oBAAoB,EAA6D,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/H,qBAAa,aAAc,SAAQ,QAAQ;IAEhC,IAAI,EAAE,MAAM,CAAmB;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAmB;IAEvC,MAAM,EAAE,MAAM,CAAQ;IACtB,CAAC,EAAE,MAAM,CAAO;IAChB,YAAY,EAAE,MAAM,CAAM;IAC1B,UAAU,EAAE,UAAU,CAAuB;gBAExC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAWrE,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,qBAAqB,IAAI,oBAAoB;IAS7C,SAAS,CAAC,MAAM,GAAE,MAAa,GAAG,OAAO;IAczC,eAAe,CAAC,YAAY,GAAE,MAAW,GAAG,OAAO;IAWnD,IAAI,CAAC,CAAC,GAAE,MAAY,GAAG,OAAO;CAWxC"}