blog: ElectroSmash pedalShield Distortion Pedal

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 previous work.

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


  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

  //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.




so that the loudness/volume does not get reduced.

Posted in Hacking Arduino Music
2015-07-04 21:42