3个版本 (破坏性)
0.3.0 | 2024年5月27日 |
---|---|
0.2.0 | 2020年1月12日 |
0.1.0 | 2019年12月27日 |
#307 in 嵌入式开发
63KB
1.5K SLoC
usbd-midi
为usb-device的一个简单的USB MIDI设备类。
目前这个实现旨在非常简单,允许微控制器像桌面计算机这样的主机发送或接收MIDI信息。
此crate需要使用实现usb-device
特质的HAL。
示例
接收MIDI
当C2音符被按下时,打开LED。示例仅显示硬件无关的部分。
// Prerequisites, must be setup according to the used board.
let mut led = todo!(); // Must implement `embedded_hal::digital::OutputPin`.
let usb_bus = todo!(); // Must be of type `usb_device::bus::UsbBusAllocator`.
// Create a MIDI class with 1 input and 1 output jack.
let mut midi = MidiClass::new(&usb_bus, 1, 1);
let mut usb_dev = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x5e4))
.product("MIDI Test")
.device_class(0)
.device_sub_class(0)
.build();
loop {
if !usb_dev.poll(&mut [&mut midi]) {
continue;
}
let mut buffer = [0; 64];
if let Ok(size) = midi.read(&mut buffer) {
let buffer_reader = MidiPacketBufferReader::new(&buffer, size);
for packet in buffer_reader.into_iter() {
if let Ok(packet) = packet {
match packet.message {
Message::NoteOn(Channel1, Note::C2, ..) => {
led.set_low().unwrap();
},
Message::NoteOff(Channel1, Note::C2, ..) => {
led.set_high().unwrap();
},
_ => {}
}
}
}
}
}
使用多个MIDI端口
使用MidiClass::new(&usb_bus, N, M);
与N, M >= 1
提供多个输入或输出端口需要control-buffer-256
功能
Cargo.toml
usb-device = { version = ">=0.3.2", features = ["control-buffer-256"] }
可以通过这种方式使用最多5个输入/输出对,直到再次耗尽缓冲区空间。请注意,超出可用的缓冲区空间将静默失败,无法正确发送描述符,没有明显的panic!
会提示实际问题。
依赖项
~2MB
~44K SLoC