Formants & Filtering & Phase Coherence
How many formants do you need to cover most of the organic synthesis bases (without getting into crazy territory like ride / crash cymbals)? The D-Lev once had 6 pitch and volume modulated formants. I changed this a while back to 3 modulated and and 9 static formants for a total of 12, but I've had this feeling that these (ratio and total) could benefit from more thought. Human vocals need ~4 static formants, and dynamic vowels only require one or two of these to be modulated. My "eerie" preset used six modulated formants and no static formants, but one could argue that it's more of a "woo-woo" than organic preset.
I've been using a six (static) formant cello for a while now which is augmented on the top end by an inharmonic resonator, and thought at one point that it would benefit from a larger quantity of explicit formants, but this hasn't been the case. Making a cello with formants alone clearly doesn't yield as good a quality voice as the formant / resonator combination, and I've long wondered why that was. The way I "tune" this formant / resonator combo is by observing white noise passed through them on the spectrum analyzer in Adobe Audition. I set the bottom formant to the known lowest instrument resonance, with the rest spaced roughly exponentially up to 1kHz or so, and then I play with the resonator high pass filter and other settings to try to blend the transition of the two groups of resonant peaks. There is an obvious phase difference that produces a dip or null at the transition, and in the past I've endeavored to minimize this, but have since come to realize that this "accidental" null is an essential component of the cello sound. Indeed, string filters often have an additional global shaping filter which contains a deep notch.
On the D-Lev there are many enables and modes associated with the formants and resonator, many of which switch the audio off entirely, requiring one to sometimes go on a "knob hunt" to find the source of the constipation. Now that the "push to zero out" feature has been implemented for all encoders, many of these switching features aren't as useful nor necessary, so I've been able to considerably simplify them. I removed an ~80 cycle knob that sequentially enabled the formants, and replaced it with a 16 cycle ORing of all formant knobs, which produces a testable flag that, if false, bypasses the formant bank. And now zeroing the resonator knobs puts it in parallel mode (in parallel with the formants) and kills the resonator output, which removes it from the signal path without killing the signal. I also added a 180 degree phase inversion mode to the resonator, to help it blend better with the formants (should one desire that for non-cello voices).
The removal of one crummy knob, the formant enable, has opened up a world of new UI possibilities for the formant section. I decided to do 4 mod formants and 4 static formants, with 1 mod and 1 static per UI page, and all pages identical (except for the page identifier text on the LCD). This makes the resonance knob common to 2 formants instead of 3, which is finer grained. And it lops one page off the UI, which is always good. I feel pretty OK with 8 formants total, and with the 50/50 mix of mod and static. Things you can't know up-front in a design...
Implementing the bass and treble controls made me wonder if I could do parametric boost / cut with the oscillator and noise filters. There was room for an additional knob (!), and it looked good in simulation. But in use, half of the modes felt redundant (boost low-pass ~= cut hi-pass, etc.), and cut associated with bandpass doesn't function well at higher resonance settings (the cut reverses and turns back into a boost). So keeping the current selector knob (-4=notch2, -3=lp2, -2=bp2, -1=hp2, 0=thru, 1=hp4, 2=bp4, 3=lp4, 4=notch4) and implementing just the boost side (which is a simple 5 cycle cross-fade of the I/O of each 2nd order section) adds versatility to filter shaping without significantly increasing confusion.
I've probably said this before, but you need 2nd order filtering before anything interesting starts to happen, and having 4th order on tap is quite powerful. There are clear use cases for both 2nd and 4th order filtering, but I don't believe a 3rd order option would be all that useful. Things no one tells you...
Finally, I re-examined the transfer of DSP data between threads and took steps to ensure this was being done in a phase / delay coherent manner. You basically sequentially read all inputs at the start of processing and then sequentially write the outputs at the end. With interleaved thread interrupts and dynamic processing, the transfer could possibly bobble by one sample and cause glitching, but all inputs or outputs would bobble together as long as they are done in the same order and with the same timing on both ends - and this is a different problem than coherence.
[EDIT] Trying to get my eerie patch back: [MP3]