Advanced Formant Filter in Reaktor
In this tutorial, I’ll begin building a formant filter in Reaktor. A formant filter is used to shape sounds into a spectrum that is similar to the human voice producing vowel sounds. As such, they can be used to create ‘talking’ synth lines (although the typical method to get such a sound is to use bit crushers).
Unfortunately, many synths do not contain formant filters, and Reaktor itself does not ship with one either, to my knowledge. I first encountered a formant filter in Thor, which is a part of Reason. They are a lot of fun!
This is an intermediate level tutorial, and it is assumed that the reader is familiar with my previous work on filter design in Reaktor, which can be found here. It is only necessary to read the first two or three. You may also want to make yourself familiar with Core if you are not already, there are some beginner tutorials here.
As I usually do with more complex topics, I’ll use this first tutorial to outline everything we want to accomplish, and most of the implementation will be covered in a follow-up tutorial next week.
WHAT IS A FORMANT?
A formant is defined as a peak in the spectral graph of the human voice. A picture is worth a thousand words:
This is the spectrum of a noise oscillator passing through a formant filter set to mimic the vowel ‘A’ in a soprano voice. The peaks in the graph are the frequencies that have been accentuated by the formant filter.
STRUCTURE OF A FORMANT FILTER
Recently, I made a members only video showing how to make a crude formant filter using a group of five Primary bandpass filters in parallel. With the resonance set high enough, each bandpass filter is used to accentuate one of the formants in the vowel sound. Afterward, all five signals can simply be mixed together to create the final sound.
[aside title = “Pro Tip”]You can save some CPU by using a serial filter structure. [/aside]
The bandpass filters aren’t entirely ideal – in a formant filter we want to be able to specify the bandwidth of the pass signal, something we don’t get direct control over in the Primary modules. To that end, we will build a simple two pole resonator filter that has inputs for both the central frequency and the bandwidth.
Another thing that can be improved upon is the structure can be serial instead of parallel. The parallel method, already described above, looks something like this (using Primary filters as an example):
Each filter receives the audio input individually, and the outputs of the filter are mixed back together. This is a perfectly valid filter structure and many powerful synths utilize the parallel filter scheme to great effect.
However, in the case of a formant filter, you can save some CPU by using a serial connection:
Here the output of each filter simply runs into the next filter. This is useful because we can cut out the mixer module entirely! It is also nice because with a parallel structure, each filter needs to be be an amplitude value as well, whereas with a serial filter, the levels are controlled automatically.
So, if our filter is going to consist of five resonator filters in serial, and each resonator has a frequency value and a bandwidth value, it is important to consider how the user will control all of these parameters.
While it is certainly possible to simply supply the user with ten knobs and let them program out each vowel painstakingly, it is also clear that this is a pretty clunky solution – who wants to bother with that many knobs for a filter?
There is also the issue that stationary formant filters are not nearly as nice sounding as filters that move between different vowels controlled by an LFO or other modulator. This of course similar to how speech is more interesting to listen to than somebody saying ‘AAAAHHHHHH’ at a set pitch!
A standard solution that both does away with the multitude of knobs and makes for easy modulation is to use an XY graph to control which vowel is being used. The values for each parameter is stored in a table and the appropriate value is read out for whichever vowel is active.
As an example, here’s Thor’s formant filter:
With this in mind, I wish to make a similar setup that uses the X axis of the XY module to control which vowel is being spoken (A, E, I, O, U) and the Y axis further classifies between soprano, alto, tenor, bass and countertenor voicings.
At any point in time, the filter can therefore be morphing between a total of 4 values (in between two points on the X axis, and in between two points on the Y axis). For example, you could be between A and E on the X axis, and be morphing between soprano and alto on the Y axis. This allows you to create some pretty interesting morphing sounds.
With the idea of morphing between 4 given points, I created the following Core cell:
The structure has two tables, Freq, and Band, that contain the parameter values for each vowel sound. The V1-V4 inputs gives the indices of the four vowels to morph between. P1 and P2 control the X and Y positions of that morph, between 0 and 1. A simple linear function is used to morph between the values and arrive at a final frequency and bandwidth.
The above structure controls the parameters for a single resonator, and will be duplicated 5 times, for each formant. Each table needs it’s own values as well, a table of formant frequencies and bandwidths can be found in an appendix to the CSound manual, here.
We have mapped out the design of the formant filter pretty thoroughly in this tutorial. Next time, I’ll get into the actual implementation of the resonator filter and hopefully end up with a final product. Stay tuned!
Have a Question or Comment About This Tutorial?
Want to ask a question about this tutorial or perhaps you have something to add?
Click through to our forum post about this tutorial and join the conversation!