audio_generator/
generator.rs

1mod amplitude;
2pub use self::amplitude::Amplitude;
3
4mod iter;
5pub use self::iter::Iter;
6
7/// The trait for an audio generator.
8pub trait Generator {
9    /// The sample that is generated.
10    type Sample;
11
12    /// Generate the next sample from the generator. Advances the underlying
13    /// generator to the next sample.
14    ///
15    /// # Examples
16    ///
17    /// ```rust
18    /// use audio_generator::{Generator, Sin};
19    ///
20    /// let mut g = Sin::new(440.0, 44100.0);
21    /// assert_eq!(g.sample(), 0.0);
22    /// assert!(g.sample() > 0.0);
23    /// ```
24    fn sample(&mut self) -> Self::Sample;
25
26    /// Construct an iterator from this generator.
27    ///
28    /// ```rust
29    /// use audio_generator::{Generator, Sin};
30    ///
31    /// let mut g = Sin::new(440.0, 44100.0).amplitude(0.5);
32    /// let samples = g.iter().take(10).collect::<Vec<f32>>();
33    ///
34    /// assert_eq!(samples.len(), 10);
35    /// ```
36    fn iter(self) -> Iter<Self>
37    where
38        Self: Sized,
39    {
40        Iter::new(self)
41    }
42
43    /// Modify the amplitude of the sample.
44    ///
45    /// # Examples
46    ///
47    /// ```rust
48    /// use audio_generator::{Generator, Sin};
49    ///
50    /// let mut a = Sin::new(440.0, 44100.0).amplitude(0.1);
51    /// let mut b = Sin::new(440.0, 44100.0).amplitude(0.1);
52    ///
53    /// for _ in 0..100 {
54    ///     assert!(a.sample().abs() <= b.sample().abs());
55    /// }
56    /// ```
57    fn amplitude(self, amplitude: f32) -> Amplitude<Self>
58    where
59        Self: Sized,
60    {
61        Amplitude::new(self, amplitude)
62    }
63}