A powerful feature of the options object is that you can not only assign a constant value to a property, but a lambda function in the form (tick, options) => ... as well.
This makes it possible to create dynamic properties that change over time.
dittytoy.net/syntax#options
dittytoy.net/syntax#portamento
#dittytoy #tutorial
Log in to post a comment.
// #05 Advanced Options. DittyToy 2022. // The MIT License. // // https://dittytoy.net/ditty/4ce1fc3837 // // A powerful feature of the options object is that you can not only assign a constant value to a property, but a // lambda function in the form (tick, options) => ... as well. // This makes it possible to create dynamic properties that change over time, which makes it very easy to create a // portamento or a Shepard tone. // // The note argument of the play call on a synthesizer definition is, behind the scenes, an option property as well // (it is an alias for options.note). This also makes it possible to use a lambda function instead of a fixed midi number // when triggering the play call. // // https://dittytoy.net/syntax#options // https://dittytoy.net/syntax#portamento // const tri = synth.def( (phase, env) => { const v = (phase % 1) * 4; return (v < 2 ? v - 1 : 3 - v) * env.value }, { attack: 0.0125, release: 0.25, amp: 0.8 }); loop( (loopCount) => { sine.play(d3, { attack: 0.025, release: 24, amp: (tick, options) => 0.6 + 0.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: (tick, options) => Math.sin(ditty.time)}); sleep(0.25); }); } sine.play(g3, { attack: 0.025, release: 8, amp: (tick, options) => 0.6 + 0.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 => { // And, the .play and loop funtions return an object with options, // that can be used to change specific values (at a later time) if(note) { const foo = tri.play(note); foo.options.pan = Math.sin(ditty.time); } sleep(0.25); }); } }, { name: 'melody' });