Struct synfx_dsp::VPSOscillator
source · [−]pub struct VPSOscillator { /* private fields */ }
Expand description
Vector Phase Shaping Oscillator.
The parameters d
and v
control the shape of the sinus
wave. This leads to interesting modulation properties of those
control values.
use synfx_dsp::*;
// Randomize the initial phase to make cancellation on summing less
// likely:
let mut osc =
VPSOscillator::new(rand_01() * 0.25);
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
let d = 0.5; // Range: 0.0 to 1.0
let v = 0.75; // Range: 0.0 to 1.0
let mut block_of_samples = [0.0; 128];
// in your process function:
for output_sample in block_of_samples.iter_mut() {
// It is advised to limit the `v` value, because with certain
// `d` values the combination creates just a DC offset.
let v = VPSOscillator::limit_v(d, v);
*output_sample = osc.next(freq, israte, d, v);
}
It can be beneficial to apply distortion and oversampling.
Especially oversampling can be important for some d
and v
combinations, even without distortion.
use synfx_dsp::{VPSOscillator, rand_01, apply_distortion};
use synfx_dsp::Oversampling;
let mut osc = VPSOscillator::new(rand_01() * 0.25);
let mut ovr : Oversampling<4> = Oversampling::new();
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
let d = 0.5; // Range: 0.0 to 1.0
let v = 0.75; // Range: 0.0 to 1.0
let mut block_of_samples = [0.0; 128];
// in your process function:
for output_sample in block_of_samples.iter_mut() {
// It is advised to limit the `v` value, because with certain
// `d` values the combination creates just a DC offset.
let v = VPSOscillator::limit_v(d, v);
let overbuf = ovr.resample_buffer();
for b in overbuf {
*b = apply_distortion(osc.next(freq, israte, d, v), 0.9, 1);
}
*output_sample = ovr.downsample();
}
Implementations
sourceimpl VPSOscillator
impl VPSOscillator
sourcepub fn new(init_phase: f32) -> Self
pub fn new(init_phase: f32) -> Self
Create a new instance of VPSOscillator.
init_phase
- The initial phase of the oscillator.
sourcepub fn limit_v(d: f32, v: f32) -> f32
pub fn limit_v(d: f32, v: f32) -> f32
This rather complicated function blends out some combinations of ‘d’ and ‘v’ that just lead to a constant DC offset. Which is not very useful in an audio oscillator context.
Call this before passing v
to VPSOscillator::next.
sourcepub fn next(&mut self, freq: f32, israte: f32, d: f32, v: f32) -> f32
pub fn next(&mut self, freq: f32, israte: f32, d: f32, v: f32) -> f32
Creates the next sample of this oscillator.
freq
- The frequency in Hz.israte
- The inverse sampling rate, or seconds per sample as in eg.1.0 / 44100.0
.d
- The phase distortion parameterd
which must be in the range0.0
to1.0
.v
- The phase distortion parameterv
which must be in the range0.0
to1.0
.
It is advised to limit the v
using the VPSOscillator::limit_v function
before calling this function. To prevent DC offsets when modulating the parameters.
Trait Implementations
sourceimpl Clone for VPSOscillator
impl Clone for VPSOscillator
sourcefn clone(&self) -> VPSOscillator
fn clone(&self) -> VPSOscillator
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more