input.gamma = 3.0; // min=3, max=3.999, step=0.01 input.attack = 0.04; // min=0.01, max=1, step=0.01 input.decay = 0.16; // min=0.01, max=1, step=0.01 input.sustain = 0.8; // min=0.01, max=1, step=0.01 input.release = 0.1; // min=0.01, max=1, step=0.01 const logisticMap = synth.def(class { constructor(options) { this.x0 = 0.5; this.x1 = 0.5; this.downsample = 1 / (2 * midi_to_hz(options.note) * ditty.dt); this.spl = this.downsample; } process(phase, env, tick, options) { const gamma = lerp(3, options.gamma, env.value); if(--this.spl <= 0) { this.spl += this.downsample; this.x0 = gamma * this.x0 * (1-this.x0); this.x1 = gamma * this.x1 * (1-this.x1); } const fixpoint = (gamma-1) / gamma; return [(this.x0 - fixpoint) * env.value, (this.x1 - fixpoint) * env.value]; } }, {gamma:3.3}); const nn = [c4,g4,d5,e5,a3,c5,e4,c5]; loop( (i) => { let gamma = input.gamma != 3.0 ? input.gamma : (1.999*Math.abs((i/200+0.5)%1 - 0.5) + 3); debug.warn("gamma",gamma); logisticMap.play(nn.ring(i), { attack: () => input.attack, decay: () => input.decay, sustain: () => input.sustain, release: () => input.release, duration:1, gamma:gamma }); sleep(0.5); });