1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
mod amplitude;
pub use self::amplitude::Amplitude;

mod iter;
pub use self::iter::Iter;

/// The trait for an audio generator.
pub trait Generator {
    /// The sample that is generated.
    type Sample;

    /// Generate the next sample from the generator. Advances the underlying
    /// generator to the next sample.
    ///
    /// # Examples
    ///
    /// ```rust
    /// use audio_generator::{Generator, Sin};
    ///
    /// let mut g = Sin::new(440.0, 44100.0);
    /// assert_eq!(g.sample(), 0.0);
    /// assert!(g.sample() > 0.0);
    /// ```
    fn sample(&mut self) -> Self::Sample;

    /// Construct an iterator from this generator.
    ///
    /// ```rust
    /// use audio_generator::{Generator, Sin};
    ///
    /// let mut g = Sin::new(440.0, 44100.0).amplitude(0.5);
    /// let samples = g.iter().take(10).collect::<Vec<f32>>();
    ///
    /// assert_eq!(samples.len(), 10);
    /// ```
    fn iter(self) -> Iter<Self>
    where
        Self: Sized,
    {
        Iter::new(self)
    }

    /// Modify the amplitude of the sample.
    ///
    /// # Examples
    ///
    /// ```rust
    /// use audio_generator::{Generator, Sin};
    ///
    /// let mut a = Sin::new(440.0, 44100.0).amplitude(0.1);
    /// let mut b = Sin::new(440.0, 44100.0).amplitude(0.1);
    ///
    /// for _ in 0..100 {
    ///     assert!(a.sample().abs() <= b.sample().abs());
    /// }
    /// ```
    fn amplitude(self, amplitude: f32) -> Amplitude<Self>
    where
        Self: Sized,
    {
        Amplitude::new(self, amplitude)
    }
}