use keyboard_types::Code;
#[must_use]
pub fn code_to_midi_note(code: Code, octave_offset: i8) -> Option<u8> {
let base: i16 = 60 + (i16::from(octave_offset) * 12);
let offset: i16 = match code {
Code::KeyA => 0,
Code::KeyS => 2,
Code::KeyD => 4,
Code::KeyF => 5,
Code::KeyG => 7,
Code::KeyH => 9,
Code::KeyJ => 11,
Code::KeyK => 12,
Code::KeyL => 14,
Code::Semicolon => 16,
Code::KeyW => 1,
Code::KeyE => 3,
Code::KeyT => 6,
Code::KeyY => 8,
Code::KeyU => 10,
Code::KeyO => 13,
Code::KeyP => 15,
_ => return None,
};
let note = base + offset;
if (0..=127).contains(¬e) {
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
let n = note as u8;
Some(n)
} else {
None
}
}
#[must_use]
pub fn code_to_octave_shift(code: Code) -> Option<i8> {
match code {
Code::KeyZ => Some(-1),
Code::KeyX => Some(1),
_ => None,
}
}