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);
 }
Exemplo n.º 2
0
 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
 }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
 void buttonChanged(PatchButtonId bid, uint16_t value, uint16_t samples){
   if(bid == PUSHBUTTON){
     eg1.gate(value, samples);
     eg2.gate(value, samples);
   }
 }
Exemplo n.º 6
0
 void gate(bool state){
   env.gate(state);
 }
Exemplo n.º 7
0
 float getNextSample(float fm){
   return env.getNextSample()*index*osc.getNextSample(fm);
 }
Exemplo n.º 8
0
 void setEnvelope(float a, float d, float s, float r){
   env.setAttack(a);
   env.setDecay(d);
   env.setSustain(s);
   env.setRelease(r);
 }