staff 0.11.0

Music theory library with midi, notes, chords, scales, and more
Documentation
use super::Frequencies;
use rodio::source::SineWave;
use std::slice;

#[derive(Clone, Debug, Default)]
pub struct SineWaveChord {
    sine_waves: Box<[SineWave]>,
}

impl FromIterator<f32> for SineWaveChord {
    fn from_iter<T: IntoIterator<Item = f32>>(iter: T) -> Self {
        let mut sine_waves = Vec::new();
        for frequency in iter {
            sine_waves.push(SineWave::new(frequency));
        }

        Self {
            sine_waves: sine_waves.into_boxed_slice(),
        }
    }
}

pub struct SineWaveChordFrequencies<'a> {
    iter: slice::IterMut<'a, SineWave>,
}

impl Iterator for SineWaveChordFrequencies<'_> {
    type Item = f32;

    fn next(&mut self) -> Option<Self::Item> {
        self.iter.next().map(|sine_wave| sine_wave.next().unwrap())
    }
}

impl Frequencies for SineWaveChord {
    type Frequencies<'a> = SineWaveChordFrequencies<'a>;

    fn frequencies<'a>(&'a mut self) -> Self::Frequencies<'a> {
        SineWaveChordFrequencies {
            iter: self.sine_waves.iter_mut(),
        }
    }
}