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.
- package/Tone/core/worklet/DelayLine.worklet.ts +25 -2
- package/Tone/core/worklet/ToneAudioWorklet.ts +10 -2
- package/Tone/effect/ReverseDelay.test.ts +52 -0
- package/Tone/effect/ReverseDelay.ts +192 -0
- package/Tone/effect/ReverseDelay.worklet.ts +41 -0
- package/Tone/effect/index.ts +1 -0
- package/Tone/version.ts +1 -1
- package/build/Tone.js +1 -1
- package/build/Tone.js.map +1 -1
- package/build/esm/core/worklet/DelayLine.worklet.js +25 -2
- package/build/esm/core/worklet/DelayLine.worklet.js.map +1 -1
- package/build/esm/core/worklet/ToneAudioWorklet.d.ts +3 -1
- package/build/esm/core/worklet/ToneAudioWorklet.js +4 -0
- package/build/esm/core/worklet/ToneAudioWorklet.js.map +1 -1
- package/build/esm/effect/ReverseDelay.d.ts +48 -0
- package/build/esm/effect/ReverseDelay.js +116 -0
- package/build/esm/effect/ReverseDelay.js.map +1 -0
- package/build/esm/effect/ReverseDelay.worklet.d.ts +4 -0
- package/build/esm/effect/ReverseDelay.worklet.js +38 -0
- package/build/esm/effect/ReverseDelay.worklet.js.map +1 -0
- package/build/esm/effect/index.d.ts +1 -0
- package/build/esm/effect/index.js +1 -0
- package/build/esm/effect/index.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -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]
|
|
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
|
|
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
|
|
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;
|
|
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"}
|
package/build/esm/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = "15.
|
|
1
|
+
export const version = "15.4.0";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/build/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../Tone/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../Tone/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAW,QAAQ,CAAC"}
|