Hybrid Guitar Pedal project

Hello guys, I would like to share my guitar pedal project that took way too long…
The goal is to create an easy to use pedal that combines the flexibility of DSP and great analog gain stage.

Here’s the signal path:

Guitar Output → Input Buffer → Input 0 of Daisy → Daisy
( → Output 1 of Daisy → Analog Module → Input 1 of Daisy → Daisy) //optional
→ Output 0 of Daisy → Output Buffer

The Analog Module contains overdrive (Based on TS9), distortion (Based on DS-1), and a Tube Boost.
The digital portion is a Daisy Seed running Arduino code.

Some features:

  • A 128*64 Monochrome LCD and a 8*8 LED matrix for display. Both are connected to Daisy via SPI.
  • 5 push buttons, a rotary encoder, and 4 footswitches for control.
  • The knobs and mini switches on the right are for those analog modules.
  • 10 presets controlled by two footswitchs. (up and down) So the user can switch between 10 different effect combinations on the fly.
  • Each preset has 10 "effect slots", the user can insert any effects (including the analog module) anywhere they like and arrange them in any order.
  • Easy UI navigation with four arrow keys and an enter button.
  • Currently it has Reverb, Pitchshifter, Analog Module, Overdrive (digital), Fuzz (digital), Compressor, Gain, Delay, Chorus, and Flanger.
  • On/Off of each analog module can be controlled digitally via relays.
  • All presets and options are stored in an external EEPROM chip (via I2C), since I can't get the QSPI flash to work in Arduino.
  • IR based guitar amp simulation with 4 different IRs. IR data is stored in the EEPROM
  • All control inputs are handled by interrupts.

Here are some UI shots:
The Main menu:


The option menu:

The effect select screen:

Adjust individual parameters:

Future plans includes: guitar tuner, looper, smartphone control with bluetooth, and more effects.

The code is here on my GitHub.
I’m open to any suggestions and questions😀. I’m no expert in programming, so the code is quite janky, it may have many bugs, but it works fine for now. The Daisy platform is really easy to work with. Also the awesome DaisySP and other Arduino libraries made this a lot easier.

12 Likes

This looks awesome! I have been struggling to save presets too and am excited to look at your EEPROM implementation.

Thanks for posting.

2 Likes

Hi, how did you save the float values of each parameter in the external eeprom? Are you just using the eep.write? Will it save the float values whether float or integer? thank you

Hi, I actually save my parameters as bytes in the external EEPROM. The “eep.write()” only writes a byte of data. Since 256 possible values for each param is enough for me, I store them as bytes and convert them to floats when I need them.
However, you can still save floats by slicing each of them into four bytes. That’s how I store the IR coefficients for the guitar amp simulator in the EEPROM. This can be done easily with a union:

typedef union{
    float fp;
    byte bin[4];
} binary_float;

Slice the float fp into four bytes bin[4], and store each of them. Just assemble them back together when you read the EEPROM and you get your float back.
This thread may help: How to Write float in external EEPROM - Programming Questions - Arduino Forum

Hi Jerry, this is very helpful. So you save 1 byte per eeprom address right?

Yes. Each address is one byte away from each other.

1 Like

Thank you so much Jerry.