use core::convert::TryFrom;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Note {
C(i8),
Db(i8),
D(i8),
Eb(i8),
E(i8),
F(i8),
Gb(i8),
G(i8),
Ab(i8),
A(i8),
Bb(i8),
B(i8),
}
impl TryFrom<u8> for Note {
type Error = std::num::TryFromIntError;
fn try_from(note: u8) -> Result<Self, Self::Error> {
let note = i8::try_from(note)?;
let octave = note / 12;
let note = match note % 12 {
0 => Note::C,
1 => Note::Db,
2 => Note::D,
3 => Note::Eb,
4 => Note::E,
5 => Note::F,
6 => Note::Gb,
7 => Note::G,
8 => Note::Ab,
9 => Note::A,
10 => Note::Bb,
11 => Note::B,
_ => unreachable!(),
};
Ok(note(octave - 1))
}
}