Struct synfx_dsp::PolyBlepOscillator
source · [−]pub struct PolyBlepOscillator { /* private fields */ }Expand description
This is a band-limited oscillator based on the PolyBlep technique.
NOTE: You need to call crate::init_cos_tab.
Here is a quick example on how to use it:
use synfx_dsp::{PolyBlepOscillator, rand_01, init_cos_tab};
init_cos_tab();
// Randomize the initial phase to make cancellation on summing less
// likely:
let mut osc =
PolyBlepOscillator::new(rand_01() * 0.25);
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
let pw = 0.2; // Pulse-Width for the next_pulse()
let waveform = 0; // 0 being pulse in this example, 1 being sawtooth
let mut block_of_samples = [0.0; 128];
// in your process function:
for output_sample in block_of_samples.iter_mut() {
*output_sample =
if waveform == 1 {
osc.next_saw(freq, israte)
} else {
osc.next_pulse(freq, israte, pw)
}
}Implementations
sourceimpl PolyBlepOscillator
impl PolyBlepOscillator
sourcepub fn new(init_phase: f32) -> Self
pub fn new(init_phase: f32) -> Self
Create a new instance of PolyBlepOscillator.
init_phase- Initial phase of the oscillator. Range of this parameter is from 0.0 to 1.0. Passing a random value is advised for preventing phase cancellation when summing multiple oscillators.
use synfx_dsp::*;
let mut osc = PolyBlepOscillator::new(rand_01() * 0.25);sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Reset the internal state of the oscillator as if you just called PolyBlepOscillator::new.
sourcepub fn next_sin(&mut self, freq: f32, israte: f32) -> f32
pub fn next_sin(&mut self, freq: f32, israte: f32) -> f32
Creates the next sample of a sine wave.
freq- The frequency in Hz.israte- The inverse sampling rate, or seconds per sample as in eg.1.0 / 44100.0.
use synfx_dsp::*;
let mut osc = PolyBlepOscillator::new(rand_01() * 0.25);
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
// ...
let sample = osc.next_sin(freq, israte);
// ...sourcepub fn next_tri(&mut self, freq: f32, israte: f32) -> f32
pub fn next_tri(&mut self, freq: f32, israte: f32) -> f32
Creates the next sample of a triangle wave. Please note that the bandlimited waveform needs a few initial samples to swing in.
freq- The frequency in Hz.israte- The inverse sampling rate, or seconds per sample as in eg.1.0 / 44100.0.
use synfx_dsp::*;
let mut osc = PolyBlepOscillator::new(rand_01() * 0.25);
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
// ...
let sample = osc.next_tri(freq, israte);
// ...sourcepub fn next_saw(&mut self, freq: f32, israte: f32) -> f32
pub fn next_saw(&mut self, freq: f32, israte: f32) -> f32
Creates the next sample of a sawtooth wave.
freq- The frequency in Hz.israte- The inverse sampling rate, or seconds per sample as in eg.1.0 / 44100.0.
use synfx_dsp::*;
let mut osc = PolyBlepOscillator::new(rand_01() * 0.25);
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
// ...
let sample = osc.next_saw(freq, israte);
// ...sourcepub fn next_pulse(&mut self, freq: f32, israte: f32, pw: f32) -> f32
pub fn next_pulse(&mut self, freq: f32, israte: f32, pw: f32) -> f32
Creates the next sample of a pulse wave. In comparison to PolyBlepOscillator::next_pulse_no_dc this version is DC compensated, so that you may add multiple different pulse oscillators for a unison effect without too big DC issues.
freq- The frequency in Hz.israte- The inverse sampling rate, or seconds per sample as in eg.1.0 / 44100.0.pw- The pulse width. Use the value 0.0 for a square wave.
use synfx_dsp::*;
let mut osc = PolyBlepOscillator::new(rand_01() * 0.25);
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
let pw = 0.0; // 0.0 is a square wave.
// ...
let sample = osc.next_pulse(freq, israte, pw);
// ...sourcepub fn next_pulse_no_dc(&mut self, freq: f32, israte: f32, pw: f32) -> f32
pub fn next_pulse_no_dc(&mut self, freq: f32, israte: f32, pw: f32) -> f32
Creates the next sample of a pulse wave. In comparison to PolyBlepOscillator::next_pulse this version is not DC compensated. So be careful when adding multiple of this or generally using it in an audio context.
freq- The frequency in Hz.israte- The inverse sampling rate, or seconds per sample as in eg.1.0 / 44100.0.pw- The pulse width. Use the value 0.0 for a square wave.
use synfx_dsp::*;
let mut osc = PolyBlepOscillator::new(rand_01() * 0.25);
let freq = 440.0; // Hz
let israte = 1.0 / 44100.0; // Seconds per Sample
let pw = 0.0; // 0.0 is a square wave.
// ...
let sample = osc.next_pulse_no_dc(freq, israte, pw);
// ...Trait Implementations
sourceimpl Clone for PolyBlepOscillator
impl Clone for PolyBlepOscillator
sourcefn clone(&self) -> PolyBlepOscillator
fn clone(&self) -> PolyBlepOscillator
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read more
Auto Trait Implementations
impl RefUnwindSafe for PolyBlepOscillator
impl Send for PolyBlepOscillator
impl Sync for PolyBlepOscillator
impl Unpin for PolyBlepOscillator
impl UnwindSafe for PolyBlepOscillator
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more