use crate::traits::FillHarmonics;
use crate::{SCOPE, TONIC};
use std::collections::HashMap;
#[derive(Default)]
pub struct NaturalMusicBox {
tonic: f64,
pub harmonics: HashMap<String, f64>,
}
impl NaturalMusicBox {
pub fn new() -> Self {
let mut music = Self {
tonic: TONIC,
harmonics: HashMap::new(),
};
music.fill_harmonics();
music
}
}
impl FillHarmonics for NaturalMusicBox {
fn fill_harmonics(&mut self) {
for i in 1..SCOPE {
let harmonic_series: f64 = ((i as f64) + 1.0) / (i as f64);
let overtone = self.tonic * harmonic_series;
self.harmonics
.insert(format!("{}/{}", i, i + 1), overtone.to_owned());
}
}
fn fill_inverse_harmonics(&mut self) {
for i in 1..SCOPE {
let harmonic_series: f64 = ((i as f64) + 1.0) / (i as f64);
let overtone = self.tonic / harmonic_series;
self.harmonics
.insert(format!("{}/{}", i, i + 1), overtone.to_owned());
}
}
}