audio_generator/sin.rs
1use crate::generator::Generator;
2
3/// A sine tone generator.
4///
5/// # Examples
6///
7/// ```rust
8/// use audio_generator::{Generator, Sin};
9///
10/// let mut g = Sin::new(440.0, 44100.0);
11/// assert_eq!(g.sample(), 0.0);
12/// assert!(g.sample() > 0.0);
13/// ```
14pub struct Sin {
15 at: f32,
16 step: f32,
17 round_at: f32,
18}
19
20impl Sin {
21 /// Construct a new sine tone generator. The generated tone has the given
22 /// `rate` adjusted for the provided `sample_rate`.
23 ///
24 /// # Examples
25 ///
26 /// ```rust
27 /// use audio_generator::{Generator, Sin};
28 ///
29 /// let mut g = Sin::new(440.0, 44100.0);
30 /// assert_eq!(g.sample(), 0.0);
31 /// assert!(g.sample() > 0.0);
32 /// ```
33 pub fn new(rate: f32, sample_rate: f32) -> Self {
34 let freq = rate / sample_rate / 2.0;
35 let step = 2.0 * std::f32::consts::PI * freq;
36
37 Self {
38 at: 0.0,
39 step,
40 round_at: step / freq,
41 }
42 }
43}
44
45impl Iterator for Sin {
46 type Item = f32;
47
48 fn next(&mut self) -> Option<Self::Item> {
49 Some(self.sample())
50 }
51}
52
53impl Generator for Sin {
54 type Sample = f32;
55
56 fn sample(&mut self) -> Self::Sample {
57 let f = self.at;
58 self.at += self.step;
59
60 if self.at > self.round_at {
61 self.at -= self.round_at;
62 }
63
64 f
65 }
66}