Skip to content

Commit

Permalink
feat(dsp): add FilterFeedbackDelay
Browse files Browse the repository at this point in the history
  • Loading branch information
postspectacular committed Jan 10, 2023
1 parent 449ecfc commit d69b3bc
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
3 changes: 3 additions & 0 deletions packages/dsp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,9 @@
"./fft": {
"default": "./fft.js"
},
"./filter-delay": {
"default": "./filter-delay.js"
},
"./filter-response": {
"default": "./filter-response.js"
},
Expand Down
3 changes: 3 additions & 0 deletions packages/dsp/src/feedback-delay.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import { Delay } from "./delay.js";
* Extension of {@link Delay} which adds sum delayed value multiplied
* with `feedback` for each new input.
*
* @remarks
* Also see {@link filterFeedbackDelay} for filtered version.
*
* @param n - delay length
* @param feedback - feedback factor (default: 0.5)
*/
Expand Down
42 changes: 42 additions & 0 deletions packages/dsp/src/filter-delay.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { clamp01 } from "@thi.ng/math/interval";
import type { IProc } from "./api.js";
import { Delay } from "./delay.js";

/**
* Extension of {@link feedbackDelay} with additional filter/proc
* possibility for the feedback itself (e.g. a low pass filter).
*
* @param n - delay length
* @param filter - IProc applied to feedback
* @param feedback - feedback factor (default: 0.5)
*/
export const filterFeedbackDelay = (
n: number,
filter: IProc<number, number>,
feedback?: number
) => new FilterFeedbackDelay(n, filter, feedback);

export class FilterFeedbackDelay extends Delay<number> {
constructor(
n: number,
public filter: IProc<number, number>,
protected _feedback = 0.5
) {
super(n, 0);
this.setFeedback(_feedback);
}

next(x: number) {
return super.next(
x + this.filter.next(this._buf[this._rpos] * this._feedback)
);
}

feedback() {
return this._feedback;
}

setFeedback(feedback: number) {
this._feedback = clamp01(feedback);
}
}
1 change: 1 addition & 0 deletions packages/dsp/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export * from "./dcblock.js";
export * from "./delay.js";
export * from "./feedback-delay.js";
export * from "./fft.js";
export * from "./filter-delay.js";
export * from "./filter-response.js";
export * from "./foldback.js";
export * from "./impulse-train.js";
Expand Down

0 comments on commit d69b3bc

Please sign in to comment.