WASHIYAMA GIKEN
恐る恐るRaspberry Pi PicoのSDKにあるTinyUSBをつかってみたら、恐ろしく簡単にMIDI受信できました。
プロジェクトの作成pico-sdkのtinyusbにMIDI送信のサンプルプログラムmidi_testがあるので、これをベースにMIDI受信用プロジェクトを作成します。 ファイルの構成は以下の通りです。
usb_midi ├─ CMakeLists.txt ├─ pico_sdk_import.cmake ├─ tusb_config.h ├─ usb_descriptors.c └─ main.c- 適当な場所にフォルダ作成。今回はusb_midiとしました。
- pico-sdk/lib/tinyusb/examples/device/midi_test/srcにある3つのファイルをusb_midiフォルダにコピーします。
- pico-examples/pico_sdk_import.cmakeをusb_midiフォルダにコピー。
- 以下の内容でCMakeLists.txtを作成。
コピーしたサンプルプログラムをそのままビルドすると、シーケンサー的にNoteOn/Offが送信されます。これを変更してNoteOn/Offを受信した時にLEDがついたり消えたりするようにしてみました。
#include "bsp/board.h" #include "tusb.h" void midi_task(void) { uint8_t n_data; uint8_t msg[4]; while (tud_midi_available()) { if (n_data = tud_midi_read(msg, 3)) { switch (0xf0 & msg[0]) { case 0x80: // NoteOff board_led_off(); break; case 0x90: // NoteOn if (msg[2] == 0) board_led_off(); // velocity == 0 --> NoteOff else board_led_on(); break; default: break; } } } } int main(void) { board_init(); tusb_init(); while (1) { tud_task(); // tinyusb device task midi_task(); } return 0; }tud_midi_available()でデータがあればtud_midi_read()でデータを取り出して、あとはメッセージの種類に応じて処理するだけ。