@fluex/fluexgl-dsp 0.3.2 → 0.3.4

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.
@@ -1,9 +1,18 @@
1
+ import { EffectorEventMap } from "../../typings";
1
2
  export declare abstract class Effector {
2
3
  id: string;
3
4
  label: string | null;
4
5
  name: string;
5
6
  audioWorkletNode: AudioWorkletNode | null;
6
7
  parentialContext: AudioContext | null;
8
+ private hasRegisteredMessageEventListener;
9
+ private events;
10
+ private handleIncomingMessages;
11
+ protected registerMessageEventListener(node: AudioWorkletNode): void;
12
+ AddEventListener<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): () => void;
13
+ Once<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): () => void;
14
+ RemoveEventListener<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): Effector;
15
+ ClearEventListeners(event?: keyof EffectorEventMap): Effector;
7
16
  abstract InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
8
17
  }
9
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,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;aAEpC,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;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;IAkB9B,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,8 +1,68 @@
1
1
  import { v4 } from "uuid";
2
+ import { Debug } from "../../utilities/debugger";
2
3
  export class Effector {
3
4
  id = v4();
4
5
  label = null;
5
6
  name = "Effector";
6
7
  audioWorkletNode = null;
7
8
  parentialContext = null;
9
+ hasRegisteredMessageEventListener = false;
10
+ events = {
11
+ "incoming-processor-error": [],
12
+ "incoming-processor-message": [],
13
+ "incoming-processor-warning": [],
14
+ "processor-wasm-instantiated": [],
15
+ "initialized-on-channel-attachment": []
16
+ };
17
+ handleIncomingMessages(event) {
18
+ const messageData = event.data;
19
+ console.log(messageData);
20
+ switch (messageData.type) {
21
+ case "message":
22
+ return this.events["incoming-processor-message"].forEach(ev => ev(messageData));
23
+ case "error":
24
+ return this.events["incoming-processor-error"].forEach(ev => ev(messageData));
25
+ case "warning":
26
+ return this.events["incoming-processor-message"].forEach(ev => ev(messageData));
27
+ case "wasm-instantiated":
28
+ return this.events["processor-wasm-instantiated"].forEach(ev => ev(messageData));
29
+ }
30
+ }
31
+ registerMessageEventListener(node) {
32
+ if (this.hasRegisteredMessageEventListener)
33
+ return;
34
+ node.port.onmessage = this.handleIncomingMessages.bind(this);
35
+ Debug.Log(`Succesfully registered event listener on effector ${this.name} (${this.label}) [${this.id}]`);
36
+ }
37
+ AddEventListener(event, cb) {
38
+ this.events[event].push(cb);
39
+ return () => this.RemoveEventListener(event, cb);
40
+ }
41
+ Once(event, cb) {
42
+ const wrapper = ((...args) => {
43
+ // @ts-ignore
44
+ cb(...args);
45
+ this.RemoveEventListener(event, wrapper);
46
+ });
47
+ return this.AddEventListener(event, wrapper);
48
+ }
49
+ RemoveEventListener(event, cb) {
50
+ const arr = this.events[event];
51
+ for (let i = 0; i < arr.length; i++) {
52
+ if (arr[i] === cb) {
53
+ arr.splice(i, 1);
54
+ break;
55
+ }
56
+ }
57
+ return this;
58
+ }
59
+ ClearEventListeners(event) {
60
+ if (event) {
61
+ this.events[event].length = 0;
62
+ }
63
+ else {
64
+ Object.keys(this.events).forEach((k) => (this.events[k].length = 0));
65
+ }
66
+ return this;
67
+ }
8
68
  }
@@ -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;IAM3E,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,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"}
@@ -16,6 +16,7 @@ export class LowPassFilter extends Effector {
16
16
  async InitializeOnAttachment(parentialContext) {
17
17
  this.parentialContext = parentialContext;
18
18
  this.audioWorkletNode = CreateAudioWorkletNode(parentialContext, AudioWorkletProcessorNames.LowPassFilter, this.ReturnOptionsAsObject());
19
+ this.registerMessageEventListener(this.audioWorkletNode);
19
20
  }
20
21
  ReturnOptionsAsObject() {
21
22
  return {
@@ -9,5 +9,5 @@ export { AudioDevice, Channel, Effector, Master, AudioClip, DspPipeline } from "
9
9
  export { InitializeDspPipeline, ResolveAudioOutputDevices, ResolveAudioInputDevices, ResolveDefaultAudioInputDevice, ResolveDefaultAudioOutputDevice, LoadAudioSource, LoadAudioSourceFromBlob, LoadWorkletOnMasterChannel, SendMessageToWorklet } from "./utilities/helpers";
10
10
  export { SUPPORTED_FILE_TYPES } from "./utilities/constants";
11
11
  export { hasInitializedWasm, } from "./utilities/web-assembly";
12
- export type { FluexGLAudioDescriptor, FluexGLAudioDebuggerOptions, FluexGLAudioOptions, LoadAudioSourceOptions, AudioSourceData, ChannelOptions, ChannelSpatialization, AudioClipEventMap, AudioClipEvents, AudioClipOnProgressEvent, AudioClipAnalyserProperty, AudioClipAnalyserType, DspPipelineInitializationOptions, DspPipelineInitializationState, ChorusEffectOptions, LowPassFilterOptions, LowPassFilterMessageCommandId, ChorusMessageCommandId, AudioWorkletProcessorNames, SoftClipMessageCommandId, SoftClipOptions, HardClipMessageCommandId, HardClipOptions } from "./typings";
12
+ export type { FluexGLAudioDescriptor, FluexGLAudioDebuggerOptions, FluexGLAudioOptions, LoadAudioSourceOptions, AudioSourceData, ChannelOptions, ChannelSpatialization, AudioClipEventMap, AudioClipEvents, AudioClipOnProgressEvent, AudioClipAnalyserProperty, AudioClipAnalyserType, DspPipelineInitializationOptions, DspPipelineInitializationState, ChorusEffectOptions, LowPassFilterOptions, LowPassFilterMessageCommandId, ChorusMessageCommandId, AudioWorkletProcessorNames, SoftClipMessageCommandId, SoftClipOptions, HardClipMessageCommandId, HardClipOptions, EffectorEventMap, IncomingMessageType, IncomingProcessorMessage, ProcessorData, ProcessorIdentificationCodes, EffectorEvents } from "./typings";
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD,eAAO,MAAM,YAAY,EAAE,sBAkB1B,CAAA;AAED,OAAO,EACH,MAAM,EACN,UAAU,EACV,SAAS,EACT,OAAO,EACP,UAAU,EACV,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACH,WAAW,EACX,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,WAAW,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,EAC9B,+BAA+B,EAC/B,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,oBAAoB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,kBAAkB,GACrB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACR,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,EAC7B,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,wBAAwB,EACxB,eAAe,EAClB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD,eAAO,MAAM,YAAY,EAAE,sBAkB1B,CAAA;AAED,OAAO,EACH,MAAM,EACN,UAAU,EACV,SAAS,EACT,OAAO,EACP,UAAU,EACV,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,QAAQ,EACR,aAAa,EACb,QAAQ,EACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACH,WAAW,EACX,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,WAAW,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACH,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,EAC9B,+BAA+B,EAC/B,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,oBAAoB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,kBAAkB,GACrB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACR,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,EAC7B,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,4BAA4B,EAC5B,cAAc,EACjB,MAAM,WAAW,CAAC"}
@@ -1,9 +1,13 @@
1
1
  export type ChannelSpatialization = "mono" | "stereo" | "surround";
2
2
  export type AudioClipAnalyserType = "pre" | "post";
3
3
  export type AudioClipAnalyserProperty = "fftSize" | "minDecibels" | "maxDecibels" | "smoothingTimeConstant";
4
+ export type IncomingMessageType = "message" | "error" | "warning" | "wasm-instantiated";
4
5
  export type AudioClipEvents = {
5
6
  [K in keyof AudioClipEventMap]: AudioClipEventMap[K][];
6
7
  };
8
+ export type EffectorEvents = {
9
+ [K in keyof EffectorEventMap]: EffectorEventMap[K][];
10
+ };
7
11
  export declare enum LowPassFilterMessageCommandId {
8
12
  SetCutoff = 0,
9
13
  SetMinFrequency = 1,
@@ -42,6 +46,11 @@ export declare enum AudioWorkletProcessorNames {
42
46
  SoftClip = "SoftClipProcessor",
43
47
  HardClip = "HardClipProcessor"
44
48
  }
49
+ export declare enum ProcessorIdentificationCodes {
50
+ UnknownProcessorId = "UNKNOWN_PROCESSOR_ID",
51
+ UnknownProcessorName = "UNKNOWN_PROCESSOR_NAME",
52
+ UnknownProcessorCreationDate = "UNKNOWN_PROCESSOR_CREATION_DATE"
53
+ }
45
54
  export interface FluexGLAudioDebuggerOptions {
46
55
  breakOnError: boolean;
47
56
  showInfo: boolean;
@@ -115,4 +124,24 @@ export interface HardClipOptions {
115
124
  drive: number;
116
125
  gain: number;
117
126
  }
127
+ export interface EffectorEventMap {
128
+ "incoming-processor-message": (message: IncomingProcessorMessage) => void;
129
+ "incoming-processor-warning": (message: IncomingProcessorMessage) => void;
130
+ "incoming-processor-error": (message: IncomingProcessorMessage) => void;
131
+ "initialized-on-channel-attachment": (message: IncomingProcessorMessage) => void;
132
+ "processor-wasm-instantiated": (message: IncomingProcessorMessage) => void;
133
+ }
134
+ export interface ProcessorData {
135
+ id: string | ProcessorIdentificationCodes.UnknownProcessorId;
136
+ name: string | ProcessorIdentificationCodes.UnknownProcessorName;
137
+ createdAt: number | ProcessorIdentificationCodes.UnknownProcessorCreationDate;
138
+ }
139
+ export interface IncomingProcessorMessage {
140
+ id: string;
141
+ timestamp: number;
142
+ message: string;
143
+ type: IncomingMessageType;
144
+ processor: ProcessorData;
145
+ additionalData?: any;
146
+ }
118
147
  //# sourceMappingURL=typings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../src/typings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../src/typings.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- // ======== Audio worklet command id's ========
2
1
  export var LowPassFilterMessageCommandId;
3
2
  (function (LowPassFilterMessageCommandId) {
4
3
  LowPassFilterMessageCommandId[LowPassFilterMessageCommandId["SetCutoff"] = 0] = "SetCutoff";
@@ -42,3 +41,9 @@ export var AudioWorkletProcessorNames;
42
41
  AudioWorkletProcessorNames["SoftClip"] = "SoftClipProcessor";
43
42
  AudioWorkletProcessorNames["HardClip"] = "HardClipProcessor";
44
43
  })(AudioWorkletProcessorNames || (AudioWorkletProcessorNames = {}));
44
+ export var ProcessorIdentificationCodes;
45
+ (function (ProcessorIdentificationCodes) {
46
+ ProcessorIdentificationCodes["UnknownProcessorId"] = "UNKNOWN_PROCESSOR_ID";
47
+ ProcessorIdentificationCodes["UnknownProcessorName"] = "UNKNOWN_PROCESSOR_NAME";
48
+ ProcessorIdentificationCodes["UnknownProcessorCreationDate"] = "UNKNOWN_PROCESSOR_CREATION_DATE";
49
+ })(ProcessorIdentificationCodes || (ProcessorIdentificationCodes = {}));
@@ -1,12 +1,94 @@
1
1
  import { v4 } from "uuid";
2
2
 
3
+ import { IncomingProcessorMessage, IncomingMessageType, EffectorEvents, EffectorEventMap } from "../../typings";
4
+ import { Debug } from "../../utilities/debugger";
5
+
3
6
  export abstract class Effector {
4
-
7
+
5
8
  public id: string = v4();
6
9
  public label: string | null = null;
7
10
  public name: string = "Effector";
8
11
  public audioWorkletNode: AudioWorkletNode | null = null;
9
12
  public parentialContext: AudioContext | null = null;
10
13
 
14
+ private hasRegisteredMessageEventListener: boolean = false;
15
+
16
+ private events: EffectorEvents = {
17
+ "incoming-processor-error": [],
18
+ "incoming-processor-message": [],
19
+ "incoming-processor-warning": [],
20
+ "processor-wasm-instantiated": [],
21
+ "initialized-on-channel-attachment": []
22
+ }
23
+
24
+ private handleIncomingMessages(event: MessageEvent) {
25
+
26
+ const messageData = event.data as IncomingProcessorMessage;
27
+
28
+ console.log(messageData);
29
+
30
+ switch (messageData.type) {
31
+ case "message":
32
+ return this.events["incoming-processor-message"].forEach(ev => ev(messageData));
33
+ case "error":
34
+ return this.events["incoming-processor-error"].forEach(ev => ev(messageData));
35
+ case "warning":
36
+ return this.events["incoming-processor-message"].forEach(ev => ev(messageData));
37
+ case "wasm-instantiated":
38
+ return this.events["processor-wasm-instantiated"].forEach(ev => ev(messageData));
39
+ }
40
+ }
41
+
42
+ protected registerMessageEventListener(node: AudioWorkletNode) {
43
+ if (this.hasRegisteredMessageEventListener) return;
44
+
45
+ node.port.onmessage = this.handleIncomingMessages.bind(this);
46
+ Debug.Log(`Succesfully registered event listener on effector ${this.name} (${this.label}) [${this.id}]`);
47
+ }
48
+
49
+ public AddEventListener<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): () => void {
50
+
51
+ this.events[event].push(cb);
52
+
53
+ return () => this.RemoveEventListener(event, cb);
54
+ }
55
+
56
+ public Once<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): () => void {
57
+
58
+ const wrapper = ((...args: unknown[]) => {
59
+
60
+ // @ts-ignore
61
+ cb(...args);
62
+
63
+ this.RemoveEventListener(event, wrapper as unknown as EffectorEventMap[K]);
64
+ }) as unknown as EffectorEventMap[K];
65
+
66
+ return this.AddEventListener(event, wrapper);
67
+ }
68
+
69
+ public RemoveEventListener<K extends keyof EffectorEventMap>(event: K, cb: EffectorEventMap[K]): Effector {
70
+
71
+ const arr = this.events[event];
72
+
73
+ for (let i = 0; i < arr.length; i++) {
74
+ if (arr[i] === cb) {
75
+ arr.splice(i, 1);
76
+ break;
77
+ }
78
+ }
79
+ return this;
80
+ }
81
+
82
+ public ClearEventListeners(event?: keyof EffectorEventMap): Effector {
83
+
84
+ if (event) {
85
+ this.events[event].length = 0;
86
+ } else {
87
+ (Object.keys(this.events) as (keyof EffectorEventMap)[]).forEach((k) => (this.events[k].length = 0));
88
+ }
89
+
90
+ return this;
91
+ }
92
+
11
93
  public abstract InitializeOnAttachment(parentialContext: AudioContext): Promise<void>;
12
- }
94
+ }
@@ -25,6 +25,7 @@ export class LowPassFilter extends Effector {
25
25
 
26
26
  this.parentialContext = parentialContext;
27
27
  this.audioWorkletNode = CreateAudioWorkletNode(parentialContext, AudioWorkletProcessorNames.LowPassFilter, this.ReturnOptionsAsObject());
28
+ this.registerMessageEventListener(this.audioWorkletNode as AudioWorkletNode);
28
29
  }
29
30
 
30
31
  public ReturnOptionsAsObject(): LowPassFilterOptions {
package/lib/src/index.ts CHANGED
@@ -100,5 +100,11 @@ export type {
100
100
  SoftClipMessageCommandId,
101
101
  SoftClipOptions,
102
102
  HardClipMessageCommandId,
103
- HardClipOptions
103
+ HardClipOptions,
104
+ EffectorEventMap,
105
+ IncomingMessageType,
106
+ IncomingProcessorMessage,
107
+ ProcessorData,
108
+ ProcessorIdentificationCodes,
109
+ EffectorEvents
104
110
  } from "./typings";
@@ -1,13 +1,15 @@
1
1
  export type ChannelSpatialization = "mono" | "stereo" | "surround";
2
-
3
2
  export type AudioClipAnalyserType = "pre" | "post";
4
3
  export type AudioClipAnalyserProperty = "fftSize" | "minDecibels" | "maxDecibels" | "smoothingTimeConstant";
4
+ export type IncomingMessageType = "message" | "error" | "warning" | "wasm-instantiated";
5
5
 
6
- export type AudioClipEvents = {
6
+ export type AudioClipEvents = {
7
7
  [K in keyof AudioClipEventMap]: AudioClipEventMap[K][];
8
8
  }
9
9
 
10
- // ======== Audio worklet command id's ========
10
+ export type EffectorEvents = {
11
+ [K in keyof EffectorEventMap]: EffectorEventMap[K][];
12
+ }
11
13
 
12
14
  export enum LowPassFilterMessageCommandId {
13
15
  SetCutoff,
@@ -52,6 +54,12 @@ export enum AudioWorkletProcessorNames {
52
54
  HardClip = "HardClipProcessor"
53
55
  }
54
56
 
57
+ export enum ProcessorIdentificationCodes {
58
+ UnknownProcessorId = "UNKNOWN_PROCESSOR_ID",
59
+ UnknownProcessorName = "UNKNOWN_PROCESSOR_NAME",
60
+ UnknownProcessorCreationDate = "UNKNOWN_PROCESSOR_CREATION_DATE"
61
+ }
62
+
55
63
  export interface FluexGLAudioDebuggerOptions {
56
64
  breakOnError: boolean;
57
65
  showInfo: boolean;
@@ -122,7 +130,7 @@ export interface ChorusEffectOptions {
122
130
  depthMs: number;
123
131
  rateHz: number;
124
132
  mix: number;
125
- feedback: number;
133
+ feedback: number;
126
134
  }
127
135
 
128
136
  export interface LowPassFilterOptions {
@@ -139,4 +147,27 @@ export interface SoftClipOptions {
139
147
  export interface HardClipOptions {
140
148
  drive: number;
141
149
  gain: number;
150
+ }
151
+
152
+ export interface EffectorEventMap {
153
+ "incoming-processor-message": (message: IncomingProcessorMessage) => void;
154
+ "incoming-processor-warning": (message: IncomingProcessorMessage) => void;
155
+ "incoming-processor-error": (message: IncomingProcessorMessage) => void;
156
+ "initialized-on-channel-attachment": (message: IncomingProcessorMessage) => void;
157
+ "processor-wasm-instantiated": (message: IncomingProcessorMessage) => void;
158
+ }
159
+
160
+ export interface ProcessorData {
161
+ id: string | ProcessorIdentificationCodes.UnknownProcessorId;
162
+ name: string | ProcessorIdentificationCodes.UnknownProcessorName;
163
+ createdAt: number | ProcessorIdentificationCodes.UnknownProcessorCreationDate;
164
+ }
165
+
166
+ export interface IncomingProcessorMessage {
167
+ id: string;
168
+ timestamp: number;
169
+ message: string;
170
+ type: IncomingMessageType;
171
+ processor: ProcessorData;
172
+ additionalData?: any;
142
173
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluex/fluexgl-dsp",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "An open-source, web-based DSP library developed alongside FluexGL, designed for creating and manipulating sounds in various contexts.",
5
5
  "main": "lib/dist/index.js",
6
6
  "types": "lib/dist/index.d.ts",