vincentiuș
Active member
Hey, I am trying to make a project and more precisely an VCO with CV for freq and CV for waveshape for now.
The design is made in the audio tool and the waveshape are fading between them via knob 1, freq via knob 2, etc.
The problem encountered is the lack of stability of the frequency, as you can see in this short video for SQR shape..
Video issue:
[video]https://drive.google.com/open?id=0B3N82IlvifmDTjAxYm43dDB1eFE[/video]
Maybe my code is not well done or maybe something is missing, what do you recommend, should i add something else to my code or do i have to use some tricks To make it more stable? Any suggestions? Thanks!
The design is made in the audio tool and the waveshape are fading between them via knob 1, freq via knob 2, etc.
The problem encountered is the lack of stability of the frequency, as you can see in this short video for SQR shape..
Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
// GUItool: begin automatically generated code
AudioSynthNoiseWhite noise1; //xy=80,441
AudioSynthWaveform waveform1; //xy=85,69
AudioSynthWaveform waveform2; //xy=85,129
AudioSynthWaveform waveform3; //xy=85,195
AudioSynthWaveform waveform4; //xy=86,255
AudioSynthWaveform waveform6; //xy=87,379
AudioSynthWaveform waveform5; //xy=89,321
AudioSynthNoisePink pink1; //xy=91,589
AudioSynthWaveformSineModulated sine_fm1; //xy=95,501
AudioMixer4 mixer3; //xy=329,434
AudioMixer4 mixer2; //xy=331,281
AudioMixer4 mixer1; //xy=332.1428527832031,128.14285278320312
AudioOutputPT8211 pt8211_1; //xy=579,151
AudioConnection patchCord1(noise1, 0, mixer2, 3);
AudioConnection patchCord2(waveform1, 0, mixer1, 0);
AudioConnection patchCord3(waveform1, sine_fm1);
AudioConnection patchCord4(waveform2, 0, mixer1, 1);
AudioConnection patchCord5(waveform3, 0, mixer1, 2);
AudioConnection patchCord6(waveform4, 0, mixer2, 0);
AudioConnection patchCord7(waveform6, 0, mixer2, 2);
AudioConnection patchCord8(waveform5, 0, mixer2, 1);
AudioConnection patchCord9(pink1, 0, mixer3, 2);
AudioConnection patchCord10(pink1, 0, mixer3, 1);
AudioConnection patchCord11(pink1, 0, mixer3, 3);
AudioConnection patchCord12(sine_fm1, 0, mixer3, 0);
AudioConnection patchCord13(mixer3, 0, pt8211_1, 1);
AudioConnection patchCord14(mixer2, 0, mixer1, 3);
AudioConnection patchCord15(mixer1, 0, pt8211_1, 0);
// GUItool: end automatically generated code
const byte KnobPin = A0;
const byte NrParts = 7;
const unsigned int AnalogResolution = 4096;
const unsigned int PartRange = AnalogResolution / (NrParts - 1);
const unsigned int PartMax = 100;
float knobPartValues[NrParts];
void setup(){
Serial.begin(9600);
analogReadResolution(12);
AudioMemory(36);
waveform1.begin(WAVEFORM_SINE);
waveform2.begin(WAVEFORM_TRIANGLE);
waveform3.begin(WAVEFORM_SAWTOOTH);
waveform4.begin(WAVEFORM_SQUARE);
waveform5.begin(WAVEFORM_SAWTOOTH_REVERSE);
waveform6.begin(WAVEFORM_PULSE);
pink1.amplitude(1.0);
noise1.amplitude(1.0);
waveform1.amplitude(1.0);
waveform2.amplitude(1.0);
waveform3.amplitude(1.0);
waveform4.amplitude(1.0);
waveform5.amplitude(1.0);
waveform6.amplitude(1.0);
waveform6.pulseWidth(0.4);
sine_fm1.amplitude(1.0);
//pwm1.amplitude(1.0);
}
void loop(){
const unsigned int KnobValue = analogRead(KnobPin);
//Serial.print(F("KnobValue: "));
//Serial.println(KnobValue);
for(byte i = 0; i < NrParts; i++){
//not yet passed
if(KnobValue + PartRange <= i * PartRange){
knobPartValues[i] = 0;
}
//rising
else if(KnobValue < (i * PartRange) ){
knobPartValues[i] = map(KnobValue, (i - 1) * PartRange, i * PartRange - 1, 0, PartMax) / (float)PartMax;
}
//falling
else if(KnobValue < ((i + 1) * PartRange) ){
knobPartValues[i] = map(KnobValue, i * PartRange, (i + 1) * PartRange - 1, PartMax, 0) / (float)PartMax;
}
//passed
else{
knobPartValues[i] = 0;
}
}
mixer1.gain(0, knobPartValues[6]);
mixer1.gain(1, knobPartValues[5]);
mixer1.gain(2, knobPartValues[3]);
mixer1.gain(3,1.00);
mixer2.gain(0, knobPartValues[4]);
mixer2.gain(1, knobPartValues[2]);
mixer2.gain(2, knobPartValues[1]);
mixer2.gain(3, knobPartValues[0]);
mixer3.gain(0, knobPartValues[6]);
mixer3.gain(1, knobPartValues[5]);
mixer3.gain(2, knobPartValues[3]);
mixer3.gain(3, 0.00);
float knob2 = (float)analogRead(A1) / 1023.0;
float knob3 = (float)analogRead(A2) / 1023.0;
// float knob4 = (float)analogRead(A3) / 1023.0;
// pwm1.frequency(knob4);
waveform1.frequency(360 * knob2 + 0.25);
sine_fm1.frequency(knob3 * 1500 + 50);
waveform1.frequency(360 * knob2 + 0.25);
waveform2.frequency(360 * knob2 + 0.25);
waveform3.frequency(360 * knob2 + 0.25);
waveform4.frequency(360 * knob2 + 0.25);
waveform5.frequency(360 * knob2 + 0.25);
waveform6.frequency(360 * knob2 + 0.25);
Serial.println(KnobValue);
Serial.print(" ");
Serial.print(knobPartValues[6]);
Serial.print(" ");
Serial.print(knobPartValues[5]);
Serial.print(" ");
Serial.print(knobPartValues[4]);
Serial.print(" ");
Serial.print(knobPartValues[3]);
Serial.print(" ");
Serial.print(knobPartValues[2]);
Serial.print(" ");
Serial.print(knobPartValues[1]);
Serial.print(" ");
Serial.print(knobPartValues[0]);
Serial.print(" knob:");
}
Video issue:
[video]https://drive.google.com/open?id=0B3N82IlvifmDTjAxYm43dDB1eFE[/video]
Maybe my code is not well done or maybe something is missing, what do you recommend, should i add something else to my code or do i have to use some tricks To make it more stable? Any suggestions? Thanks!