use crate::{
cent::Cent,
pitch::{Pitch, PitchClass},
};
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct OctaveOffsets {
pub c: Cent,
pub cs: Cent,
pub d: Cent,
pub eb: Cent,
pub e: Cent,
pub f: Cent,
pub fs: Cent,
pub g: Cent,
pub ab: Cent,
pub a: Cent,
pub bb: Cent,
pub b: Cent,
}
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct CentsTable {
pub c: Cent,
pub cs: Cent,
pub d: Cent,
pub eb: Cent,
pub e: Cent,
pub f: Cent,
pub fs: Cent,
pub g: Cent,
pub ab: Cent,
pub a: Cent,
pub bb: Cent,
pub b: Cent,
}
impl OctaveOffsets {
pub fn new_from_cents_table(table: CentsTable) -> Self {
Self {
c: table.c,
cs: table.cs - 100.0,
d: table.d - 200.0,
eb: table.eb - 300.0,
e: table.e - 400.0,
f: table.f - 500.0,
fs: table.fs - 600.0,
g: table.g - 700.0,
ab: table.ab - 800.0,
a: table.a - 900.0,
bb: table.bb - 1000.0,
b: table.b - 1100.0,
}
}
pub fn offset_for(&self, pitch: Pitch) -> Cent {
match pitch.into() {
PitchClass::A => self.a,
PitchClass::Ab => self.ab,
PitchClass::B => self.b,
PitchClass::Bb => self.bb,
PitchClass::C => self.c,
PitchClass::Cs => self.cs,
PitchClass::D => self.d,
PitchClass::E => self.e,
PitchClass::Eb => self.eb,
PitchClass::F => self.f,
PitchClass::Fs => self.fs,
PitchClass::G => self.g,
}
}
}