use core::fmt; use std::fmt::Formatter; #[derive(Clone, Debug, PartialEq)] pub enum RelativeNote { C, CSharp, D, DSharp, E, F, FSharp, G, GSharp, A, ASharp, B, } #[derive(Clone, Debug, PartialEq)] pub struct Note { relative: RelativeNote, octave: u8, // upper limit? 8? } impl fmt::Display for Note { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { write!( f, "{}{}", match self.relative { RelativeNote::C => "C", RelativeNote::CSharp => "C#", RelativeNote::D => "D", RelativeNote::DSharp => "D#", RelativeNote::E => "E", RelativeNote::F => "F", RelativeNote::FSharp => "F#", RelativeNote::G => "G", RelativeNote::GSharp => "G#", RelativeNote::A => "A", RelativeNote::ASharp => "A#", RelativeNote::B => "B", }, self.octave ) } } #[cfg(test)] mod test { use crate::note::{Note, RelativeNote}; #[test] fn c4() { assert_eq!(Note { relative: RelativeNote::C, octave: 4 }.to_string(), "C4"); } #[test] fn a_sharp_0() { assert_eq!(Note { relative: RelativeNote::ASharp, octave: 0 }.to_string(), "A#0"); } }