Really excited to start messing around with the Daisy. My programming knowledge is pretty much nonexistent but I built this little vowel generation tool using two SVF modules (one for each formant). Currently I have it set up expecting a sawtooth wave @ 140Hz on the input, but it could be easily adapted to use the onboard oscillator.
You can control the individual formants with the two knobs on the Pod.
Just flashed it, nice stuff!! If you like you can share your code on Github in the future, that way people will be able to grab the files and add to it, etc.
Uploaded the patch to Github and updated the original post!
Awesome! Can’t wait to try it out a bit later!
Hey @AsaLPatterson, if you want to experiment with vowel synthesis more, there’s some data in Faust libraries that could help. Those lists have central frequencies/gain levels/bandwidth that you could use for filters to get 5 vowels in 5 different vocal registers. Note that you would have to replace BP filter with HP followed by LP if you’d want to get adjustable bandwidth. There’s also simulation of male/female gender that sets different frequency limits and adjusts formant gains.
IIRC, original values were obtained from CSound sources.
You could get more interesting results by morphing between vowels with one parameters and voice types with another.
Also, current code is a bit weird regarding processing multiple channels. For some reason it uses input from every second channel and sends filtered results to both channels. Which means that using mono input on first channel would give you no output at all.
Note that if you’ll use true stereo filtering, you should be using separate pair of filters per channel. This is because filter uses state of the previous processing step, so you can share the same filters for different channels and get accurate results.
I was using Praat to find good center frequencies for the formants but that Faust list is exactly what I was looking for!
Thanks for the heads up about the code too, my background is in analog audio circuits and not DSP so I’m sure there’s probably a lot of other cases of me not following best practices…
Well then, it sounds like you might want to take a closer look at Faust. It’s got a huge DSP library and can be compiled on Daisy (it’s supposed to - my device has not arrived yet). It may seem a bit alien if you’re used to something like C/C++ and have to unlearn things. But for DSP coding for a new learner it may seem a more natural way to do thing - its code structure is built around data flow that is not unlike electricity flowing in a circuit.
This is amazing, thanks! Definitely seems like a better starting place than C/C++, although I do still want to get comfortable using those.
Faust code is typically compiled to C++ (but not strictly to it, there are other options for output) and it can make direct calls to foreign C functions (which is trivial to use for calling C++). So there’s interoperability and it goes both ways. Generally it’s great for prototyping things, than you can rewrite it in C++ if you choose to.
To make a patch for Daisy using Faust do you think the best approach is to compile to C++ and then tweak to run on the seed? Or is there a “faust2____” target script that is more adaptable than just compiling in C++?
The example @antisvin shared is an initial test of a generator for FAUST (faust2dsy) that will be able to generate the example code from FAIST as well. This should be coming along pretty soon.