3个版本 (破坏性)

0.3.0 2024年5月27日
0.2.0 2020年1月12日
0.1.0 2019年12月27日

#307 in 嵌入式开发

MIT 许可证

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