I’ve updated my real-time pitch-shift/time-stretch effect with a few new features. As requested by a few users, I added an envelope to the ensemble, which allows for depth control and fading the effect in and out. I also added a simple stutter glitch function with feedback, allowing for some pretty extreme effects – each time the delayed section repeats, it operates on the previous iteration. Hence, if you play a stutter with the speed knob at 0.5, first the speed will be 0.5, the next pass it will be 0.25, then 0.125, etc, playing back the same sound slower and slower. To turn off the stutter effect, simply reduce the delay knob to 0.
The whole project is still very much a work in progress but I though some users might enjoy the new features. Have fun, and download here.
I found a paper online with an incredible amount of detail on creating an authentic digital replica of the tone stack in the ’59 Fender Bassman (despite the name, the Bassman is apparently a very popular guitar amplifier). The paper details a physical model of the circuitry, leading to a very precise emulation of the filter. The tone stack is an interesting type of filter, either plug it into the Filter Analyzer or check the paper for some examples of the frequency responses it can give. I figured it wouldn’t be too hard to translate the work into a Reaktor macro. Actually, it turns out entering and double-checking extremely long equations in Core is kind of annoying, but I finally got it working.
However, I found another problem: whenever I moved a knob, the bass frequencies temporarily shot way up, causing unwanted distortion and clipping. The filter presented in the paper does not seem to do well with parameter changes. A simple fix for this is to empty out the z -1 macros in the structure (setting them to 0) every time a knob is turned. These macros contain delayed signals and feedback values, both of which can cause instability when changing the parameters of this filter.
In his thesis, David Yeh continues the work in this paper and gives component values for some similar tone stacks. Since the Reaktor macro is a digital implementation of a circuit, you can actually change the values for the capacitors and resistors in the Bassman circuit, allowing for an emulation of the Marshall JCM800 filter as well.
I hope to learn some more about the rest of the Bassman at some point to emulate the rest of the amplifier, but it’ll take a while, if ever. Because this filter is meant to be used with a preamp, you may want to give the signal some gain.
Just a quick note to mention that I’ve updated the EzFFT Filter Analyzer in the Downloads section. I got sick of the white noise signal being so… noisy. At low frequencies in particular the signal would be jumping around so much that it would be hard to read the graph properly. So, I attempted to make a waveform representing all frequencies that was a little more stable over time to get a clearer picture of my filters.
The best method I found was to simply use an iFFT module and feed it amplitude and phase inputs to set up a signal that has the same amplitude at all frequencies. I use this ensemble for designing and testing filters, as it gives you an immediate answer to whether you’re doing it right. I hope some others find it useful too.
Today I have a Thiran all-pass filter that can be used as a fractional delay line to share with you all. It has a simple yet interesting and useful effect on incoming audio signals – it can delay them by 1.5 – 2.5 samples (using a normal delay line you would be limited to using only integer values). To achieve a longer delay than 2.5 samples, you can simply wire it after a delay line.
Fractional delay lines have various musical applications – they are useful in bandwidth limited oscillators, comb filters, Karplus-Strong and other physical modeling algorithms, and probably many other things that I am not aware of. My interest was first piqued by this article, and much of the recent research on fractional delay filters seems to be by Vesa Välimäki.
Hopefully I’ll have another project or two that uses this later in the week.
I had a request recently for a drawable waveshaper. It seemed like a simple project but then I realized it would come with a lot of aliasing if not properly implemented. I decided on using a 4-point interpolation to get around this – for every point, the waveshaper interpolates between the closest 4 data values and finds the best approximation.
The result is pretty interesting. As you can see from the image, some pretty complex waveforms can be designed with ease. I’ve included an example ensemble that uses a Ramp Osc to run the waveshaper, basically turning it into an oscillator. The example ensemble is just that – it is not meant to be a finished project but just something to show you what this can do.
One thing to remember is that for an input of 0, this macro does not necessarily output a 0 as most waveshapers will. Hence, it usually makes sense to use this macro in conjunction with an envelope to keep it off when no sound is running through. It is possible to change the length of the table and the color of the display as demonstrated in the example ensemble.
If anybody uses this for a project, please let me know!
The paper I used to create the Moog Ladder emulation posted yesterday also contains an algorithm for a simple bandlimited sawtooth oscillator known as a Differentiated Parabolic Waveform (DPW). The algorithm is quite simple: generate a ramp, square the result, use a differential filter (IE, find the difference between the last value and the new value), then scale the results by F/SR (where F = frequency, and SR = sample rate).
The differences between this oscillator and the factory sawtooth is hard for me to hear, but it is easy to see on an FFT chart. Here’s what the factory sawtooth looks like (played at MIDI note 36 to get a clear graph):
And here’s what the bandwidth limited version looks like:
As you can see, the bandwidth limited version drops to zero near the Nyquist limit, while the factory version does not. The CPU usage is of course a little bit higher but it’s still pretty cheap.
This will eventually be expanded for things such as phase modulation and the like. I’m also working on the more commonly used BLIT (bandwidth limited impulse train) oscillators, and I hope to have more on that front soon.
Yesterday I implemented a Reaktor model of the Moog Ladder filter, using the techniques outlined in the second half of this paper. It consists of a 4 one-pole low pass filters in serial, and has some more flexibility than the Reaktor factory ladder filter – allowing for bandpass, highpass, and notch filters as well as the low pass outputs (although the paper is unfortunately a little vague on how to achieve this, I’ll point the way as best as I can).
The P, Res and Audio inputs can be used as in any other filter module. A, B, C, D, and E are gain coefficients that can used to determine the filter type. There are a few simple setups that can be used for some basic filter types:
Type A B C D E
1-Pole Low Pass 0 1 0 0 0
2-Pole Low Pass 0 0 1 0 0
3-Pole Low Pass 0 0 0 1 0
4-Pole Low Pass 0 0 0 0 1
Bandpass 0 0 0 -1 1
High Pass 1 1 0 -1 -1
The LP filters are easy to derive because of the structure of the filter. The BP and HP filters were found by trial and error using the ezFFT Filter Analyzer and may not be ideal. I was able to find some notch filters but their values seemed dependent on the frequency cutoff.
One intriguing possibility is the ability to morph between different filter types in real time.
I hope you all find this useful. Tomorrow I’ll be posting the bandwidth limited sawtooth oscillator from the first half of the paper, and later this week I’ll post a drawable wavetable as requested in the comments. Until then,