A while ago, ElectroSmash released a pedalShield which makes the Arduino Due a programmable guitar effects pedal.
The forum website offers a lot of example programs, one of which is the (asymmetric) distortion pedal:
// Licensed under a Creative Commons Attribution 3.0 Unported License.
// Based on rcarduino.blogspot.com previous work.
// www.electrosmash.com/pedalshield
int in_ADC0, in_ADC1; //variables for 2 ADCs values (ADC0, ADC1)
int POT0, POT1, POT2, out_DAC0, out_DAC1; //variables for 3 pots (ADC8, ADC9, ADC10)
const int LED = 3;
const int FOOTSWITCH = 7;
const int TOGGLE = 2;
int upper_threshold, lower_threshold;
void setup()
{
//ADC Configuration
ADC->ADC_MR |= 0x80; // DAC in free running mode.
ADC->ADC_CR=2; // Starts ADC conversion.
ADC->ADC_CHER=0x1CC0; // Enable ADC channels 0,1,8,9 and 10
//DAC Configuration
analogWrite(DAC0,0); // Enables DAC0
analogWrite(DAC1,0); // Enables DAC1
}
void loop()
{
//Read the ADCs
while((ADC->ADC_ISR & 0x1CC0)!=0x1CC0);// wait for ADC 0, 1, 8, 9, 10 conversion complete.
in_ADC0=ADC->ADC_CDR[7]; // read data from ADC0
in_ADC1=ADC->ADC_CDR[6]; // read data from ADC1
POT0=ADC->ADC_CDR[10]; // read data from ADC8
POT1=ADC->ADC_CDR[11]; // read data from ADC9
POT2=ADC->ADC_CDR[12]; // read data from ADC10
upper_threshold=map(POT0,0,4095,4095,2047);
lower_threshold=map(POT1,0,4095,0000,2047);
if(in_ADC0>=upper_threshold) in_ADC0=upper_threshold;
else if(in_ADC0<lower_threshold) in_ADC0=lower_threshold;
if(in_ADC1>=upper_threshold) in_ADC1=upper_threshold;
else if(in_ADC1<lower_threshold) in_ADC1=lower_threshold;
//adjust the volume with POT2
out_DAC0=map(in_ADC0,0,4095,1,POT2);
out_DAC1=map(in_ADC1,0,4095,1,POT2);
//Write the DACs
dacc_set_channel_selection(DACC_INTERFACE, 0); //select DAC channel 0
dacc_write_conversion_data(DACC_INTERFACE, out_DAC0);//write on DAC
dacc_set_channel_selection(DACC_INTERFACE, 1); //select DAC channel 1
dacc_write_conversion_data(DACC_INTERFACE, out_DAC1);//write on DAC
}
However, as you can see, this program clips the amplitudes to upper and lower thresholds, thereby effectively reducing the loudness more and more the higher you set the distortion.
Instead of mapping the ADC0 levels from [0,4095] to [1,POT2], I suggest taking the thresholds as mapping base, i.e.
out_DAC0=map(in_ADC0,0,4095,1,POT2);
out_DAC1=map(in_ADC1,0,4095,1,POT2);
becomes
out_DAC0=map(in_ADC0,lower_threshold,upper_threshold,1,POT2);
out_DAC1=map(in_ADC1,lower_threshold,upper_threshold,1,POT2);
so that the loudness/volume does not get reduced.
2015-07-04 21:42 UTC