mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-08 12:46:42 +01:00
30 lines
861 B
Rust
30 lines
861 B
Rust
use crate::*;
|
|
|
|
/// A currently playing instance of a sample.
|
|
#[derive(Default, Debug, Clone)]
|
|
pub struct Voice {
|
|
pub sample: Arc<RwLock<Sample>>,
|
|
pub after: usize,
|
|
pub position: usize,
|
|
pub velocity: f32,
|
|
}
|
|
|
|
impl Iterator for Voice {
|
|
type Item = [f32;2];
|
|
fn next (&mut self) -> Option<Self::Item> {
|
|
if self.after > 0 {
|
|
self.after = self.after - 1;
|
|
return Some([0.0, 0.0])
|
|
}
|
|
let sample = self.sample.read().unwrap();
|
|
if self.position < sample.end {
|
|
let position = self.position;
|
|
self.position = self.position + 1;
|
|
return sample.channels[0].get(position).map(|_amplitude|[
|
|
sample.channels[0][position] * self.velocity,
|
|
sample.channels[0][position] * self.velocity,
|
|
])
|
|
}
|
|
None
|
|
}
|
|
}
|