Regular readers of this space (all five of you) will be aware that I’m fussy about intonation. And yet, I’ve acquired an analog modular synthesizer. Go figure. Analog synthesis is good at many things, but precise intonation is not one of them.
In order to integrate a computer with the modular synth, I’ve acquired Expert Sleepers ES-3 and ES-6 modules. These nifty devices can talk to a computer via ADAT lightpipe, with a very nice PreSonus 1818VSL interface shuttling the 24-bit audio back and forth.
The computer happens to be running Csound. One of my bright ideas is that I’d like to be able to write a fairly complex step sequencer in Csound (not especially difficult to do) and have it play the modular synth.
The oscillators in a modular system of this type are calibrated, in theory, so that when an incoming voltage rises by 1 volt, the oscillator’s frequency rises by one octave. This is called the 1-volt-per-octave standard. My oscillators have 1v/oct inputs.
The output of the ES-3 has a range of +/- 10 volts, and Csound’s audio signals are defined as having a maximum amplitude of +/- 1.000. From this, it’s easy to see that an increase of 0.1 in Csound’s audio output should raise an oscillator’s frequency by one octave. If we divide 0.1 by 12, we’ll find that an equal-tempered half-step in a 12-notes-per-octave tuning system will have a value in Csound of 0.008333….
That’s the theory. The reality turns out to be just a bit different.
To test this, I run two oscillators side by side, and listen to them both. One is entirely unmodulated, and is producing a sawtooth wave at a fairly low pitch. The other has an ES-3 output patched to its 1v/oct input. Before Csound starts, the second oscillator is carefully tuned to the first, by hand. Then Csound starts sending the second oscillator a stepped series of output values, causing its pitch to rise and then fall by octaves. Because I’m listening to both oscillators at once, because they’re nominally going to be playing octaves, and because a sawtooth wave is rich in overtones, I can easily hear any pitch discrepancies.
With ES-3 output 1 patched into the 1v/oct input of an Intellijel Rubicon oscillator, the actual value of a half-step is not 0.008333, but about 0.00793. The octave is about 0.09516.
These values are easily stored as global variables in Csound — so that solves the problem, right? Now I can write a step sequencer? Well, no. We’re not out of the woods at all. With ES-3 output 2 patched into the 1v/oct input of an Intellijel Dixie, the half-step is not 0.00793, it’s 0.00797. In other words, each combination of ES-3 output and oscillator may have a slightly different value for the half-step. With six oscillators and eight outputs, I may have to determine as many as 48 values with an accuracy of six decimal places. And any of these values might be subject to slight variations as the oscillator circuits warm up.
I know what you’re muttering to yourself: “Use a quantizer, dude.” Tried that. No help. Some of the “octaves” produced by Csound with an 0.1 value are minor ninths when they emerge from the Toppobrillo Quantimator … and not perfect minor ninths, at that.
This by no means negates the value of having Csound hanging off the side of the modular synth as an extra digital module. Csound can still do tons of useful stuff. For starters, sample playback. Multi-segment envelopes. LFOs with custom waveforms. Stereo reverb, chorus, delay, and other effects. Special types of filtering and waveshaping for which I have no hardware. Counting incoming gate signals so as to change an output value radically after a certain number of events have transpired. Playing complex rhythms.
Oh, and if I should feel in the mood, I can have my iPad send OSC messages wirelessly to Csound, which will translate them into digital audio, which the ES-3 will then translate into voltages, thus turning the iPad into a multi-touch expression controller for the modular. No, an integrated computer/analog system is far from being useless. But if I decide to write a complex step sequencer, I’ll have to do some careful calibration before I try to record the output. Either that, or just sequence a bunch of non-tonal bleeps and bloops so I don’t need to sweat over the intonation.