@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.
- package/lib/dist/core/classes/Effector.d.ts +9 -0
- package/lib/dist/core/classes/Effector.d.ts.map +1 -1
- package/lib/dist/core/classes/Effector.js +60 -0
- package/lib/dist/effects/classes/filters/LowPassFilter.d.ts.map +1 -1
- package/lib/dist/effects/classes/filters/LowPassFilter.js +1 -0
- package/lib/dist/index.d.ts +1 -1
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/typings.d.ts +29 -0
- package/lib/dist/typings.d.ts.map +1 -1
- package/lib/dist/typings.js +6 -1
- package/lib/src/core/classes/Effector.ts +84 -2
- package/lib/src/effects/classes/filters/LowPassFilter.ts +1 -0
- package/lib/src/index.ts +7 -1
- package/lib/src/typings.ts +35 -4
- package/package.json +1 -1
|
@@ -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;
|
|
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;
|
|
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 {
|
package/lib/dist/index.d.ts
CHANGED
|
@@ -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
|
package/lib/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/lib/dist/typings.d.ts
CHANGED
|
@@ -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":"AAAA,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../src/typings.ts"],"names":[],"mappings":"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"}
|
package/lib/dist/typings.js
CHANGED
|
@@ -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";
|
package/lib/src/typings.ts
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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",
|