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}