tone
Version:
A Web Audio framework for making interactive music in the browser.
103 lines (89 loc) • 2.83 kB
text/typescript
import { Frequency, Positive } from "../core/type/Units";
import { Filter, FilterOptions } from "../component/filter/Filter";
import { SourceOptions } from "../source/Source";
import { optionsFromArguments } from "../core/util/Defaults";
import { LFOEffect, LFOEffectOptions } from "./LFOEffect";
export interface AutoFilterOptions extends LFOEffectOptions {
baseFrequency: Frequency;
octaves: Positive;
filter: Omit<FilterOptions, keyof SourceOptions | "frequency" | "detune" | "gain">;
}
/**
* AutoFilter is a Tone.Filter with a Tone.LFO connected to the filter cutoff frequency.
* Setting the LFO rate and depth allows for control over the filter modulation rate
* and depth.
*
* @example
* // create an autofilter and start it's LFO
* const autoFilter = new Tone.AutoFilter("4n").toDestination().start();
* // route an oscillator through the filter and start it
* const oscillator = new Tone.Oscillator().connect(autoFilter).start();
* @category Effect
*/
export class AutoFilter extends LFOEffect<AutoFilterOptions> {
readonly name: string = "AutoFilter";
/**
* The filter node
*/
readonly filter: Filter;
/**
* The octaves placeholder
*/
private _octaves!: Positive;
/**
* @param frequency The rate of the LFO.
* @param baseFrequency The lower value of the LFOs oscillation
* @param octaves The number of octaves above the baseFrequency
*/
constructor(frequency?: Frequency, baseFrequency?: Frequency, octaves?: Positive);
constructor(options?: Partial<AutoFilterOptions>);
constructor() {
super(optionsFromArguments(AutoFilter.getDefaults(), arguments, ["frequency", "baseFrequency", "octaves"]));
const options = optionsFromArguments(AutoFilter.getDefaults(), arguments, ["frequency", "baseFrequency", "octaves"]);
this.filter = new Filter(Object.assign(options.filter, {
context: this.context,
}));
// connections
this.connectEffect(this.filter);
this._lfo.connect(this.filter.frequency);
this.octaves = options.octaves;
this.baseFrequency = options.baseFrequency;
}
static getDefaults(): AutoFilterOptions {
return Object.assign(LFOEffect.getDefaults(), {
baseFrequency: 200,
octaves: 2.6,
filter: {
type: "lowpass" as "lowpass",
rolloff: -12 as -12,
Q: 1,
}
});
}
/**
* The minimum value of the filter's cutoff frequency.
*/
get baseFrequency(): Frequency {
return this._lfo.min;
}
set baseFrequency(freq) {
this._lfo.min = this.toFrequency(freq);
// and set the max
this.octaves = this._octaves;
}
/**
* The maximum value of the filter's cutoff frequency.
*/
get octaves(): Positive {
return this._octaves;
}
set octaves(oct) {
this._octaves = oct;
this._lfo.max = this._lfo.min * Math.pow(2, oct);
}
dispose(): this {
super.dispose();
this.filter.dispose();
return this;
}
}