UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

79 lines (69 loc) 2.28 kB
/** * creates an amplitude envelope to analyse sounds * * */ import {TypedAudioNode} from './_Base'; import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig'; import {AudioBuilder} from '../../../core/audio/AudioBuilder'; import {AmplitudeEnvelope} from 'tone/build/esm/component/envelope/AmplitudeEnvelope'; interface AmplitudeEnvelopeParams { attack: number; decay: number; release: number; sustain: number; } export const ENVELOPE_DEFAULTS: AmplitudeEnvelopeParams = { attack: 0.01, decay: 0.1, release: 1, sustain: 0.5, }; class AmplitudeEnvelopeAudioParamsConfig extends NodeParamsConfig { /** @param The amount of time it takes for the envelope to go from 0 to it's maximum value. */ attack = ParamConfig.FLOAT(ENVELOPE_DEFAULTS.attack as number, { range: [0, 0.1], rangeLocked: [true, false], }); /** The period of time after the attack that it takes for the envelope to fall to the sustain value. */ decay = ParamConfig.FLOAT(ENVELOPE_DEFAULTS.decay as number, { range: [0, 1], rangeLocked: [true, false], }); /** The percent of the maximum value that the envelope rests at until the release is triggered. */ sustain = ParamConfig.FLOAT(ENVELOPE_DEFAULTS.sustain as number, { range: [0, 1], rangeLocked: [true, false], }); /** The amount of time after the release is triggered it takes to reach 0. */ release = ParamConfig.FLOAT(ENVELOPE_DEFAULTS.release as number, { range: [0, 1], rangeLocked: [true, false], }); } const ParamsConfig = new AmplitudeEnvelopeAudioParamsConfig(); export class AmplitudeEnvelopeAudioNode extends TypedAudioNode<AmplitudeEnvelopeAudioParamsConfig> { override paramsConfig = ParamsConfig; static override type() { return 'amplitudeEnveloppe'; } override initializeNode() { this.io.inputs.setCount(1); } override cook(inputContents: AudioBuilder[]) { const audioBuilder = inputContents[0]; const ampEnv = new AmplitudeEnvelope({ attack: this.pv.attack, decay: this.pv.decay, release: this.pv.release, sustain: this.pv.sustain, }); const inputNode = audioBuilder.audioNode(); if (inputNode) { inputNode.connect(ampEnv); } // audioBuilder.setInstrument(ampEnv); audioBuilder.setAudioNode(ampEnv); this.setAudioBuilder(audioBuilder); } }