UNPKG

2.44 kBJavaScriptView Raw
1import { MidSideEffect, } from "../effect/MidSideEffect.js";
2import { Signal } from "../signal/Signal.js";
3import { Multiply } from "../signal/Multiply.js";
4import { Subtract } from "../signal/Subtract.js";
5import { optionsFromArguments } from "../core/util/Defaults.js";
6import { readOnly } from "../core/util/Interface.js";
7import { connect } from "../core/context/ToneAudioNode.js";
8/**
9 * Applies a width factor to the mid/side seperation.
10 * 0 is all mid and 1 is all side.
11 * Algorithm found in [kvraudio forums](http://www.kvraudio.com/forum/viewtopic.php?t=212587).
12 * ```
13 * Mid *= 2*(1-width)<br>
14 * Side *= 2*width
15 * ```
16 * @category Effect
17 */
18export class StereoWidener extends MidSideEffect {
19 constructor() {
20 const options = optionsFromArguments(StereoWidener.getDefaults(), arguments, ["width"]);
21 super(options);
22 this.name = "StereoWidener";
23 this.width = new Signal({
24 context: this.context,
25 value: options.width,
26 units: "normalRange",
27 });
28 readOnly(this, ["width"]);
29 this._twoTimesWidthMid = new Multiply({
30 context: this.context,
31 value: 2,
32 });
33 this._twoTimesWidthSide = new Multiply({
34 context: this.context,
35 value: 2,
36 });
37 this._midMult = new Multiply({ context: this.context });
38 this._twoTimesWidthMid.connect(this._midMult.factor);
39 this.connectEffectMid(this._midMult);
40 this._oneMinusWidth = new Subtract({ context: this.context });
41 this._oneMinusWidth.connect(this._twoTimesWidthMid);
42 connect(this.context.getConstant(1), this._oneMinusWidth);
43 this.width.connect(this._oneMinusWidth.subtrahend);
44 this._sideMult = new Multiply({ context: this.context });
45 this.width.connect(this._twoTimesWidthSide);
46 this._twoTimesWidthSide.connect(this._sideMult.factor);
47 this.connectEffectSide(this._sideMult);
48 }
49 static getDefaults() {
50 return Object.assign(MidSideEffect.getDefaults(), {
51 width: 0.5,
52 });
53 }
54 dispose() {
55 super.dispose();
56 this.width.dispose();
57 this._midMult.dispose();
58 this._sideMult.dispose();
59 this._twoTimesWidthMid.dispose();
60 this._twoTimesWidthSide.dispose();
61 this._oneMinusWidth.dispose();
62 return this;
63 }
64}
65//# sourceMappingURL=StereoWidener.js.map
\No newline at end of file