Tone.js/Tone/component/envelope/AmplitudeEnvelope.ts
2019-10-23 16:30:07 -04:00

64 lines
2.3 KiB
TypeScript

import { Gain } from "../../core/context/Gain";
import { NormalRange, Time } from "../../core/type/Units";
import { optionsFromArguments } from "../../core/util/Defaults";
import { Envelope, EnvelopeOptions } from "./Envelope";
/**
* AmplitudeEnvelope is a Tone.Envelope connected to a gain node.
* Unlike Tone.Envelope, which outputs the envelope's value, AmplitudeEnvelope accepts
* an audio signal as the input and will apply the envelope to the amplitude
* of the signal.
* Read more about ADSR Envelopes on [Wikipedia](https://en.wikipedia.org/wiki/Synthesizer#ADSR_envelope).
*
* @example
* import { AmplitudeEnvelope, Oscillator } from "tone";
* const ampEnv = new AmplitudeEnvelope({
* attack: 0.1,
* decay: 0.2,
* sustain: 1.0,
* release: 0.8
* }).toDestination();
* // create an oscillator and connect it
* const osc = new Oscillator().connect(ampEnv).start();
* // trigger the envelopes attack and release "8t" apart
* ampEnv.triggerAttackRelease("8t");
* @category Component
*/
export class AmplitudeEnvelope extends Envelope {
readonly name: string = "AmplitudeEnvelope";
private _gainNode: Gain = new Gain({
context: this.context,
gain: 0,
});
output: Gain = this._gainNode;
input: Gain = this._gainNode;
/**
* @param attack The amount of time it takes for the envelope to go from 0 to it's maximum value.
* @param decay The period of time after the attack that it takes for the envelope
* to fall to the sustain value. Value must be greater than 0.
* @param sustain The percent of the maximum value that the envelope rests at until
* the release is triggered.
* @param release The amount of time after the release is triggered it takes to reach 0.
* Value must be greater than 0.
*/
constructor(attack?: Time, decay?: Time, sustain?: NormalRange, release?: Time);
constructor(options?: Partial<EnvelopeOptions>)
constructor() {
super(optionsFromArguments(AmplitudeEnvelope.getDefaults(), arguments, ["attack", "decay", "sustain", "release"]));
this._sig.connect(this._gainNode.gain);
this.output = this._gainNode;
this.input = this._gainNode;
}
/**
* Clean up
*/
dispose(): this {
super.dispose();
this._gainNode.dispose();
return this;
}
}