https://qiita.com/tadfmac/items/bba45c47aa33b893a3bd
の続きです!
って、1年ぶりではないか!w
前回何書いたのか、すでにほぼ忘れてるんですが、おそらくタイトルから察するにRP2040を使ってMIDIデバイスをDIYする方法でも書いたんでしょう。(読め!>自分)
しかし、前回の記事の最後で
USB MIDIデバイスをもう少し使いやすくするために、PCから認識されるデバイス名などを変更する方法などについては別の機会に書いて行こうと思います。
とか言っちゃってるので、今回はそのやり方を紹介します!
まぁ、「別の機会」がまさか1年後とは私も思ってなかったんだけどな!
デバイス名を変更すると何が嬉しいの?
まず、自分が思い出すなどの理由もあって、RP2040+Arduino+TinyUSBでMIDIデバイスを作った時のデバイス名などがどうなってるのか?を見てみましょう。
スポンジに引き続き、今回も Seeed XIAO RP2040 を利用しますが、他のRP2040ボードでも名前は変わるけど事情は同じなので、これで行きます。
Arduino の Examples > Adafruit TinyUSB Library > MIDI > midi_test をボードに書き込みます。
この後、OSによって確認方法は違うのですが、私はmacを使ってるので、その方法で。
USBポートに midi_test が書き込まれた XIAO RP2040を接続後、アプリケーション > ユーティリティ > Audio MIDI設定 を起動後、ウインドウ > MIDIスタジオを表示 を選択します。
ここで接続されているMIDI装置(レガシーMIDIではなく USB-MIDIや内蔵仮想MIDI、BLE-MIDIなど)の一覧が表示されます。
「XIAO RP2040」という装置が表示されていますね。
さて、ここであなたがXIAO RP2040を使った何か?を1つしか作らない!ということなら、実はこれでも問題は起こりません。
ただ、2つ以上の何か?を作ろうとすると、どうなるでしょう。
試しに、midi_test を書き込んだ XIAO RP2040をもう一つUSBポートに接続してみます。
どうですか?
2つ「XIAO RP2040」というものが並びました。
これ、今回書き込んだのが、両方 midi_test だったので、この時点で何か問題が起こるわけではありません。
しかし!!
例えば、下記のような場合はどうでしょうか?
- XIAO RP2040 1台で MIDIコントローラーを作りたい。
- 別の XIAO RP2040 1台で MIDI音源を作りたい。
それぞれの装置に対して別の制御を行いたくなるはずです。
上記ケースで、デバイス名をそれぞれ下記のように変更すればどうでしょうか?
- XIAO RP2040 1台目のデバイス名 = "XIAO CONTROLLER"
- XIAO RP2040 2台目のデバイス名 = "XIAO SOUNDER"
このようにデバイス名の変更ができれば、それぞれのデバイス名に応じたドライバーを書くこともできるようになります。
USBデバイスを識別する別の方法として、VID/PID で識別する方法もあります。
これを変更することも可能ですが、USBのVID/PIDを取得するのは非常に大変です。真っ当な方法でやろうとするとめちゃくちゃお金もかかります。DIYレベルで簡単に取得できるものではない(PIDのみであればグレーなPIDを無料で取得する方法はありますが、いずれにせよ申請など手続きが必要です)ので、今回は素直に Seeed さんなどのボードメーカーや Raspi財団が提供している VID/PIDはそのままに、デバイス名だけ変更してそこをみて制御するようなドライバーを設計する方向で対応しましょう。
デバイス名書き換えの方法さえ覚えてしまえば、複数の訳のわからない自作コントローラーやら音源やらをいくらでも繋ぎ放題です!
ヒャッハー!
デバイス名書き換えの方法
それでは本題です。
先ほどの midi_test に名前を書き換えるコードを追加してみましょう。
void setup() {
// Manual begin() is required on core without built-in support e.g. mbed rp2040
if (!TinyUSBDevice.isInitialized()) {
TinyUSBDevice.begin(0);
}
Serial.begin(115200);
void setup() {
// Manual begin() is required on core without built-in support e.g. mbed rp2040
if (!TinyUSBDevice.isInitialized()) {
TinyUSBDevice.begin(0);
}
USBDevice.setProductDescriptor((const char *)"XIAO CONTROLLER");
Serial.begin(115200);
こちらを書き込んでから、再度USBポートに接続してからMIDIスタジオを見てください。
。。。?あれ?変わってませんね?
これは、MIDIスタジオが同じデバイス(おそらくシリアルNo.で識別している)のデバイス名をキャッシュしているために起こる現象です。
一度、USBポートの接続を切ったあとに、MIDIスタジオ上で対象の装置を削除して、再度接続してみてください。
今度は、書き換えた XIAO CONTROLLER が表示されるはずです。
ようするに、
USBDevice.setProductDescriptor((const char *)"好きな名前");
を追加するだけ!
同じデバイスを複数繋いだ時にそれぞれに違う処理をさせたい時はどうするの?
RP2040で違うデバイスを作る時に名前を書き換える方法については紹介しました。
しかし、自作楽器で遊ぶ方はこれでもすぐに問題にぶつかるはずです。
同じ音源を複数繋いで違うパラメータで音ならしたいんだよ!
はい。よくあることです。
機種(機能)としては同じコントローラーなんだけど2つ繋いでそれぞれのパッドの割り当て変えたい
これもありそうですね。
つまり、デバイス名が変わるだけではダメなんです。
答え。UIDを使う
RP2040は実はマイコンのUIDというものは持ってないのですが、RP2040自体がマイコンの内部にストレージを持ってないので、必ずROMとセットで利用することになります。このFlashROMの製造番号をUIDの代わりに利用することができます。
たまーにROMの製造番号がちゃんと書き込まれてないボードに遭遇するのは内緒
flash_get_unique_id()
という関数を使えば、UIDを取得できます。
スケッチの先頭あたりで、
extern "C" void flash_get_unique_id(uint8_t *p);
と宣言しておけば、好きなタイミングでUIDが読み出せるようになります。
使い方はこんな感じ。
uint8_t uuid[11];
flash_get_unique_id(uuid);
これで、uuid の中にUIDが入りましたので、先ほどの setProductDescriptor() に渡す文字列の後ろに追加などすればOKです。
やり方は、ちょっと面倒なので、ここでは書きませんが、実装例へのリンクを貼っておきます。
ここ の makePrdDescStr() あたりを見ていただけたらです。
まとめ
RP2040で作るMIDIデバイス名の書き換えについて紹介しました。
これで、下記のような判定が行えるようになります。
- デバイスの種類はデバイス名の前半でわかるようになる
- デバイス固有の情報もデバイス名の後ろにUIDが付加されるので、UIDごとに異なる設定を送り込む、などの実装も可能に。
みんな、おもしろおかしい楽器をDIYしまくろーぜ!!!


