|
|
@@ -0,0 +1,37 @@ |
|
|
|
// Voltage-controlled oscillator example |
|
|
|
// by Andrew Belt |
|
|
|
// adapted for SC by Brian Heim |
|
|
|
|
|
|
|
~vcv_frameDivider = 1; |
|
|
|
~vcv_bufferSize = 32; |
|
|
|
|
|
|
|
~phase = 0; |
|
|
|
~vcv_process = { |block| |
|
|
|
|
|
|
|
var pitch, freq, deltaPhase; |
|
|
|
|
|
|
|
// Knob ranges from -5 to 5 octaves |
|
|
|
pitch = block.knobs[0] * 10 - 5; |
|
|
|
// Input follows 1V/oct standard |
|
|
|
// Take the first input's first buffer value |
|
|
|
pitch = pitch + block.inputs[0][0]; |
|
|
|
|
|
|
|
// The relationship between 1V/oct pitch and frequency is `freq = 2^pitch`. |
|
|
|
// Default frequency is middle C (C4) in Hz. |
|
|
|
// https://vcvrack.com/manual/VoltageStandards.html#pitch-and-frequencies |
|
|
|
freq = 261.6256 * pow(2, pitch); |
|
|
|
postf("Freq: % Hz", freq); |
|
|
|
|
|
|
|
deltaPhase = ~vcv_frameDivider * block.sampleTime * freq; |
|
|
|
|
|
|
|
// Set all samples in output buffer |
|
|
|
block.bufferSize.do { |i| |
|
|
|
// Accumulate phase & wrap around range [0, 1] |
|
|
|
~phase = (~phase + deltaPhase) % 1.0; |
|
|
|
|
|
|
|
// Convert phase to sine output |
|
|
|
block.outputs[0][i] = sin(2pi * ~phase) * 5; |
|
|
|
}; |
|
|
|
|
|
|
|
block |
|
|
|
} |