peterpanman3 It's encouraging to see that there are people who know what they're doing that are willing to help others who are clueless (talking about myself, haha).
That is why I am less clueless than when I started doing this stuff 🙂. Josep Andreu who started Rakarrack was a big help to me. Paul Nasca was a big inspiration though vicariously since I never really communicated with him directly (much of Rakarrack DSP comes from ZynAddSubFX synthesizer, mostly written by Paul Nasca).
As for hardware, I'm using this as a mono processor. There are 2 series FX chains:
1 channel is for stuff you typically put ahead of distortion boxes such as wah, compressor and EQ. The second channel is for the things you would put after distortion boxes, such as delay, flange, reverb, more EQ, Tremolo.
Follow the comments in the render() function to see what is processed in what channel. My ultimate goal is to make this user-configurable but for now it is hard-coded.
Here is how I use it:
Guitar->Buffer->Ch0-IN->DSP->Ch0-OUT->Amp_Input->Preamp->Amp_FX_Send->Ch1-IN->DSP->Ch1-OUT->Amp_FX_Return
So I have 4 cables:
1) guitar to Bela
2) Bela to amp input
3) Amp FX send to Bela
4) Bela to Amp FX return
That makes Bela CH0-OUT and CH1-IN behave as a send-return pair respectively.
The current implementation has 3 pushbutton switches:
1) Select FX
2) On/Bypass Currently Selected FX
3) FX control page (switches what parameters are controlled by the pots)
6 ADC channels are connected to pots and one is connected to the wah pot in a wah shell for pedal control (currently only implemented in the wah).
[EDIT] For more detail about example pot connection look at this sketch:
https://patchstorage.com/dynamic-range-compressor-feedback-topology/
(the code is also a helpful example for how to implement the effects since it is simplified down to a single effect)
The main trick to this configuration is related to the voltage reference buffer that feeds the REF pin. The buffered REF voltage will keep noise on the pots lower but it's good not to push it's max source current capability or it will lose control and get more noisy. The 4.7k pull-up resistor helps it out so the REF buffer doesn't have to work very hard to keep the REF voltage tightly controlled. The capacitor further helps rejecting higher frequency noise from +5V that can't be rejected due to the REF buffer limited bandwidth.
[/EDIT]
The following thread will give you some ideas for various ways to buffer and process signals coming into and out of Bela:
https://forum.bela.io/d/730-audio-input-maximum-voltage-and-input-buffer/11
You can plug your guitar directly into Audio inputs and take the outputs to your amp and it sounds fine. The rest of this stuff just helps make it sound a little more hi-fi.
Just a warning that my coding style is probably not a good place to learn programming habits. As for programming, I'm self-taught -- anything I do correctly is a result of learning from code that is done correctly so you will be better served learning programming practices from a good text on C or C++. At the same time I do think that brushing up on your C will help you navigate my code. Once you pick up the pattern for how I am doing things on one effect then you will find it easier to make sense of the rest.
The most simple no-frills effects would be either the tremolo, wah or the dynamic range compressor. If you start with any of those three then you will more easily pick up the pattern and the rest will come more easily.
I have a little more confidence in my DSP core algorithms since they are largely inspired by a lot of different work done at CCRMA and I don't stray too far away from the beaten path.
The main deviation from conventional approaches is the wah. I derived the analog transfer function simplified to the 3rd-order effect for the classic Miller-Plunkett wah and applied a bilinear transform to the set of equations. This implementation allows you to define a circuit preset by looking at a schematic for any variant of the wah and enter resistor and capacitor values to approximate the response. If you look into the code you will see there are several default options already included. A task for further development would be an advanced user interface function allowing the user to tweak with these virtual component values directly.