(updated 28 May, 20:05, 21:35, 29 May 11:50)
Sending control voltages from a soundcard
There is nothing complicated about this method of control – audio signals consist of the kind of electrical modulation which is also harnessed by modular synths. Sending continuous values instead of a typical rapidly changing audio waveform can perform the role of controlling input parameters.
Unfortunately, most soundcards have in place high pass filters which remove very low frequencies, so continuous DC signals aren’t stable, and any attempt to use them results in the signal dropping back to nothing. Some soundcards don’t have this filtering though, and there is one made especially for the purpose of controlling modular synths: Expert Sleepers’ ES3. It takes an optical ADAT input, gives 8 audio outs, and comes in a eurorack format ready for screwing into a rack with the modules themselves.
Here is a test SuperCollider patch along with the resulting audio. The patch is outputting 40 discrete values from 0.0 to 1.0, and this output is going into the FM input of a TipTop Audio Z2040 Low Pass Filter with its resonance turned up to self-oscillation. The base frequency of the filter and the amount of modulation can both be adjusted on the filter module. It can be heard that audio values from 0.0 to 1.0 are enough to cover the full range of frequencies that would be generally required.
var noOfSteps = 40, dseq, trig, demand;
dseq = Dseq(Array.interpolation(noOfSteps, 0.0, 1.0), inf);
trig = Impulse.ar(4);
demand = Demand.ar(trig, 0, dseq);
A patch like this could form the basis of a calibration routine which would analyse the pitch of audio resulting from certain control values, and create a map from pitch to control voltage.
So now the principle has been established, thoughts may naturally turn to a more interesting use of control signals. My first ambition for this project was to create analogue drum sounds. Having used a friend’s Octave Kitten synth, I fell in love with its filter: it sounds rich, creamy and powerful, capable of making both delicious melodic synth sounds, and put into self oscillation, thundering and punchy percussion. I read that the TipTop Z2040′s filter chip is from the same family, and although it sounds much better engineered than the Kitten, the resemblance is noticable and it has many of the same sound qualities.
The basis of my drum sound patch is to simply play two CV control envelopes together in order to change the frequency of a resonating filter. The output from the filter is then passed through a SC audio envelope. Both the control envelopes consist of simple attack-release shapes. The first is intended for the overall shape (i.e. the oomph of a 909 kick) and the second for very tight clicks (such as the high frequency initial hit sound of the 909 kick.) Here is the sound of making such a kick drum:
The envelopes may be retriggered a specific number of times:
Adding noise to the control signals results in a nice change of sound quality which may sometimes be useful:
A modulating oscillator can also be introduced, for more sound changes.
The patch for a single drum sound doesn’t add up to much information for the computer to handle – it’s only about 30 numbers. So it’s not difficult to save 128 patches and trigger a different one for each MIDI key. Then it’s possible to play a complete drum pattern using only one filter.
The following demo does just that. The pattern is played through 4 times on 4 different filters: to start, the TipTop, then the Doepfer A-106-6 XP and A-108-VCF8, and finally the filter of the Vermona Mono Lancet. In each case the control data is identical, and the hardware settings for filter frequency and modulation amount have been set to match as closely as possible.
Since each drum hit is being enveloped in SuperCollider, it follows that additional processing may take place digitally. A varying amount of the signal can be sent to a reverb effect, depending on which “sound” is playing. (Just using the TipTop this time.)
Some signals from SuperCollider can be put through the filters too – here’s some band pass filtering of a cluster of pulses, to copy a trick from the 808 hi-hat:
Finally, different sets of drum sounds can be stored and recalled. There is also a “blend” function between each set, which amounts to a simple interpolation between 2 arrays (you can call it “morphing” if you like…) In the following example, one set of sounds is heard, then another, and then several stages of blending between them.
Here’s a screenshot of the patch, as usual for my personal home-made GUIs, it has an “accident in a sweet shop” vibe.