Add fixed frequency to V/oct

Hi everyone, I was hoping someone could help me out with this. Say I have 2 oscillators, but the one is always running, for example, 10hz above the other, regardless of the incoming voltage. I can figure this out on paper, using frequency to volt formula’s. But I can’t seem to route it up in Rack. I’m sure that it’s quite easy, but I think I’m overthinking it. Is it as simple as detuning the one oscillator by 10 Hz? Although this won’t help me because I’d like to modulate the difference. And will the one always be 10hz above the other if the pitch changes? Any advice is welcome. Thanks in advance.

Perhaps this module can help you out.


That seems perfect! Thank you so much. I’ll give it a go.

1 Like

Pitch CV is logarithmic, Hz is linear. Because of this you need a dedicated module to do the job.


Yes thanks. It was a nightmare to try to convert everything, and then add it, and then convert everything again. I can’t wait to try your module, I’m just at work now. I should have asked first, it would have saved me a whole evening of frustration.

Man, that module works perfectly for the purpose. Thank you for making it, and thanks for the video too. I don’t know why I haven’t really used your modules much in the past, but you can expect to see alot more light green coloured modules in my patches :slightly_smiling_face:. Very cool stuff.


Or a generic module that allows entry of mathematic formulas such as Frank Buss Formula, docB Formula One, or Submarine Arithmetic Operator AO-1xx series.

By far my favorite math module is docB Formula One. The Frank Buss module is relatively CPU inefficient compared to the others. The Submarine modules are awkward, especially since the C constants are limited to +/-100 with only 2 decimal digits of precision.

For this application I definitely would use Ahornberg’s module as it is compact, has many input/output pairs, supports polyphony, and is very CPU efficient. I can’t imagine using anything else.

But it might be instructive to show how easily it can be implemented with Formula One. Just paste the following code into the text window (most of the code is documenting comments):

// Polyphonic Frequency Shifter
// V/Oct inputs: x, y, z
// Hz shifts (1000 Hz/V)
//  x shift = 1000 * (a + d + w)
//  y shift = 1000 * (b + d + w)
//  z shift = 1000 * (c + d + w)
// V/Oct shifted outputs:
//  shifted x = out  (CV output)
//  shifted y = out1 (#2 output)
//  shifted z = out2 (#3 output)

var k := 1000/261.626;
out2:=log2(2^z + k(c + d + w));
out1:=log2(2^y + k(b + d + w)); 
      log2(2^x + k(a + d + w));

All shifts are specified by voltage using a scale of 1000 Hz / Volt

You can set the shifts for x, y, and z individually using knobs a, b, and c.

And/or you can use the knob d for a global shift.

And/or you can use global CV shift at the w input

All outputs are polyphonic if any of w, x, y, or z are polyphonic. The number of output channels matches the maximum found in w, x, y, and z.

A monophonic input is replicated across all channels. But a poly input with fewer than the maximum uses 0V for the missing channels.

Here is an image showing the frequency shift in action. It adds 100 Hz to C3, C4, and C5. All paths are color coded to make it easy to follow.


Thanks Dave. This is an enormous help. I originally tried this with the Submarine AO modules, but to no avail. Thanks for introducing DocB formula One, I can see how incredibly handy this module can be.

Yes, the Submarine AO modules are definitely awkward. But once you get the hang of it, they can be pretty powerful.

For this application I wanted to use the constant C values, but it just doesn’t offer the range or precision that I want. Once I decided to pass in all values as CV then the programming became fairly straight forward.

Here is the same scenario from before implemented with Submarine AO-124.

To understand how it works you need to realize that whenever you perform a computation in a cell, that result becomes the Y value that is passed down, and also the X value that is passed to the right.

Whenever a cell does not have a computation (pass through), then the Y from above is passed through below, and the X from the left is passed through to the right.

It is possible to perform one shift computation with a single column AO-106, but it requires an extra patch cable, which causes the computation to be out of sync by 1 sample. This may or may not be significant, depending on your application.

Below I add 100Hz to C4

Note that the actual Green 8VERT voltage is .261626, but the display is rounded to .26163.

If .26163 is used, then the result is off by .01 Hz → 361.62 Hz


That clarifies alot. My logic was completely off :rofl:. Thanks Dave.

I can get a bit obsessive compulsive - I just realized there is a simple solution to keep the computation perfectly in sync. Just add another patch cable so that both the shift factor computation and V/Oct exponential computation have the same 1 sample delay.