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

Create a new instance of VPSOscillator.

  • init_phase - The initial phase of the oscillator.

Reset the phase of the oscillator to the initial phase.

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.

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 parameter d which must be in the range 0.0 to 1.0.
  • v - The phase distortion parameter v which must be in the range 0.0 to 1.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

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.