pitchy 0.2.0

Minimalistic Rust library for working with frequencies (Hz), MIDI numbers, musical notes, and pitch operations like transposition and octave shifts.
Documentation
#[test]
fn test_try_from_pitch_to_note() {
    use crate::{Accidental, Note, Pitch, note::symbol::NoteLetter};
    use core::convert::TryFrom;

    struct Case {
        midi: u8,
        expected_letter: NoteLetter,
        expected_accidental: Accidental,
        expected_octave: i8,
        #[cfg(feature = "std")]
        expected_name: &'static str,
    }

    let cases = [
        Case {
            midi: 0,
            expected_letter: NoteLetter::C,
            expected_accidental: Accidental::Natural,
            expected_octave: -1,
            #[cfg(feature = "std")]
            expected_name: "C-1",
        },
        Case {
            midi: 60,
            expected_letter: NoteLetter::C,
            expected_accidental: Accidental::Natural,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "C4",
        },
        Case {
            midi: 61,
            expected_letter: NoteLetter::C,
            expected_accidental: Accidental::Sharp,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "C#4",
        },
        Case {
            midi: 62,
            expected_letter: NoteLetter::D,
            expected_accidental: Accidental::Natural,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "D4",
        },
        Case {
            midi: 63,
            expected_letter: NoteLetter::D,
            expected_accidental: Accidental::Sharp,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "D#4",
        },
        Case {
            midi: 64,
            expected_letter: NoteLetter::E,
            expected_accidental: Accidental::Natural,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "E4",
        },
        Case {
            midi: 65,
            expected_letter: NoteLetter::F,
            expected_accidental: Accidental::Natural,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "F4",
        },
        Case {
            midi: 66,
            expected_letter: NoteLetter::F,
            expected_accidental: Accidental::Sharp,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "F#4",
        },
        Case {
            midi: 67,
            expected_letter: NoteLetter::G,
            expected_accidental: Accidental::Natural,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "G4",
        },
        Case {
            midi: 68,
            expected_letter: NoteLetter::G,
            expected_accidental: Accidental::Sharp,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "G#4",
        },
        Case {
            midi: 69,
            expected_letter: NoteLetter::A,
            expected_accidental: Accidental::Natural,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "A4",
        },
        Case {
            midi: 70,
            expected_letter: NoteLetter::A,
            expected_accidental: Accidental::Sharp,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "A#4",
        },
        Case {
            midi: 71,
            expected_letter: NoteLetter::B,
            expected_accidental: Accidental::Natural,
            expected_octave: 4,
            #[cfg(feature = "std")]
            expected_name: "B4",
        },
        Case {
            midi: 72,
            expected_letter: NoteLetter::C,
            expected_accidental: Accidental::Natural,
            expected_octave: 5,
            #[cfg(feature = "std")]
            expected_name: "C5",
        },
    ];

    for case in cases {
        let pitch = Pitch::try_from_midi_number(case.midi).unwrap();
        let note = Note::try_from(pitch).unwrap();

        assert_eq!(
            note.letter(),
            case.expected_letter,
            "Wrong letter for MIDI {}",
            case.midi
        );
        assert_eq!(
            note.accidental(),
            case.expected_accidental,
            "Wrong accidental for MIDI {}",
            case.midi
        );
        assert_eq!(
            note.octave(),
            case.expected_octave,
            "Wrong octave for MIDI {}",
            case.midi
        );

        #[cfg(feature = "std")]
        assert_eq!(
            note.name(),
            case.expected_name,
            "Wrong name for MIDI {}",
            case.midi
        );
    }
}