Define your own envelope using env.def, by setting a class that implements a duration and a value method.
Based on gist.github.com/samaaron/3f41f913bf6d1b6bf036 by @samaaron
dittytoy.net/syntax#envelopes
#dittytoy #tutorial
Log in to post a comment.
// #07 Envelopes. DittyToy 2022.
// The MIT License.
//
// https://dittytoy.net/ditty/24fb0f9063
//
// Define your own envelope using env.def, by setting a class that implements a duration and a value method.
//
// https://dittytoy.net/syntax#envelopes
//
// Create a sin-envelope
const sinenv = env.def(
class {
duration(options) { // duration in ticks
return options.duration;
}
value(tick, options) {
return .5 - .5 * Math.cos(tick / options.duration * 2 * Math.PI);
}
},
{ duration: 1, name: 'sinenv' }
);
// You can set the envelope type using the env option (both in the default options of a synth, and when you play a note)
const tri = synth.def( (phase, env) => { const v = (phase % 1) * 4; return (v < 2 ? v - 1 : 3 - v) * env.value }, { duration: 0.5, env: sinenv, amp: .75 });
ditty.bpm = 130;
loop( () => {
sine.play(d3, { attack: 0.025, release: 24, amp: (tick) => .75 + .5 * Math.sin(tick * Math.PI * 4), env: adsr2 });
for (let i=0; i<6; i++) {
[d, 0, 0, a, f5, 0, a, 0].forEach( note => {
if(note) tri.play(note, { pan: Math.random() * 2 - 1 });
sleep(.25);
});
}
sine.play(g3, { attack: 0.025, release: 8, amp: (tick) => .75 + .5 * Math.sin(tick * Math.PI * 4), env: adsr2 });
for (let i=0; i<2; i++) {
[d, 0, 0, Bb, g5, 0, Bb, 0].forEach( note => {
if(note) tri.play(note, { pan: Math.random() * 2 - 1 });
sleep(.25);
});
}
}, { name: 'melody' });