The saw. A sharp-toothed tool used for cutting through hard objects. A marvel of woodworking. The super saw is one of the most iconic sounds of electronic music. It’s featured prominently in trance music especially, and avant garde pop pioneer A. G. Cook paid homage to it on disk 3 of his album 7G. To make a super saw you start with one saw wave at the fundamental frequency you want to play. Then you duplicate it, detuning each copy slightly from the base frequency. The result is a chorus of saw waves slightly detuned from each other, which add together to create interesting timbres and tones. The tone can be changed immensely by changing the detune amount and number of voices, ranging from a sharp pure saw wave to a luscious, spread out pad to a discordant sting. This versatility is what makes the super saw such a prolific actor in electronic music. For my project I wanted to make a super saw with a dynamic sequencer/arpeggiator for endless trancey fun.
The first section of my max patch is the clock. It’s relatively simple and just takes in a bpm and generates a constant clock signal. Instead of being a stream of bangs or a square wave as would be typical, I opted to make my clock signal an integer which increments by one every 64th note. This allows it to be used for timing up to that resolution, but also lets it be used to time the composition and in the future will allow me to introduce time-based variations, such as the detune slowly increasing as the composition plays.
With the clock synchronized it was time to add rhythms. To generate the rhythms for the sequencer/arpeggiator I made a patch called rhythm_gen. This patch has three inlets (from left to right):
1. The clock counter that I created previously
2. The beat subdivision in 64th notes. This basically just determines the value of the rhythms passed into the third inlet.
3. Alist of integers representing the rhythm to be generated. These are multiples of the beat subdivision passed into inlet 2. So for example if you wanted a beat every quarter note, you might pass in 4 to inlet 2 and 4 to inlet 3. Or, you could pass in 1 to inlet 2 and 16 to inlet 3.
The rhythm generator turns the clock counter into a stream of bangs which can be used to trigger notes. The first outlet sends a bang on every beat subdivision constantly, and the second gives the index in the current beat. The third outlet sends bangs on the rhythms that you’ve provided in the rhythm list, and the fourth outlet outputs the index in that list. The main way to control the rhythm generator is to pass in new rhythm lists. When you pass a new list in, it won't take effect until after the current iteration of the previous list has finished, which makes switching rhythms seamless.
The notes comprising the arpeggio are determined by a simple list of MIDI pitch values. I used zl.nth to iterate through these on every subdivision. The note will change every subdivision, and the counter will return to the beginning of the note list on every main beat. If you had [3 3 2] as your rhythm list for example and [50 55 60] as your note values, the arpeggiator would play 50-55-60 50-55-60 50-55 and then start over.
Now for the fun part: the supersaw. At first I built a max patch to handle voice allocation for the chorus of saws, but due to Max’s graphical operator precedence the calculations weren’t being done in the right order and it was buggy and unpredictable. Instead, I wrote a supersaw voice allocator in C as an external for Max called Supersawer. When you create a new instance of the object in Max the number that follows its name is the maximum number of voices the supersaw can have, which dynamically creates more outlets accordingly. The object takes in the frequency, detune amount, and number of voices and allocates the frequency for each voice and sends them out of each of its outlets. Any outlets that aren’t being used send 0. From there each outlet can be connected to a Saw~ object, which is what I’ve done in my Supersaw patch. The Saw~ objects are then connected to Kink~ objects which distort the basic saw waveform and give them a more unique sound. The saw waves are then added together (additive synth) and passed through a limiter to prevent clipping.
Then the signal goes through a low pass filter, which only allows frequencies below the cutoff to pass through. As the cutoff is increased, the sound becomes harsher and has more high-frequency content. The resonance of the filter causes frequencies around the cutoff to be attenuated more and sound louder, which can give the cutoff its own tonal sound when it’s changed.
This final signal is multiplied by the signal from an ADSR envelope, which gives the notes some shape. I’ve set the sustain to a low level and am only allowing the attack and decay to be changed, since the notes are played in such quick succession that finer adjustments wouldn’t be noticeable. The envelope generates a signal that increases to 1 in the time specified for the attack and then decays to a low value in the time specified for the decay, which allows the sound to be short and plucky or long and powerful. Increasing the attack can also achieve a cool effect, almost as if the notes are being played backwards.
This dry signal leaves the supersaw patch and goes directly into the DAC to be played aloud. It also goes into my modified Schroeder Reverb patch. Schroeder Reverb consists of three allpass filters in series followed by four feedback comb filters in parallel, with a mixing matrix at the end. The allpass filters simulate the early reverberations of an impulse, and the comb filters simulate the four walls of a room. I’ve tweaked the values of the delays and gains for the filters from the values originally specified by Schroeder to achieve an interesting effect. In addition to optional reverb, I also have a delay system which can be activated to give the sound more variation. The dry signal is sent into a tapin~ and out of a tapout~, which delays it. At first, there is no delay parameter passed into the tapout~ object. However, once the button is pressed a phasor is activated, which increases the delay time. The phasor is a smooth ramp from 0 to 1 that repeats over and over again, and I’ve set the frequency to be very low so the delay time is slowly increased. What is achieved is a subtle phasing effect, which causes the delayed signal to slowly fall more and more out of phase with the dry signal, leading to cancellation and variety in the sound.