pub use crate::protocols::query::*;
use super::Button;
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub enum Message {
Press { button: Button },
Release { button: Button },
TextEndedOrLooped,
DeviceInquiry(DeviceInquiry),
VersionInquiry(VersionInquiry),
FaderChange { index: u8, value: u8 },
}
pub struct Input;
fn decode_grid_button(btn: u8) -> Button {
let x = (btn % 10) - 1;
let y = 8 - (btn / 10);
Button::GridButton { x, y }
}
impl crate::InputDevice for Input {
const MIDI_DEVICE_KEYWORD: &'static str = "Launchpad MK2";
const MIDI_CONNECTION_NAME: &'static str = "Launchy Mk2 Input";
type Message = Message;
fn decode_message(_timestamp: u64, data: &[u8]) -> Message {
if let Some(device_inquiry) = parse_device_query(data) {
return Message::DeviceInquiry(device_inquiry);
}
if let Some(version_inquiry) = parse_version_query(data) {
return Message::VersionInquiry(version_inquiry);
}
match data {
&[0x90, button, velocity] => {
let button = decode_grid_button(button);
match velocity {
0 => Message::Release { button },
127 => Message::Press { button },
other => panic!("Unexpected grid note-on velocity {}", other),
}
}
&[0xB0, number @ 104..=111, velocity] => {
let button = Button::ControlButton {
index: number - 104,
};
match velocity {
0 => Message::Release { button },
127 => Message::Press { button },
other => panic!("Unexpected control note-on velocity {}", other),
}
}
&[0xB0, number @ 21..=28, value] => Message::FaderChange {
index: number - 21,
value,
},
&[240, 0, 32, 41, 2, 24, 21, 247] => Message::TextEndedOrLooped,
other => panic!("Unexpected midi message: {:?}", other),
}
}
}