tone 15.3.12 → 15.4.0

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.
@@ -4,7 +4,7 @@ const delayLine = /* javascript */ `
4
4
  * A multichannel buffer for use within an AudioWorkletProcessor as a delay line
5
5
  */
6
6
  class DelayLine {
7
-
7
+
8
8
  constructor(size, channels) {
9
9
  this.buffer = [];
10
10
  this.writeHead = []
@@ -24,7 +24,7 @@ const delayLine = /* javascript */ `
24
24
  */
25
25
  push(channel, value) {
26
26
  this.writeHead[channel] += 1;
27
- if (this.writeHead[channel] > this.size) {
27
+ if (this.writeHead[channel] >= this.size) {
28
28
  this.writeHead[channel] = 0;
29
29
  }
30
30
  this.buffer[channel][this.writeHead[channel]] = value;
@@ -42,6 +42,29 @@ const delayLine = /* javascript */ `
42
42
  }
43
43
  return this.buffer[channel][readHead];
44
44
  }
45
+
46
+ /**
47
+ * Get the reverse recorded value of the channel given the delay
48
+ * @param channel number
49
+ * @param delay number delay samples
50
+ */
51
+ getReverse(channel, delay) {
52
+ if (!this.size || !delay) {
53
+ return 0;
54
+ }
55
+
56
+ const readHead = delay * 2 - this.writeHead[channel] - 1;
57
+
58
+ // Gain function to reduce clicking when read is too close to write
59
+ let readWriteDifference = this.writeHead[channel] - readHead;
60
+ if (readWriteDifference < 0) {
61
+ readWriteDifference += this.size
62
+ }
63
+ const delayPct = readWriteDifference / this.size;
64
+ const gainFunction = 4 * delayPct * (1 - delayPct);
65
+
66
+ return this.buffer[channel][readHead] * gainFunction;
67
+ }
45
68
  }
46
69
  `;
47
70
  addToWorklet(delayLine);
@@ -1 +1 @@
1
- {"version":3,"file":"DelayLine.worklet.js","sourceRoot":"","sources":["../../../../Tone/core/worklet/DelayLine.worklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,SAAS,GAAG,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4ClC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"DelayLine.worklet.js","sourceRoot":"","sources":["../../../../Tone/core/worklet/DelayLine.worklet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,SAAS,GAAG,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmElC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { ToneAudioNode, ToneAudioNodeOptions } from "../context/ToneAudioNode.js";
2
- export type ToneAudioWorkletOptions = ToneAudioNodeOptions;
2
+ export interface ToneAudioWorkletOptions extends ToneAudioNodeOptions {
3
+ workletOptions?: Partial<AudioWorkletNodeOptions>;
4
+ }
3
5
  export declare abstract class ToneAudioWorklet<Options extends ToneAudioWorkletOptions> extends ToneAudioNode<Options> {
4
6
  readonly name: string;
5
7
  /**
@@ -1,6 +1,7 @@
1
1
  import { ToneAudioNode, } from "../context/ToneAudioNode.js";
2
2
  import { noOp } from "../util/Interface.js";
3
3
  import { getWorkletGlobalScope } from "./WorkletGlobalScope.js";
4
+ ;
4
5
  export class ToneAudioWorklet extends ToneAudioNode {
5
6
  constructor(options) {
6
7
  super(options);
@@ -19,6 +20,9 @@ export class ToneAudioWorklet extends ToneAudioNode {
19
20
  this._dummyParam = this._dummyGain.gain;
20
21
  // Register the processor
21
22
  let workletPromise = ToneAudioWorklet._workletPromises.get(this.context);
23
+ if (options.workletOptions) {
24
+ this.workletOptions = Object.assign({}, this.workletOptions, options.workletOptions);
25
+ }
22
26
  if (workletPromise === undefined) {
23
27
  workletPromise = this.context.addAudioWorkletModule(blobUrl);
24
28
  ToneAudioWorklet._workletPromises.set(this.context, workletPromise);
@@ -1 +1 @@
1
- {"version":3,"file":"ToneAudioWorklet.js","sourceRoot":"","sources":["../../../../Tone/core/worklet/ToneAudioWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,GAEb,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,MAAM,OAAgB,gBAEpB,SAAQ,aAAsB;IAsC/B,YAAY,OAAgB;QAC3B,KAAK,CAAC,OAAO,CAAC,CAAC;QAtCP,SAAI,GAAW,kBAAkB,CAAC;QAiB3C;;WAEG;QACO,mBAAc,GAAqC,EAAE,CAAC;QAYhE;;WAEG;QACH,qBAAgB,GAAwB,IAAI,CAAC;QAK5C,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAClC,IAAI,IAAI,CAAC,CAAC,qBAAqB,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAChE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAExC,yBAAyB;QACzB,IAAI,cAAc,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CACzD,IAAI,CAAC,OAAO,CACZ,CAAC;QAEF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YAClC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAE7D,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YACxB,oCAAoC;YACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAClD,IAAI,EACJ,IAAI,CAAC,cAAc,CACnB,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,gBAAgB;oBAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAID,OAAO;QACN,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;;AAVc,iCAAgB,GAAG,IAAI,OAAO,EAAsB,AAApC,CAAqC"}
1
+ {"version":3,"file":"ToneAudioWorklet.js","sourceRoot":"","sources":["../../../../Tone/core/worklet/ToneAudioWorklet.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,GAEb,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAI/D,CAAC;AACF,MAAM,OAAgB,gBAEpB,SAAQ,aAAsB;IAsC/B,YAAY,OAAgB;QAC3B,KAAK,CAAC,OAAO,CAAC,CAAC;QAtCP,SAAI,GAAW,kBAAkB,CAAC;QAiB3C;;WAEG;QACO,mBAAc,GAAqC,EAAE,CAAC;QAYhE;;WAEG;QACH,qBAAgB,GAAwB,IAAI,CAAC;QAK5C,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAClC,IAAI,IAAI,CAAC,CAAC,qBAAqB,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAChE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAExC,yBAAyB;QACzB,IAAI,cAAc,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CACzD,IAAI,CAAC,OAAO,CACZ,CAAC;QAEF,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EACrC,IAAI,CAAC,cAAc,EACnB,OAAO,CAAC,cAAc,CACtB,CAAC;QACH,CAAC;QAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YAClC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAE7D,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YACxB,oCAAoC;YACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAClD,IAAI,EACJ,IAAI,CAAC,cAAc,CACnB,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,gBAAgB;oBAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAID,OAAO;QACN,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;;AAVc,iCAAgB,GAAG,IAAI,OAAO,EAAsB,AAApC,CAAqC"}
@@ -0,0 +1,48 @@
1
+ import { NormalRange, Seconds, Time } from "../core/type/Units.js";
2
+ import { ToneAudioWorkletOptions } from "../core/worklet/ToneAudioWorklet.js";
3
+ import { EffectOptions } from "./Effect.js";
4
+ import { Effect } from "./Effect.js";
5
+ export interface ReverseDelayOptions extends EffectOptions {
6
+ delayTime: Time;
7
+ feedback: NormalRange;
8
+ }
9
+ /**
10
+ * A feedback delay effect that plays the echos in reverse.
11
+ * Algorithm and gain function found in [this pdf](https://ccrma.stanford.edu/~jingjiez/portfolio/echoing-harmonics/pdfs/A%20Pitch%20Shifting%20Reverse%20Echo%20Audio%20Effect.pdf)
12
+ *
13
+ * @example
14
+ * const reverse = new Tone.ReverseDelay(1.5, 0.75).toDestination();
15
+ * const synth = new Tone.Synth().connect(reverse);
16
+ * synth.triggerAttackRelease("C4", "2n");
17
+ * @category Effect
18
+ */
19
+ export declare class ReverseDelay extends Effect<ReverseDelayOptions> {
20
+ readonly name: string;
21
+ /**
22
+ * The node that does the reverse delay effect.
23
+ */
24
+ private _reverseDelayWorklet;
25
+ /**
26
+ * @param delayTime The amount of time the incoming signal will be delayed and reversed.
27
+ * @param feedback The amount of signal which is fed back through the delay.
28
+ */
29
+ constructor(delayTime?: Time, feedback?: NormalRange);
30
+ constructor(options?: Partial<ReverseDelayOptions>);
31
+ private _connectWorklet;
32
+ /**
33
+ * The amount of time the incoming signal is delayed and reversed
34
+ */
35
+ get delayTime(): Time;
36
+ set delayTime(delayTime: Time);
37
+ /**
38
+ * The amount of signal which is fed back through the delay.
39
+ */
40
+ get feedback(): NormalRange;
41
+ set feedback(feedback: NormalRange);
42
+ static getDefaults(): ReverseDelayOptions;
43
+ dispose(): this;
44
+ }
45
+ export interface ReverseDelayWorkletOptions extends ToneAudioWorkletOptions {
46
+ delayTime: Seconds;
47
+ feedback: NormalRange;
48
+ }
@@ -0,0 +1,116 @@
1
+ import { Gain } from "../core/context/Gain.js";
2
+ import { Param } from "../core/context/Param.js";
3
+ import { connectSeries } from "../core/context/ToneAudioNode.js";
4
+ import { optionsFromArguments } from "../core/util/Defaults.js";
5
+ import { ToneAudioWorklet, } from "../core/worklet/ToneAudioWorklet.js";
6
+ import { Effect } from "./Effect.js";
7
+ import { workletName } from "./ReverseDelay.worklet.js";
8
+ /**
9
+ * A feedback delay effect that plays the echos in reverse.
10
+ * Algorithm and gain function found in [this pdf](https://ccrma.stanford.edu/~jingjiez/portfolio/echoing-harmonics/pdfs/A%20Pitch%20Shifting%20Reverse%20Echo%20Audio%20Effect.pdf)
11
+ *
12
+ * @example
13
+ * const reverse = new Tone.ReverseDelay(1.5, 0.75).toDestination();
14
+ * const synth = new Tone.Synth().connect(reverse);
15
+ * synth.triggerAttackRelease("C4", "2n");
16
+ * @category Effect
17
+ */
18
+ export class ReverseDelay extends Effect {
19
+ constructor() {
20
+ const options = optionsFromArguments(ReverseDelay.getDefaults(), arguments, ["delayTime", "feedback"]);
21
+ super(options);
22
+ this.name = "ReverseDelay";
23
+ this._reverseDelayWorklet = this._connectWorklet(options.delayTime, options.feedback);
24
+ }
25
+ _connectWorklet(delayTime, feedback) {
26
+ const worklet = new ReverseDelayWorklet({
27
+ context: this.context,
28
+ delayTime: this.toSeconds(delayTime),
29
+ feedback,
30
+ });
31
+ this.connectEffect(worklet);
32
+ return worklet;
33
+ }
34
+ /**
35
+ * The amount of time the incoming signal is delayed and reversed
36
+ */
37
+ get delayTime() {
38
+ return this._reverseDelayWorklet.delayTime;
39
+ }
40
+ set delayTime(delayTime) {
41
+ const prev = this._reverseDelayWorklet;
42
+ this._reverseDelayWorklet = this._connectWorklet(delayTime, this.feedback);
43
+ // Prevent sudden stop when disposing previous worklet
44
+ prev.output.gain.linearRampTo(0, this.toSeconds(this.delayTime));
45
+ this.context.setTimeout(() => prev.dispose(), this.toSeconds(this.delayTime));
46
+ }
47
+ /**
48
+ * The amount of signal which is fed back through the delay.
49
+ */
50
+ get feedback() {
51
+ return this._reverseDelayWorklet.feedback.value;
52
+ }
53
+ set feedback(feedback) {
54
+ this._reverseDelayWorklet.set({ feedback });
55
+ }
56
+ static getDefaults() {
57
+ return Object.assign(Effect.getDefaults(), {
58
+ wet: 0.5,
59
+ delayTime: 1,
60
+ feedback: 0.5,
61
+ });
62
+ }
63
+ dispose() {
64
+ super.dispose();
65
+ this._reverseDelayWorklet.dispose();
66
+ return this;
67
+ }
68
+ }
69
+ /**
70
+ * Internal class which creates an AudioWorklet to reverse the delay signal
71
+ */
72
+ class ReverseDelayWorklet extends ToneAudioWorklet {
73
+ constructor() {
74
+ const options = optionsFromArguments(ReverseDelayWorklet.getDefaults(), arguments, ["delayTime", "feedback"]);
75
+ super(Object.assign(Object.assign({}, options), { workletOptions: {
76
+ processorOptions: {
77
+ delayTime: options.delayTime,
78
+ },
79
+ } }));
80
+ this.name = "ReverseDelayWorklet";
81
+ this.input = new Gain({ context: this.context });
82
+ this.output = new Gain({ context: this.context });
83
+ this.delayTime = options.delayTime;
84
+ this.feedback = new Param({
85
+ context: this.context,
86
+ value: options.feedback,
87
+ units: "normalRange",
88
+ param: this._dummyParam,
89
+ swappable: true,
90
+ minValue: 0,
91
+ maxValue: 0.9999,
92
+ });
93
+ }
94
+ static getDefaults() {
95
+ return Object.assign(ToneAudioWorklet.getDefaults(), {
96
+ delayTime: 1,
97
+ feedback: 0.5,
98
+ });
99
+ }
100
+ _audioWorkletName() {
101
+ return workletName;
102
+ }
103
+ onReady(node) {
104
+ connectSeries(this.input, node, this.output);
105
+ const feedback = node.parameters.get("feedback");
106
+ this.feedback.setParam(feedback);
107
+ }
108
+ dispose() {
109
+ super.dispose();
110
+ this.input.dispose();
111
+ this.output.dispose();
112
+ this.feedback.dispose();
113
+ return this;
114
+ }
115
+ }
116
+ //# sourceMappingURL=ReverseDelay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReverseDelay.js","sourceRoot":"","sources":["../../../Tone/effect/ReverseDelay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import "../core/worklet/SingleIOProcessor.worklet.js";
2
+ import "../core/worklet/DelayLine.worklet.js";
3
+ export declare const workletName = "reverse-delay";
4
+ export declare const reverseDelayWorklet = "\n\tclass ReverseDelayWorklet extends SingleIOProcessor {\n\n\t\tconstructor(options) {\n\t\t\tsuper(options);\n\t\t\tthis.delayTime = Math.floor(this.sampleRate * options.processorOptions.delayTime);\n\t\t\tconst channels = options.channelCount || 2;\n\t\t\tthis.delayLine = new DelayLine(this.delayTime * 2, channels);\n\t\t}\n\n\t\tstatic get parameterDescriptors() {\n\t\t\treturn [{\n\t\t\t\tname: \"feedback\",\n\t\t\t\tdefaultValue: 0.5,\n\t\t\t\tminValue: 0,\n\t\t\t\tmaxValue: 0.9999,\n\t\t\t\tautomationRate: \"k-rate\"\n\t\t\t}];\n\t\t}\n\n\t\tgenerate(input, channel, parameters) {\n\t\t\tconst reversedSample = this.delayLine.getReverse(channel, this.delayTime);\n\t\t\tconst delayedSample = this.delayLine.get(channel, this.delayTime);\n\n\t\t\t// Push the forward sample back on the line\n\t\t\tthis.delayLine.push(channel, input + delayedSample * parameters.feedback);\n\n\t\t\t// Play the reversed sample\n\t\t\treturn reversedSample;\n\t\t}\n\t}\n";
@@ -0,0 +1,38 @@
1
+ import "../core/worklet/SingleIOProcessor.worklet.js";
2
+ import "../core/worklet/DelayLine.worklet.js";
3
+ import { registerProcessor } from "../core/worklet/WorkletGlobalScope.js";
4
+ export const workletName = "reverse-delay";
5
+ export const reverseDelayWorklet = /* javascript */ `
6
+ class ReverseDelayWorklet extends SingleIOProcessor {
7
+
8
+ constructor(options) {
9
+ super(options);
10
+ this.delayTime = Math.floor(this.sampleRate * options.processorOptions.delayTime);
11
+ const channels = options.channelCount || 2;
12
+ this.delayLine = new DelayLine(this.delayTime * 2, channels);
13
+ }
14
+
15
+ static get parameterDescriptors() {
16
+ return [{
17
+ name: "feedback",
18
+ defaultValue: 0.5,
19
+ minValue: 0,
20
+ maxValue: 0.9999,
21
+ automationRate: "k-rate"
22
+ }];
23
+ }
24
+
25
+ generate(input, channel, parameters) {
26
+ const reversedSample = this.delayLine.getReverse(channel, this.delayTime);
27
+ const delayedSample = this.delayLine.get(channel, this.delayTime);
28
+
29
+ // Push the forward sample back on the line
30
+ this.delayLine.push(channel, input + delayedSample * parameters.feedback);
31
+
32
+ // Play the reversed sample
33
+ return reversedSample;
34
+ }
35
+ }
36
+ `;
37
+ registerProcessor(workletName, reverseDelayWorklet);
38
+ //# sourceMappingURL=ReverseDelay.worklet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReverseDelay.worklet.js","sourceRoot":"","sources":["../../../Tone/effect/ReverseDelay.worklet.ts"],"names":[],"mappings":"AAAA,OAAO,8CAA8C,CAAC;AACtD,OAAO,sCAAsC,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAE3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BnD,CAAC;AAEF,iBAAiB,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC"}
@@ -13,6 +13,7 @@ export * from "./Phaser.js";
13
13
  export * from "./PingPongDelay.js";
14
14
  export * from "./PitchShift.js";
15
15
  export * from "./Reverb.js";
16
+ export * from "./ReverseDelay.js";
16
17
  export * from "./StereoWidener.js";
17
18
  export * from "./Tremolo.js";
18
19
  export * from "./Vibrato.js";
@@ -13,6 +13,7 @@ export * from "./Phaser.js";
13
13
  export * from "./PingPongDelay.js";
14
14
  export * from "./PitchShift.js";
15
15
  export * from "./Reverb.js";
16
+ export * from "./ReverseDelay.js";
16
17
  export * from "./StereoWidener.js";
17
18
  export * from "./Tremolo.js";
18
19
  export * from "./Vibrato.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../Tone/effect/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../Tone/effect/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -1,2 +1,2 @@
1
- export const version = "15.3.12";
1
+ export const version = "15.4.0";
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../Tone/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,SAAS,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../Tone/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tone",
3
- "version": "15.3.12",
3
+ "version": "15.4.0",
4
4
  "description": "A Web Audio framework for making interactive music in the browser.",
5
5
  "type": "module",
6
6
  "main": "build/esm/index.js",