DimensionalTips: Stack Yourself
This one is intended for tweakers and advanced users, or for anyone wanting a powerful oscillator stack in Dimension. If you're up to follow it, I suggest you get a good cup of Colombian coffee at this point.
In 'sfz 101' we covered the basics on how to map samples in the keyboard in a very simple way. A few samples included how to create keyboard or velocity switching, and how to stack and layer different samples. Now we'll cover the same subject, but applied to wavetable oscillators instead of samples.
As you surely know from reading Dimension's Users Guide, if we load a wave/aiff file directly in Dimension, and the file has less than 3000 samples, instead of treating it as a transient sample Dimension will use the sample contents to create a wavetable oscillator on-the-fly.
Dimension will assume that the sample loaded contains the definition for a single-cycle of the desired oscillator waveform, and will resynthesize that waveform to create a full-spectrum oscillator with zero aliasing based on that cycle.
However, if that transient definition is included as a sample inside a .sfz file, Dimension will treat it as a sample, unless we instruct it otherwise. Here's how we say that we want the sample to be treated as an oscillator single-cycle definition:
<region> sample=saw mini.wav oscillator=on
That means that the sample 'saw mini.wav' will be considered as a single-cycle waveform, just like if we'd load it directly (and it has less than 3000 samples).
Ok. Now that we know that, we can use the same keyboard/velocity switching and stack/layer tricks we've learned in 'sfz 101', but with oscillators. Using those, we can assign different oscillators to different key ranges, velocity ranges, we can stack oscillators, and we can stack or switch oscillators with samples. Cool innit?
Let's create a simple example to showcase the oscillators stacking majesty. The idea is to create a powerful stack of multiple saw waveforms, like the 'multisaw' or 'supersaw' stacks found in other synthesizers, with adjustable detune.
We'll start by creating a new text file, inside your $\Multisamples\Wavetables\ folder, so we can use an existing wavetable to create our stack. Rename the new text file to 'multisaw.sfz', and then add the following lines to it:
<group>
sample=saw mini.wav oscillator=on oscillator_phase=-1
<region> pitch_oncc140=-20
<region> pitch_oncc140=-10
<region> pitch_oncc140=10
<region> pitch_oncc140=20
Then save it, and we're done. Now we have a powerful stack of four saw waveforms, and we've assigned the detune control of each layer to the unused-in-this-patch BITRED knob in the interface. If you've followed the instructions carefully so far, you should be saying 'Whot?' by now while scratching your head. Ok, please stay with me. Let's examine the sfz definition piece by piece.
First we have the <group> opcode. A <group> opcode is a way of simplifying the definition file, by saying 'what I say now goes into every region that follows'. Therefore, anything we write after <group> will be applied to all regions following, till the end of the file or till the next <group> opcode arrives.
Then we have the well known 'sample=' opcode, which tells Dimension that we want to create our oscillators based on the 'saw mini.wav' single-cycle definition, which is in your \Wavetables folder by default. Then we have the above mentioned 'oscillator=on', which tells the player we want an oscillator, not a sample.
Then the first unknown opcode appears: we have an 'oscillator_phase=' thing, (which is new for 2.0.1, requires the patch applied). This opcode tells Dimension what the initial phase in the cycle should be for the oscillator. For z3ta+rians, there's nothing new here: it's the definition equivalent to the PHASE slider, other synth users might also find this familiar. What it is new here though, is the fact that if we specify -1 as value (as we do in this example), the phase will be randomized for every new note. This allows us to escape from the huge pop on note-on that would cause four saws stacked in-phase.
Then we've got those four <region> lines. We've defined the main opcodes within the <group> header, so those will be applied to every new region we create. Therefore, we only need to specify those opcodes which are particular for each region now.
In each region, we've used the simple 'pitch_onccXXX=' opcode to 'link' the pitch of the oscillator to a physical controller. In this case, you just move your MIDI CC 140, and you'll be controlling the oscillator's pitch, in the specified depth in cents. Oh right, CC 140 doesn't exist... does it?. We're almost there.
All dimension knobs are mapped as if they were MIDI controls, with values that the midi spec can't reach. This allow us to 'recycle' the interface knobs for specific purposes within an sfz file, when a particular knob is unused. Bitred knob is 140, and that's the one we've used in this example. So what we've done is linking the pitch of each oscillator to the bitred knob, with a different amount in each layer (Note that the knob will work even when the button is in the 'off' position. You should only turn it on if you want the bitred effect applied at the same time).
That's it. If you're too lazy to create the sfz file yourself, you can still try it. I've created the file for you, you can get it from here:
http://www.rgcstuff.com/External/Multisaw.zip There're two files inside the zip: 'multisaw.sfz', intended to go in your $\Multisamples\Wavetables\ folder, and 'multisaw test.prog', which you can place anywhere. The latter is a test file program with a trance-oriented patch.
Simple experiments could include modifying the sfz file to get seven saws instead of four, making the detune amounts more extreme, etc. Hope you find this tip useful.
-René