You may want to define a more complicated synthesizer that has its own state. This can be done by passing not a lambda function but a class to synth.def().
The process method will be called at a ditty.dt time interval and should return a value -1 to 1 (mono) or an array [l, r] (both -1 to 1) for stereo.
dittytoy.net/syntax#synthesizers
#dittytoy #tutorial
Log in to post a comment.
// #06 Advanced Synths. DittyToy 2022.
// The MIT License.
//
// https://dittytoy.net/ditty/82860b6d28
//
// You may want to define a more complicated synthesizer that has its own state.
// This can be done by passing not a lambda function but a class to synth.def().
//
// The process method will be called at a ditty.dt time interval and should return a value -1 to 1 (mono),
// or an array [l, r] (both -1 to 1) for stereo.
//
// https://dittytoy.net/syntax#synthesizers
//
const osc = synth.def(
class {
constructor(options) {
// The value of the note argument of the play call is retrievable via options.note.
this.phase = 0;
}
process(note, env, tick, options) {
this.phase += midi_to_hz(note) * ditty.dt * (env.value ** options.xenv);
return Math.sin(this.phase * Math.PI * 2) * env.value;
}
}, { xenv: 0.5, amp: 1, attack: 0.01, release: 0.3, env: adsr2 }
);
loop( (loopCount) => {
scale(c3, scales.major, 2).forEach( note => {
osc.play(note, { pan: Math.random() * 2 - 1 });
sleep(0.25);
});
});