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}