Exploring paraphony options
In this post I'm exploring some ways how paraphony can be implemented in the context of a DCO based synth. I go from the simplest solution to the more complex ones, gradually increasing complexity.
#1: The minimal version
This is the simplest way to implement paraphony. The basic idea is that all voices (DCOs in my case) are always on, they are mixed and routed into a filter. The filter then goes into a VCA which is controlled by an envelope generator. The envelope generator can be either digital through a DAC or analog. I try digital first because that's more exciting and new to me, but if the Pico can't handle everything then I'll simply go with any analog ADSR.
The microcontroller sets the frequency of the DCOs and it distrubutes the incoming MIDI notes amongst the DCOs equally. That means that if a single note is played then all DCOs play the same note, if two different notes are played then 2x3 voices play the same pitch and so on—up to 6 different notes where all voices play different pitches.
The electronics and the code of this solution are very simple, however there is an obvious drawback: because the voices stack up, the overall timbre of the synth might change depending on the number of different notes played. Additionally there's a chance that a single note will be significantly louder than e.g. a chord of multiple notes, although this can be compensated by decreasing the DCO charge voltages for fewer notes.
You can hear this setup with three voices in this video:
The first prototype
I'll prototype a drastically minimal version of this first. I'm most interested in how one note with 6 simultaneous voices sounds compared to a chord. To focus only on this question, I'm not going to include the filter in the proto and instead of a full ADSR implementation I'll simply use the gate output of the Keystep.
The next level is that there is some kind of enveloper control per voice. There are multiple options for that too.
#2: Using the amplifier compensation as an envelope generator for each DCA
DCOs have a problem that as the frequency goes up the amplitude decreases (read about it here). To overcome this the microcontroller dynamically amplifies the signal with the frequency.
The schematics below shows a part of the DCO where the voltage on the AMP
input changes the how much capacitor C3 is charged before resetting it: the higher the voltage, the louder the voice.
My idea is that this AMP
input could be used as to change the volume of the DCOs individually according to an digitally created envelope (PWM or DAC).
First I'd use PWM (pulse width modulation) on the Pico to set this voltage, however I'm very sceptical about being able to generate a usable envelope with PWM. So as an alternative I'll try to use proper DACs to set the amplitude compensation voltage. We'll see, I might not even get here if the minimal version above works out well.
#3: Adding VCAs to each voice
This version is much closer to proper polyphony, where it's possible to control the volume of each voice individually—ie. each voice has its own VCA. This sounds great but the system also needs an envelope for each VCA. And because there's a single setting for all envelopes it has to be digital. I think the Rpi Pico would be able to handle three dual DACs and all DCOs at the same time so this potentially could be a really nice solution. Again, we'll see.
The Moog Matriarch works like the above, Cuckoo presents it really well:
These are the options for paraphony that I can think of right now. As I said, I'll start with the simplest and go more complex as needed.
BTW I started a repo for the project. The first version of the schematics are already available but obviously I just started cooking and everything will change fo sho.