RP2040で簡単!USB-MIDIデバイスをDIYしよう!（基本編）

![IMB_uCLUlq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/a7433274-302e-672c-0b12-5a20c6bc77d6.gif)

会社のアドカレをプチネタで埋める活動も、おかげさまで順調に枠が埋まり2024年度は今回で最後になりそうです！よかった！
もちろんカレンダーは明日以降も順調に続く予定ですので、他の社員有志の投稿をお楽しみに！

[KDDIテクノロジー アドベントカレンダー2024](https://qiita.com/advent-calendar/2024/kddi-technology)

## 過去記事と何が違う?!

実は過去に何本も似たような記事書いてますね。

- [Arduinoを使ってWeb MIDI APIから制御可能なUSB MIDIデバイスを自作する（MIDIUSB編）](https://qiita.com/tadfmac/items/8b532134247492427a43)
- [Arduino UNOで作る一番簡単なMIDI音源](https://qiita.com/tadfmac/items/443207986039f48c578a)
- [Arduino Leonardo/MicroでもMIDI使いたい。](https://qiita.com/tadfmac/items/d685dae3e46d570386c3)
- [Arduino UNOとATTiny13Aを使ったタッチセンサーMIDIコントロールデバイスの作り方](https://qiita.com/tadfmac/items/f2172cdacbdd5600256e)

2024年の今、初心者がUSB-MIDIデバイスの制作に挑戦する環境としてATmegaやATtinyを採用するのは、コストメリットもなく技術的な難易度的にも合わなくなったと思います。

> AtmelもMicrochipになっちゃいましたしねー。

最近、DIY界隈で人気なのは、[Raspberry Pi Pico](https://www.raspberrypi.com/products/raspberry-pi-pico/) に代表される RP2040搭載マイコンボードだと思います。安くて高性能。[Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html) のように小型のボードもあり、さまざまなデバイスのDIYに使いやすいです。

今回の記事では RP2040マイコンを使ってMIDIデバイスを作る方法を紹介します。

> 記事冒頭のGIFに写ってるXMASツリーは、[昨年の記事](https://qiita.com/tadfmac/items/fe70cfe2133d6b1c3e37)で作成したものに USB-MIDIファームウエアを書き込んで PCで動作しているWebアプリと連動させたものです。[Ogaki Mini Maker Faire](https://www.iamas.ac.jp/ommf2024/)にて展示しました！

## 準備（物理）

下記を準備しましょう。以下必須です。

- RP2040マイコン（前述の Raspi Picoでも、XIAO RP2040でも、その他の互換ボードでも大丈夫です）
- Arduino IDEが動くPCとUSBケーブル（PC側のUSB端子とマイコンボード搭載のUSB端子を接続可能なケーブル）

下記はあると便利です。RP2040にファームウエアを書き込む際にBOOTボタンを押しながらUSBケーブルをPCから抜き差しする時に微妙に手が足りん！ということがなくなります。

- スイッチ付きUSBハブ ([例えばこういうの](https://www.amazon.co.jp/Sabrent-USB-%E3%83%96%E3%83%AB%E3%83%BCLED%E3%83%8F%E3%83%96-4%E3%83%9D%E3%83%BC%E3%83%88%E3%80%81%E5%80%8B%E5%88%A5%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E4%BB%98%E3%81%8D-HB-UM43/dp/B00JX1ZS5O/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1BEG5Q5YMSGF9&dib=eyJ2IjoiMSJ9.HOpNSHVyDVbk5RZ26FcDePsHlcloK0rxiAKLgXJ5al0R6r0TCgI6S6Kd2uMjFYeVSs0IeJCvXCR7FugWESFoyLlXzp4Fly9uShKU7qjaDXsV8nmOWSAMIqKx9xfmKdDep-U6hVgz7jKF3Hvf4aY_iRoeiseQIEivw_EUZPj0LEEeOwTY83N7VctqZq20nwyxgYQkvM0hYyv4-xxLmTz82ZwA8fkcar6rdHvS9xhbpCM3BOyCgjbzxlyhrUlH5ga4AZrFyT3RymwrJiQcEtPcoJZfGcV0NTNbGN2EsgWUUNU.Vrfo6hwuigQpKZUyoSq40JoxdUt8mWTFb4BBNmmwoA8&dib_tag=se&keywords=%27usb%E3%83%8F%E3%83%96+%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81&qid=1733544182&sprefix=usb+%E3%83%8F%E3%83%96+%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%2Caps%2C171&sr=8-6))

## 準備（ソフトウエア）

ソフトウエアの準備として下記が必要です。

- 1. Arduino IDE のインストール
- 2. Arduino IDEへ、arduino pico ボード設定の追加
- 3. Arduino IDEへ、Adafruit TinyUSB ライブラリの追加

順を追ってやってみましょう。

### 1. [Arduino IDE](https://www.arduino.cc/en/software) のインストール

[リンク](https://www.arduino.cc/en/software) からPCのOSに合わせたVer.をダウンロードしてインストールしておいてください。

> 私は今だに 1.8.x 系列を使ってますけど、最近は2.x 系列でも安定したんじゃないかな？使ってないからわかりません。

### 2. [arduono-pico](https://github.com/earlephilhower/arduino-pico) をArduino IDEに導入

ArduinoはRP2040を標準ではサポートしていません！.... というのは実は嘘で、[Arduino Mbed Core for RP2040](https://blog.arduino.cc/2021/04/27/arduino-mbed-core-for-rp2040-boards/)という標準サポートのボード設定もあります。[Arduino Nano RP2040 Connect](https://blog.oniudra.cc/2021/01/20/welcome-raspberry-pi-to-the-world-of-microcontrollers/)などのボードを使う場合は、こちら標準のライブラリも使えますが、Arduinoが出してるボードしかサポートしてないこともあって、微妙に流行ってません。

迷わずさまざまなボードに対応した[arduono-pico](https://github.com/earlephilhower/arduino-pico)の方をお勧めしますので、本稿ではこちらの導入方法について紹介します。

#### 2-1. Preferences へ Additional Boards Manager URLs を設定

Arduino IDE起動後、[Arduino > Preferences]を選びます。
`Preferences` 画面が表示されますので、`Additional Boards Manager URLs` のテキストボックスに下記URLを入れます。



```
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
```

`Preferences` 画面は `OK` を選んで閉じます。

#### 2-2. Board Managerで ボード設定をインストール

続いてArduino IDEから、[Tools > Board > Board Manager] を選びます。

![board-manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/6c1a902d-d79d-2d1e-e91a-8bc35c88421f.png)


`Boards Manager` 画面が表示されます。
テキストボックスに `RP2040` と入力してください。
いくつか、追加可能なボード設定の一覧が出てきます。

`Raspberry Pi Pico/RP2040/RP2350` と書いたボード設定が見つかります。

![board-manager-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/d70545a5-1b1e-e4c5-9f4c-4ff46db45b42.png)


これをインストールしてください。（既にインストールしてると`update`ボタンが表示されます）

ボード設定のインストールが終わったら`Boards Manager` 画面は `Close` ボタンで閉じて構いません。

### 3. [Adafruit TinyUSB](ttps://github.com/adafruit/Adafruit_TinyUSB_Arduino) をArduino IDEに導入

次にインストールするのはライブラリです。下記手順でインストールしてください。
Arduino IDEから、[Tools > Manage Libraries] を選びます。

![library-manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/cf1a8fb9-23b6-4640-814e-3d052be4c131.png)

`Boards Manager`とよく似た `Library Manager` 画面が表示されます。

検索Boxに `TinyUSB` と入力してください。

`Adaftuit TinyUSB Library` が見つかりますので、`install` ボタンを押してインストールします。

![library-manager-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/ea30b6ac-70e0-4666-8b1d-9cb25386ff83.png)


インストールが終わったら `Library Manager` 画面は `Close` ボタンで閉じてください。

## example を動かしてみよう

ざっくり準備が終わりましたので、Arduinoでスケッチを作ってボードに書き込んでみます。最初からコードを書くのは大変ですので、`example` を書き込んでみましょう。

TinyUSB ライブラリを追加すると、ライブラリを使った example も Arduino IDEに追加されます。

> Arduino環境の凄いところはまさにココ。最初っから悩まずにスルスル学習が進むところですね。

### 1. example を開く

今回は、[File > Examples > Adafruit TinyUSB Library > MIDI > midi_test] を選んで開いてみましょう。

![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/2247d0e4-1f60-b0e3-c79f-35d107d1500a.png)

私が書いたコードじゃないので転載差し控えますが、おおまかに下記内容のプログラムになっています。

- ループでメロディ（MIDI Note ON / MIDI Note OFF）を送信
- MIDIイベントをデバイス側が受信するとシリアル経由で届いた内容を送信

という感じです。

### 2. デバイスへの書き込み。の前の準備

それではさっそく、デバイスに書き込んでみましょう。と言いたいところですが、ファイルを開いたあとに書き込みの準備をします。

#### 2-1. ターゲットボードの選択

さきほど `board manager` からボード設定を追加しましたので、RP2040デバイスが選べるようになっているはずです。

今回私は [Seeed XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html) を準備しましたので、こちらの設定を読み込みます。

[Tools > Board > Raspberry Pi RP2040 Boards ... > Seeed XIAO RP2040] と選びます。この部分ではお使いのデバイスを選んでくださいね。

![board-selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/9c40a9b9-2135-0074-30ec-315986c7077c.png)


#### 2-2. USB Stackの選択

ボードを選んだ後は、さまざまなボード設定が行えるようになりますが、今回は USB Stackの設定のみ変更します。

[Tools > USB Stack > Adafruit TinyUSB] を選んでください。

![usb-stack-selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/2fceddfd-f0b7-2261-b862-706c2484470d.png)

### 3. 書き込み！

準備も終わりましたので、さっそくデバイスにプログラムを書き込んでみましょう。

手順は下記の通りです。

#### 3-1. デバイスを`BOOT`モードで PCに接続

デバイス（RP2040ボード）には、`BOOT`スイッチが備わっているはずです。
この`BOOT`スイッチを**押しながら** PCのUSBポートに接続してデバイスの電源を入れる必要があります。

USB-C端子は固く、最近のPCはPC側もUSB-Cだったりするので、この作業が実はかなりやりにくいです。
スイッチ付きUSBハブがかなり欲しくなると思いますが、なければ頑張ってください。
....安いスイッチつきUSBハブの導入をお勧めします。

`BOOT`モードで起動すると、PCから見ると `RPI-RP2` マスストレージデバイスがマウントされます。

![mounted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/ce852ad0-7127-d37a-f5a1-1dca350c6c06.png)

OSにもよりますが（上記はMacの場合）マウントされたDiskが見えたらひとまず成功です。

#### 3-2. 書き込み

それでは、プログラムを書き込んでみましょう。

Arduino IDEの画面左上、左から2番目の `→` アイコンをクリックするとアップロードが始まります。

![write-button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/816c0a59-541a-d001-b92e-5852b81717ca.png)


下記のような画面が出たら書き込み成功です。


![upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/db1685ce-3564-4fed-69d5-c1c3e0f1450e.png)

うまくいかなかったら、これまでの手順を見直して、やり直してみてください。

書き込みが終わると、`BOOT`モードで接続されていたデバイスは一度自動的にアンマウントされ、新たにMIDIデバイスとして接続されます。

### 4. テスト

最後に動作テストの方法です。

一番簡単なのは、Web MIDI を使ってブラウザでテストする方法です。
下記サイトで 接続された MIDIデバイス情報を確認することができますので、やってみてください。

まず、下記サイトに Web MIDI API に対応したブラウザ（iOS以外のChrome、Edgeブラウザーなど）でアクセスします。

https://webmidiaudio.com/npage102.html

上記サイトのコンテンツの中段くらいに「入力」と書かれたセレクターがあります。

![スクリーンショット 2024-12-07 16.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/86d21095-045a-8d51-4f1f-a0ed352b1b75.png)


このセレクターで「XIAO RP2040」など、今回利用したデバイスが表示されていれば、まずは成功です！

![スクリーンショット 2024-12-07 16.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/62f511d0-5820-3e84-933e-f803ad9232b4.png)


表示されているデバイスを選択すると、少し上に表示されているテキストエリアに何やらテキストがどんどん表示されているはずです。

これがデバイスから送られてくる MIDIメッセージのダンプになります。

## まとめ

RP2040とArduinoを使ってUSB MIDIデバイスをDIYする方法、の基本的な部分の解説を行いました。
一旦、今回の記事はここまでで一区切りとしたいと思います。

USB MIDIデバイスをもう少し使いやすくするために、PCから認識されるデバイス名などを変更する方法などについては別の機会に書いて行こうと思います。

最後までおつきあいいただき、ありがとうございました！

P.S.
大垣で展示したクリスマスツリー形MIDIデバイスは、その後職場に飾りました！クリスマス終了まで稼働予定！

![IMB_1rjEGX.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31758/416ac7da-1776-be5c-eecc-8e0eb714ca6e.gif)