@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
52 lines (51 loc) • 1.53 kB
JavaScript
;
import { TypedAudioNode } from "./_Base";
import { NodeParamsConfig, ParamConfig } from "../utils/params/ParamsConfig";
import { AudioBuilder } from "../../../core/audio/AudioBuilder";
import { ENVELOPE_DEFAULTS } from "./Envelope";
import { Synth } from "tone/build/esm/instrument/Synth";
import { AudioType } from "../../poly/registers/nodes/types/Audio";
const SYNTH_DEFAULTS = {
detune: 0,
portamento: 0
};
class SynthAudioParamsConfig extends NodeParamsConfig {
constructor() {
super(...arguments);
/** @param The glide time between notes. */
this.portamento = ParamConfig.FLOAT(SYNTH_DEFAULTS.portamento, {
range: [0, 1],
rangeLocked: [true, false]
});
}
}
const ParamsConfig = new SynthAudioParamsConfig();
export class SynthAudioNode extends TypedAudioNode {
constructor() {
super(...arguments);
this.paramsConfig = ParamsConfig;
}
static type() {
return AudioType.SYNTH;
}
initializeNode() {
this.io.inputs.setCount(0, 1);
}
cook(inputContents) {
const envelopeBuilder = inputContents[0];
const envelopeParams = envelopeBuilder.envelopeParams() || ENVELOPE_DEFAULTS;
const synth = new Synth({
volume: 0,
oscillator: {
type: "amtriangle",
harmonicity: 0.5,
modulationType: "sine"
},
envelope: envelopeParams,
portamento: this.pv.portamento
});
const audioBuilder = new AudioBuilder();
audioBuilder.setInstrument(synth);
this.setAudioBuilder(audioBuilder);
}
}