#09 Input Parameters

You can add input parameters to your ditty by adding the following comment after the declaration of a input parameter:

input.xxx; // value=y, min=y, max=y, step=y

When one or more input parameters are defined, a block with sliders is visible at the left of your ditty.

dittytoy.net/syntax#input-parameters

#dittytoy #tutorial


Log in to post a comment.

// #09 Input Parameters. DittyToy 2022.
// The MIT License.
//
// https://dittytoy.net/ditty/90607d08dc
//
// You can add input parameters to your ditty by adding the following comment after the declaration of a input parameter:
//
// input.xxx; // value=y, min=y, max=y, step=y
//
// When one or more input parameters are defined, a block with sliders is visible at the left of your ditty.
//
// https://dittytoy.net/syntax#input-parameters
//

// melody synth

input.synth0Osc1 = 3; // min=0, max=3, step=1 (Sin, Saw, Square, Tri)
input.synth0Osc1offset = 0; // min=0, max=36, step=0.01 
input.synth0Osc1xenv = 0; // min=0, max=1, step=0.01
input.synth0Osc1vol = 0.9; // min=0, max=1, step=0.01
input.synth0Osc2 = 2; // min=0, max=3, step=1 (Sin, Saw, Square, Tri)
input.synth0Osc2offset = 16; // min=0, max=36, step=0.01
input.synth0Osc2xenv = 0; // min=0, max=1, step=0.01
input.synth0Osc2vol = 0.05; // min=0, max=1, step=0.01
input.synth0Osc2det = 0.2; // min=0, max=1, step=0.01
input.synth0NoiseVol = 0; // min=0, max=1, step=0.01


// bass synth

input.synth1Osc1 = 3; // min=0, max=3, step=1 (Sin, Saw, Square, Tri)
input.synth1Osc1offset = 0; // min=0, max=36, step=0.01 
input.synth1Osc1xenv = 0; // min=0, max=1, step=0.01
input.synth1Osc1vol = 0.7; // min=0, max=1, step=0.01
input.synth1Osc2 = 0; // min=0, max=3, step=1 (Sin, Saw, Square, Tri)
input.synth1Osc2offset = 0; // min=0, max=36, step=0.01
input.synth1Osc2xenv = 0.3; // min=0, max=1, step=0.01
input.synth1Osc2vol = 0.3; // min=0, max=1, step=0.01
input.synth1Osc2det = 0.2; // min=0, max=1, step=0.01
input.synth1NoiseVol = 0; // min=0, max=1, step=0.01


// tick

input.synth2Osc1 = 3; // min=0, max=3, step=1 (Sin, Saw, Square, Tri)
input.synth2Osc1offset = 0; // min=0, max=36, step=0.01 
input.synth2Osc1xenv = 0; // min=0, max=1, step=0.01
input.synth2Osc1vol = 0.1; // min=0, max=1, step=0.01
input.synth2Osc2 = 0; // min=0, max=3, step=1 (Sin, Saw, Square, Tri)
input.synth2Osc2offset = 0; // min=0, max=36, step=0.01
input.synth2Osc2xenv = 1; // min=0, max=1, step=0.01
input.synth2Osc2vol = 0.5; // min=0, max=1, step=0.01
input.synth2Osc2det = 0; // min=0, max=1, step=0.01
input.synth2NoiseVol = 0.1; // min=0, max=1, step=0.01

const oscillators = [
    (value) => Math.sin(value * (Math.PI * 2)),
    (value) => 2 * (value % 1) - 1,
    (value) => (value % 1) < 0.5 ? 1 : -1,
    (value) => {
        const v = (value % 1) * 4;
        return v < 2 ? v - 1 : 3 - v;
    }
];

const osc = synth.def(
    class {
        constructor(options) {
            this.phase1 = 0;
            this.phase2 = 0;
        }
        process(note, env, tick, options) {
            this.phase1 += midi_to_hz(note + options.osc1offset) * ditty.dt * (env.value ** options.osc1xenv);
            this.phase2 += midi_to_hz(note + options.osc2offset) * ditty.dt * (1 + options.osc2det) * (env.value ** options.osc2xenv);
            
            let sample = oscillators[options.osc1](this.phase1) * options.osc1vol;
            sample    += oscillators[options.osc2](this.phase2) * options.osc2vol;
          
            if (options.noiseVol) {
                sample += (2 * Math.random() - 1) * options.noiseVol;
            }
            
            return sample * env.value;
        }
    }, { osc1: 0, osc1offset: 0, osc1xenv: 0, osc1vol: 0.5,  osc2: 0, osc2offset: 0, osc2xenv: 0, osc2vol: 0.5, osc2det: 0, noiseVol: 0 }
);

loop( (loopCount) => {
    const note = scale(c3, scales.minor_pentatonic, 2).ring(loopCount);
    osc.play(note, { 
        pan: Math.random() * 2 - 1, 
        attack: 0.02,
        amp: 0.5,
        osc1: () => input.synth0Osc1, 
        osc1offset: () => input.synth0Osc1offset,  
        osc1xenv: () => input.synth0Osc1xenv,  
        osc1vol: () => input.synth0Osc1vol, 
        osc2: () => input.synth0Osc2, 
        osc2offset: () => input.synth0Osc2offset, 
        osc2xenv: () => input.synth0Osc2xenv, 
        osc2vol: () => input.synth0Osc2vol, 
        osc2det: () => input.synth0Osc2det, 
        noiseVol: () => input.synth0NoiseVol });
    sleep(Math.random() < 0.5 ? 0.25 : 0.5);
});


loop( (loopCount) => {
    const note = scale(c2, scales.minor_pentatonic, 1).choose();
    osc.play(note, { 
        pan: Math.random() * 2 - 1, 
        attack: 0.01,
        release: 0.5,
        osc1: () => input.synth1Osc1, 
        osc1offset: () => input.synth1Osc1offset,  
        osc1xenv: () => input.synth1Osc1xenv,  
        osc1vol: () => input.synth1Osc1vol, 
        osc2: () => input.synth1Osc2, 
        osc2offset: () => input.synth1Osc2offset, 
        osc2xenv: () => input.synth1Osc2xenv, 
        osc2vol: () => input.synth1Osc2vol, 
        osc2det: () => input.synth1Osc2det, 
        noiseVol: () => input.synth1NoiseVol });
    sleep(Math.random() < 0.5 ? 0.25 : 0.5);
});



loop( (loopCount) => {
    osc.play(c4, {
        attack: 0.01,
        release: 0.05,
        amp: loopCount % 4 == 0 ? 1 : 0.25,
        osc1: () => input.synth2Osc1, 
        osc1offset: () => input.synth2Osc1offset,  
        osc1xenv: () => input.synth2Osc1xenv,  
        osc1vol: () => input.synth2Osc1vol, 
        osc2: () => input.synth2Osc2, 
        osc2offset: () => input.synth2Osc2offset, 
        osc2xenv: () => input.synth2Osc2xenv, 
        osc2vol: () => input.synth2Osc2vol, 
        osc2det: () => input.synth2Osc2det, 
        noiseVol: () => input.synth2NoiseVol });
    sleep(0.25);
});