/* Simple wave table VCO. Author: Leonardo Laguna Ruiz - leonardo@vult-dsp.com Check the API documentation in the basic.vult example */ fun pitchToFreq(cv) @[table(size=128, min=-10.0, max=10.0)] { return 261.6256 * exp(cv * 0.69314718056); } // Generates (at compile time) a wave table based on the provided harmonics // To change the wave table, change the 'harmonics' array fun wavetable(phase) @[table(size=128, min=0.0, max=1.0)] { val harmonics = [0.0, 1.0, 0.7, 0.5, 0.3]; val n = size(harmonics); val acc = 0.0; val i = 0; while(i < n) { acc = acc + harmonics[i] * sin(2.0 * pi() * real(i) * phase); i = i + 1; } return acc / sqrt(real(n)); } fun process(input_cv:real) { mem phase; val knob_cv = getKnob(1) - 0.5; val cv = 10.0 * (input_cv + knob_cv); val freq = pitchToFreq(cv); val delta = sampletime() * freq; phase = phase + delta; if(phase > 1.0) { phase = phase - 1.0; } return wavetable(phase); } and update() { }