import type { Effect } from './Effect.interface' export class DelayEffect implements Effect { readonly id = 'delay' private inputNode: GainNode private outputNode: GainNode private delayNode: DelayNode private feedbackNode: GainNode private wetNode: GainNode private dryNode: GainNode constructor(audioContext: AudioContext) { this.inputNode = audioContext.createGain() this.outputNode = audioContext.createGain() this.delayNode = audioContext.createDelay(2.0) this.feedbackNode = audioContext.createGain() this.wetNode = audioContext.createGain() this.dryNode = audioContext.createGain() this.dryNode.gain.value = 1 this.wetNode.gain.value = 0 this.feedbackNode.gain.value = 0.5 this.inputNode.connect(this.dryNode) this.inputNode.connect(this.delayNode) this.delayNode.connect(this.feedbackNode) this.feedbackNode.connect(this.delayNode) this.delayNode.connect(this.wetNode) this.dryNode.connect(this.outputNode) this.wetNode.connect(this.outputNode) } getInputNode(): AudioNode { return this.inputNode } getOutputNode(): AudioNode { return this.outputNode } updateParams(values: Record): void { if (values.delayTime !== undefined) { this.delayNode.delayTime.value = values.delayTime / 1000 const delayAmount = Math.min(values.delayTime / 1000, 0.5) this.wetNode.gain.value = delayAmount this.dryNode.gain.value = 1 - delayAmount } if (values.delayFeedback !== undefined) { this.feedbackNode.gain.value = values.delayFeedback / 100 } } dispose(): void { this.inputNode.disconnect() this.outputNode.disconnect() this.delayNode.disconnect() this.feedbackNode.disconnect() this.wetNode.disconnect() this.dryNode.disconnect() } }