-
Notifications
You must be signed in to change notification settings - Fork 0
/
chorus.js
81 lines (73 loc) · 4.15 KB
/
chorus.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import Module from "../../classes/Module.js";
import Parameter from "../../classes/Parameter.js";
import { audioContext } from "../../main.js";
export default function chorus(event, initalDelay, initalDepth, initalSpeed, initalFeedback) {
const delay = parseFloat(initalDelay || 0.05);
const depth = parseFloat(initalDepth || 0.002);
const speed = parseFloat(initalSpeed || 0.1);
const feedback = parseFloat(initalFeedback || 0.6);
const delayInfo = "Number of seconds from input signal to be storage and play back";
const depthInfo = "Depth of changes in delay time";
const speedInfo = "Frequency of oscillator that makes change in delay time";
const feedbackInfo = "The return of a portion of the output signal back into delay loop";
const module = new Module("chorus", true, false, false, undefined);
module.audioNode = {
mixNode: new GainNode(audioContext),
dryNode: new GainNode(audioContext, { gain: 1 / Math.sqrt(2) }), // don't cancel each other on mixNode
wetNode: new GainNode(audioContext, { gain: 1 / Math.sqrt(2) }),
inputNode: new GainNode(audioContext),
outputNode: new GainNode(audioContext),
depthLNode: new GainNode(audioContext, { gain: depth }),
depthRNode: new GainNode(audioContext, { gain: -depth }),
delayLNode: new DelayNode(audioContext, { delayTime: delay }),
delayRNode: new DelayNode(audioContext, { delayTime: delay }),
feedbackNode: new GainNode(audioContext, { gain: feedback }),
oscillatorLNode: new OscillatorNode(audioContext, { type: "triangle", frequency: speed }),
oscillatorRNode: new OscillatorNode(audioContext, { type: "triangle", frequency: speed }),
delayTime: new Parameter(delay, (value) => {
module.audioNode.delayLNode.delayTime.value = value;
module.audioNode.delayRNode.delayTime.value = value;
}),
depth: new Parameter(depth, (value) => {
module.audioNode.depthLNode.gain.value = value;
module.audioNode.depthRNode.gain.value = -value;
}),
speed: new Parameter(speed, (value) => {
module.audioNode.oscillatorRNode.frequency.value = value;
module.audioNode.oscillatorLNode.frequency.value = value;
}),
feedback: new Parameter(feedback, (value) => {
module.audioNode.feedbackNode.gain.value = value;
}),
connect(destination) {
if (destination.inputNode) this.outputNode.connect(destination.inputNode);
else this.outputNode.connect(destination);
},
disconnect() {
this.outputNode.disconnect();
},
};
module.createSlider("delay Time", delay, 0, 1, 0.01, "sec", false, delayInfo);
module.createSlider("depth", depth, 0, 0.01, 0.001, "", false, depthInfo);
module.createSlider("feedback", feedback, 0, 0.7, 0.01, "", false, feedbackInfo);
module.createSlider("speed", speed, 0, 1, 0.01, "Hz", false, speedInfo);
module.audioNode.wetNode.connect(module.audioNode.mixNode);
module.audioNode.dryNode.connect(module.audioNode.mixNode);
module.audioNode.mixNode.connect(module.audioNode.feedbackNode);
module.audioNode.mixNode.connect(module.audioNode.outputNode);
module.audioNode.inputNode.connect(module.audioNode.dryNode);
module.audioNode.inputNode.connect(module.audioNode.feedbackNode);
module.audioNode.delayLNode.connect(module.audioNode.wetNode);
module.audioNode.delayRNode.connect(module.audioNode.wetNode);
module.audioNode.depthLNode.connect(module.audioNode.delayLNode.delayTime);
module.audioNode.depthRNode.connect(module.audioNode.delayRNode.delayTime);
module.audioNode.feedbackNode.connect(module.audioNode.delayLNode);
module.audioNode.feedbackNode.connect(module.audioNode.delayRNode);
module.audioNode.oscillatorRNode.connect(module.audioNode.depthLNode);
module.audioNode.oscillatorLNode.connect(module.audioNode.depthRNode);
module.audioNode.oscillatorLNode.start();
module.audioNode.oscillatorRNode.start();
// add inital cable when structure is fully build - getBoundingClientRect related
module.addInitalCable();
return module;
}