Trait dsp::signal::Signal
[−]
[src]
pub trait Signal: Iterator where Self::Item: Frame { fn add_amp<S>(self, other: S) -> AddAmp<Self, S> where S: Signal, S::Item: Frame, S::Item::Sample == Self::Item::Sample::Signed, S::Item::NumChannels == Self::Item::NumChannels { ... } fn mul_amp<S>(self, other: S) -> MulAmp<Self, S> where S: Signal, S::Item: Frame, S::Item::Sample == Self::Item::Sample::Float, S::Item::NumChannels == Self::Item::NumChannels { ... } fn offset_amp(self, offset: Self::Item::Sample::Signed) -> OffsetAmp<Self> { ... } fn scale_amp(self, amp: Self::Item::Sample::Float) -> ScaleAmp<Self> { ... } fn offset_amp_per_channel<F>(self, amp_frame: F) -> OffsetAmpPerChannel<Self, F> where F: Frame<Sample=Self::Item::Sample::Signed, NumChannels=Self::Item::NumChannels> { ... } fn scale_amp_per_channel<F>(self, amp_frame: F) -> ScaleAmpPerChannel<Self, F> where F: Frame<Sample=Self::Item::Sample::Float, NumChannels=Self::Item::NumChannels> { ... } fn mul_hz<I>(self, mul_per_frame: I) -> MulHz<Self, I> where I: Iterator<Item=f64> { ... } fn from_hz_to_hz(self, source_hz: f64, target_hz: f64) -> Converter<Self> { ... } fn scale_hz(self, multi: f64) -> Converter<Self> { ... } fn delay(self, n_frames: usize) -> Delay<Self> { ... } fn to_samples(self) -> ToSamples<Self> { ... } fn clip_amp(self, thresh: Self::Item::Sample::Signed) -> ClipAmp<Self> { ... } fn bus(self) -> Bus<Self> { ... } }
A trait that allows us to treat Iterator
s that yield Frame
s as a multi-channel PCM signal.
For example, Signal
allows us to add two signals, modulate a signal's amplitude by another
signal, scale a signals amplitude and much more.
Signal
has a blanket implementation for all Iterator
s whose Item
associated types
implement Frame
.
Provided Methods
fn add_amp<S>(self, other: S) -> AddAmp<Self, S> where S: Signal, S::Item: Frame, S::Item::Sample == Self::Item::Sample::Signed, S::Item::NumChannels == Self::Item::NumChannels
Provides an iterator that yields the sum of the frames yielded by both other
and self
in lock-step.
Example
extern crate sample; use sample::Signal; fn main() { let a = [[0.2], [-0.6], [0.5]]; let b = [[0.2], [0.1], [-0.8]]; let a_signal = a.iter().cloned(); let b_signal = b.iter().cloned(); let added: Vec<[f32; 1]> = a_signal.add_amp(b_signal).collect(); assert_eq!(added, vec![[0.4], [-0.5], [-0.3]]); }
fn mul_amp<S>(self, other: S) -> MulAmp<Self, S> where S: Signal, S::Item: Frame, S::Item::Sample == Self::Item::Sample::Float, S::Item::NumChannels == Self::Item::NumChannels
Provides an iterator that yields the product of the frames yielded by both other
and
self
in lock-step.
Example
extern crate sample; use sample::Signal; fn main() { let a = [[0.25], [-0.8], [-0.5]]; let b = [[0.2], [0.5], [0.8]]; let a_signal = a.iter().cloned(); let b_signal = b.iter().cloned(); let added: Vec<_> = a_signal.mul_amp(b_signal).collect(); assert_eq!(added, vec![[0.05], [-0.4], [-0.4]]); }
fn offset_amp(self, offset: Self::Item::Sample::Signed) -> OffsetAmp<Self>
Provides an iterator that offsets the amplitude of every channel in each frame of the signal by some sample value and yields the resulting frames.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[0.25, 0.4], [-0.2, -0.5]]; let signal = frames.iter().cloned(); let offset: Vec<[f32; 2]> = signal.offset_amp(0.5).collect(); assert_eq!(offset, vec![[0.75, 0.9], [0.3, 0.0]]); }
fn scale_amp(self, amp: Self::Item::Sample::Float) -> ScaleAmp<Self>
Produces an Iterator
that scales the amplitude of the sample of each channel in every
Frame
yielded by self
by the given amplitude.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[0.2], [-0.5], [-0.4], [0.3]]; let signal = frames.iter().cloned(); let scaled: Vec<[f32; 1]> = signal.scale_amp(2.0).collect(); assert_eq!(scaled, vec![[0.4], [-1.0], [-0.8], [0.6]]); }
fn offset_amp_per_channel<F>(self, amp_frame: F) -> OffsetAmpPerChannel<Self, F> where F: Frame<Sample=Self::Item::Sample::Signed, NumChannels=Self::Item::NumChannels>
Produces an Iterator
that offsets the amplitude of every Frame
in self
by the
respective amplitudes in each channel of the given amp_frame
.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[0.5, 0.3], [-0.25, 0.9]]; let mut signal = frames.iter().cloned().offset_amp_per_channel([0.25, -0.5]); assert_eq!(signal.next().unwrap(), [0.75, -0.2]); assert_eq!(signal.next().unwrap(), [0.0, 0.4]); }
fn scale_amp_per_channel<F>(self, amp_frame: F) -> ScaleAmpPerChannel<Self, F> where F: Frame<Sample=Self::Item::Sample::Float, NumChannels=Self::Item::NumChannels>
Produces an Iterator
that scales the amplitude of every Frame
in self
by the
respective amplitudes in each channel of the given amp_frame
.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[0.2, -0.5], [-0.4, 0.3]]; let mut signal = frames.iter().cloned().scale_amp_per_channel([0.5, 2.0]); assert_eq!(signal.next().unwrap(), [0.1, -1.0]); assert_eq!(signal.next().unwrap(), [-0.2, 0.6]); }
fn mul_hz<I>(self, mul_per_frame: I) -> MulHz<Self, I> where I: Iterator<Item=f64>
Multiplies the rate at which frames of self
are yielded by the given signal
.
This happens by wrapping self
in a rate::Converter
and calling set_playback_hz_scale
with the value yielded by signal
Example
extern crate sample; use sample::Signal; fn main() { let foo = [[0.0], [1.0], [0.0], [-1.0]]; let mul = [1.0, 1.0, 0.5, 0.5, 0.5, 0.5]; let frames: Vec<_> = foo.iter().cloned().mul_hz(mul.iter().cloned()).collect(); assert_eq!(&frames[..], &[[0.0], [1.0], [0.0], [-0.5], [-1.0]][..]); }
fn from_hz_to_hz(self, source_hz: f64, target_hz: f64) -> Converter<Self>
Converts the rate at which frames of the Signal
are yielded using interpolation.
Example
extern crate sample; use sample::Signal; fn main() { let foo = [[0.0], [1.0], [0.0], [-1.0]]; let frames: Vec<_> = foo.iter().cloned().from_hz_to_hz(1.0, 2.0).collect(); assert_eq!(&frames[..], &[[0.0], [0.5], [1.0], [0.5], [0.0], [-0.5], [-1.0]][..]); }
fn scale_hz(self, multi: f64) -> Converter<Self>
Multiplies the rate at which frames of the Signal
are yielded by the given value.
Example
extern crate sample; use sample::Signal; fn main() { let foo = [[0.0], [1.0], [0.0], [-1.0]]; let frames: Vec<_> = foo.iter().cloned().scale_hz(0.5).collect(); assert_eq!(&frames[..], &[[0.0], [0.5], [1.0], [0.5], [0.0], [-0.5], [-1.0]][..]); }
fn delay(self, n_frames: usize) -> Delay<Self>
Delays the Signal
by the given number of frames.
The delay is performed by yielding Frame::equilibrium()
n_frames
times before
continuing to yield frames from signal
.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[0.2], [0.4]]; let delayed: Vec<_> = frames.iter().cloned().delay(2).collect(); assert_eq!(delayed, vec![[0.0], [0.0], [0.2], [0.4]]); }
fn to_samples(self) -> ToSamples<Self>
Converts a Iterator
yielding Frame
s into an Iterator
yielding Sample
s.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[0.1, 0.2], [0.3, 0.4]]; let samples: Vec<_> = frames.iter().cloned().to_samples().collect(); assert_eq!(samples, vec![0.1, 0.2, 0.3, 0.4]); }
fn clip_amp(self, thresh: Self::Item::Sample::Signed) -> ClipAmp<Self>
Clips the amplitude of each channel in each Frame
yielded by self
to the given
threshold amplitude.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[1.2, 0.8], [-0.7, -1.4]]; let clipped: Vec<_> = frames.iter().cloned().clip_amp(0.9).collect(); assert_eq!(clipped, vec![[0.9, 0.8], [-0.7, -0.9]]); }
fn bus(self) -> Bus<Self>
Moves the Signal
into a Bus
from which its output may be divided into multiple other
Signal
s in the form of Output
s.
This method allows to create more complex directed acyclic graph structures that incorporate concepts like sends, side-chaining, etc, rather than being restricted to tree structures where signals can only ever be joined but never divided.
Note: When using multiple Output
s in this fashion, you will need to be sure to pull the
frames from each Output
in sync (whether per frame or per buffer). This is because when
output A requests Frame
s before output B, those frames mjust remain available for output
B and in turn must be stored in an intermediary ring buffer.
Example
extern crate sample; use sample::Signal; fn main() { let frames = [[0.1], [0.2], [0.3]]; let bus = frames.iter().cloned().bus(); let mut a = bus.send(); let mut b = bus.send(); assert_eq!(a.collect::<Vec<_>>(), vec![[0.1], [0.2], [0.3]]); assert_eq!(b.collect::<Vec<_>>(), vec![[0.1], [0.2], [0.3]]); }