This is a notebook tracking my ideas and progress in developing a specific kind of synthesizer.
I have an OP-1. I love it. It is beautiful in its simplicity and sounds amazing. I want to make something that also sounds amazing and is also extreme in its simplicity (and its okay if its ugly as can be). For me, simplicity also means inexpensive, so I'm going to see if I can design something out of simple components.
I have a list of things I want to exclude which helps guide what I'd like to include.
- No sampling! I want realtime synthesis. I want to generate sounds in as realtime as possible so that I can take advantage of analog inputs that modulate the waveforms.
- Not just a keyboard! I want variable analog inputs. Basically, I want to utilize potentiometers to modulate the waveforms in realtime.
- Not just sin() and cos()! I want extremely customizable synthesizer algorithms. I want to find very simple and beautiful sounding synth algorithms and see if I can tweak them to produce neat variations.
- No ADSR! Just simple continous waves. The volume knob can be used to manually make a ADSR effect (or maybe a theremin style sensor).
My first attempt which yielded something neat is the grain synth built from an Arduino. It sounds pretty good and uses only an Arduino, pots, and a speaker. The sound is good, but sort of low quality.
Another Arduino option is to use the Mozzi synthesizer. I'm not too impressed with the sounds on this and the extensibility. I think I'd like to try with Raspberry Pi audio.
Moving to a Linux based synth opens a lot of doors in terms of quality.
I've found that the PADsynth algorithm by Nasca Paul is quite beautiful. It can be made polyphonic, and can be made continuous (each is a repeatable unit). Still I'm trying to figure out:
- What kind of sounds can I get?
There are a lot of things that can be done, especially in generating formants. For example, the simple chord uses the following formant distribution.
- Can samples be swapped in the middle?
- Should I pre-generate samples?
- How should the sound the outputted in realtime?
For the last question there are a number of possibilities:
- Use JACK realtime server (I tried this and it was painful to switch between pulseaudio and JACK and I also don't find JACK intuitive at all).
- Use ALSA (API seems to be pretty good)
- Use a Raspberry Pi with a MCP4725 (sampling rate may be too low)
- Try taking the barebones ALSA example and generate random int and try to play noise after converting int to unsigned char.
- Try overriding the min buffer for ALSA using to start ALSA immediately
- Try this example for a sine wave, and try modulating frequency "on the fly"
- To modulate "on the fly" keep "previous", "current", and "future" in memory