void processAudio(AudioBuffer &buffer) { float tune = getParameterValue(PARAMETER_A)*10.0 - 6.0; float fc = getParameterValue(PARAMETER_B)*10.0 - 4.0; float q = getParameterValue(PARAMETER_C)*3+0.75; float shape = getParameterValue(PARAMETER_E)*2; float pw = 0.5; if(shape > 1.0){ pw += 0.49*(shape-1.0); // pw 0.5 to 0.99 shape = 1.0; // square wave } float df = getParameterValue(PARAMETER_D)*4; int di = (int)df; float gain = 0.0f; switch(di){ // a/d case 0: // l/s env.setAttack(1.0-df); env.setRelease(0.0); break; case 1: // s/s env.setAttack(0.0); env.setRelease(df-1); break; case 2: // s/l env.setAttack(df-2); env.setRelease(1.0); break; case 3: // l/l env.setAttack(1.0); env.setRelease(1.0); gain = df-3; break; } env.trigger(isButtonPressed(PUSHBUTTON), getSamplesSinceButtonPressed(PUSHBUTTON)); FloatArray left = buffer.getSamples(LEFT_CHANNEL); FloatArray right = buffer.getSamples(RIGHT_CHANNEL); // vco hz.setTune(tune); float lfreq = hz.getFrequency(left[0]); osc.setFrequency(lfreq); osc.setShape(shape); osc.setPulseWidth(pw); osc.getSamples(left); // vcf hz.setTune(fc); fc = hz.getFrequency(right[0]); fc = min(0.999, max(0.01, fc/(getSampleRate()*2))); // normalised and bounded filter->setLowPass(fc, q); right.copyFrom(left); filter->process(right); right.multiply(0.8-q*0.2); // gain compensation for high q // vca env.getEnvelope(envelope); envelope.add(gain); left.multiply(envelope); right.multiply(envelope); }
DualASRPatch() : eg1(getSampleRate()), eg2(getSampleRate()) { registerParameter(PARAMETER_A, "Attack"); registerParameter(PARAMETER_B, "Release"); registerParameter(PARAMETER_C, "Attack"); registerParameter(PARAMETER_D, "Release"); eg1.setSustain(1.0); eg1.setDecay(0.0); eg2.setSustain(1.0); eg2.setDecay(0.0); }
SynthVoicePatch() : osc(getSampleRate()), env(getSampleRate()) { registerParameter(PARAMETER_A, "Pitch"); registerParameter(PARAMETER_B, "Fc"); registerParameter(PARAMETER_C, "Resonance"); registerParameter(PARAMETER_D, "Envelope"); registerParameter(PARAMETER_E, "Waveshape"); env.setSustain(1.0); env.setDecay(0.0); env.setRelease(0.0); envelope = FloatArray::create(getBlockSize()); filter = BiquadFilter::create(4); // 8-pole filter 48dB }
void processAudio(AudioBuffer &buffer){ eg1.setAttack(getParameterValue(PARAMETER_A)*2); eg1.setRelease(getParameterValue(PARAMETER_B)*2); eg2.setAttack(getParameterValue(PARAMETER_C)*2); eg2.setRelease(getParameterValue(PARAMETER_D)*2); FloatArray left = buffer.getSamples(LEFT_CHANNEL); FloatArray right = buffer.getSamples(RIGHT_CHANNEL); eg1.getEnvelope(left); eg2.getEnvelope(right); left.multiply(-1); right.multiply(-1); }
void buttonChanged(PatchButtonId bid, uint16_t value, uint16_t samples){ if(bid == PUSHBUTTON){ eg1.gate(value, samples); eg2.gate(value, samples); } }
void gate(bool state){ env.gate(state); }
float getNextSample(float fm){ return env.getNextSample()*index*osc.getNextSample(fm); }
void setEnvelope(float a, float d, float s, float r){ env.setAttack(a); env.setDecay(d); env.setSustain(s); env.setRelease(r); }