//add a honky tonky piano effect. Updates only after a complete loop input.honkyTonky = .05 //min=0, max=.3 step=.05 //make it electric! input.overdriveLevel = 1 //min=1, max=30 step=.1 // // RTFM You can find the DittyToy API Reference here: https://dittytoy.net/syntax // const harpsichord = synth.def(class { constructor(options) { this.phases = Array.from({length: 24}, () => 0); } process(note, env, tick, options) { let freq = midi_to_hz(note); this.phases = this.phases.map((v, i) => v + freq * (i+1) * ditty.dt); return this.phases.map(p => Math.sin(p * Math.PI * 2) * env.value).reduce((p, c) => p+c, 0) / this.phases.length; } }, { name: 'harpsichord', release: .4, env: adsr2 }); const overdrive = filter.def( (input, options) => [...input.map(i => clamp(i * options.level, -1, 1))], { level: 1 }); ditty.bpm = 80; // Adapted from Bach's Cello Suite No. 1 in G Major BWV 1007, copied from https://dittytoy.net/ditty/0c920dd635 let melody = [d3,a3,fs4,e4,fs4,a3,fs4,a3, d3,a3,fs4,e4,fs4,a3,fs4,a3, d3,b3,g4,fs4,g4,b3,g4,b3, d3,b3,g4,fs4,g4,b3,g4,b3, d3,cs4,g4,fs4,g4,cs4,g4,cs4, d3,cs4,g4,fs4,g4,cs4,g4,cs4, d3,b3,fs4,e4,fs4,d4,cs4,d4, b3,d4,cs4,d4,fs3,a3,gs3,fs3, gs3,d4,e4,d4,e4,d4,e4,d4, gs3,d4,e4,d4,e4,d4,e4,d4, cs4,e4,a4,gs4,a4,e4,d4,e4, cs4,e4,d4,e4,a3,cs4,b3,a3, b2,fs3,d4,cs4,d4,fs3,d4,fs3, b2,fs3,d4,cs4,d4,fs3,d4,fs3, b2,gs3,a3,b3,a3,gs3,fs3,e3, d4,cs4,b3,a4,gs4,fs4,e4,d4, a2,b3,cs4,a4,e4,a4,cs4,e4, g4,b3,cs4,e4,g4,e4,cs4,a3, ]; loop( (count, options) => { melody.forEach(note => { [note].forEach((n, i) => { harpsichord.play(n + 6 + (Math.random() * options.honkyTonky), {amp:(Math.random() + 0.5 + (i%8==0?0.8:0)) * .5, pan:0.5 * (2*((n*0.618)%1)-1)}); sleep(0.25); }); }) }, { name: 'right_hand', honkyTonky: () => input.honkyTonky } ).connect(overdrive.create({level: () => input.overdriveLevel})); loop( (count, options) => { melody.reduce((p, c, ci, a) => { if(ci % 4 == 0) { p.push([c]); } else if(ci % 4 == 1 && (ci < 116 || 128 < ci) ) { p[p.length - 1].push(c); } return p; }, []).forEach(chord => { chord.forEach(n => { harpsichord.play(n + (Math.random() * options.honkyTonky) - 6, { release: 1.5, amp: .5 }) }); sleep(1); }); }, { name: 'left_hand', honkyTonky: () => input.honkyTonky } ).connect(overdrive.create({level: () => input.overdriveLevel}));