use crate::message::Channel;
use crate::parse_error::*;
use crate::util::*;
use alloc::vec::Vec;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct KeyBasedInstrumentControl {
pub channel: Channel,
pub key: u8,
pub control_values: Vec<(u8, u8)>,
}
impl KeyBasedInstrumentControl {
pub(crate) fn extend_midi(&self, v: &mut Vec<u8>) {
v.push(self.channel as u8);
push_u7(self.key, v);
for (cc, x) in self.control_values.iter().cloned() {
if cc == 0x06 || cc == 0x26 || cc == 0x60 || cc == 0x65 || cc >= 0x78 {
v.push(1);
} else {
v.push(cc);
}
push_u7(x, v);
}
}
#[allow(dead_code)]
pub(crate) fn from_midi(_m: &[u8]) -> Result<(Self, usize), ParseError> {
Err(ParseError::NotImplemented("KeyBasedInstrumentControl"))
}
}
#[cfg(test)]
mod tests {
use crate::*;
use alloc::vec;
#[test]
fn serialize_controller_destination() {
assert_eq!(
MidiMsg::SystemExclusive {
msg: SystemExclusiveMsg::UniversalRealTime {
device: DeviceID::AllCall,
msg: UniversalRealTimeMsg::KeyBasedInstrumentControl(
KeyBasedInstrumentControl {
channel: Channel::Ch2,
key: 0x60,
control_values: vec![
(0x06, 0x40), (ControlNumber::Effects4Depth as u8, 0x20),
]
}
),
}
}
.to_midi(),
vec![
0xF0, 0x7F, 0x7F, 0xA, 0x1, 0x1, 0x60, 0x01, 0x40, 94, 0x20, 0xF7
]
);
}
}