電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

Raspberry Pi (その3) ― USB-MIDI I/Fを使う

Raspberry Pi (その3) ― USB-MIDI I/Fを使う

3月にlumさんと共同購入した Raspberry Pi(以下 RasPi)をどう使うか悩んでいたが、仕事が忙しすぎる今日このごろ逆ギレ気味に RasPi を立ちあげて、とりあえず radiko の録音機に仕立てることに成功。引き続き ChucK のインストールに成功して音を出して遊べるに至った。そして思うわけである、やっぱり RasPi で MIDI 使いたいよね、と。

ChucK は MIDI や OSC もサポートしている。RasPi の OS であるところの Linux も、なによりも ChucK のインストールにあたって ALSA(Advanced Linux Sound Architecture)もビルドしてインストールしているのだから、きっとOSレベルでMIDIが使えるに違いない。

RasPi ではシリアルのI/Oがピンヘッダで出ている。

ただ、「Raspberry Piのシリアルポートはデフォルトではシリアルコンソール用として使用されている」とのこと(シリアルポート – Raspberry Life)。これを一般シリアルとして使えるようにするにはひと手間必要なようだ。

加えて RasPi では MIDI の31.25kbpsのビットレートを作るのにちょっとトリッキーなことをしないといけないらしい。

(大した手間じゃないけど)めんどくせー。31.25kbpsがぴったりボーレートで出ないらしいとなるとちょっと萎え…

だがちょっとまて。RasPi は USBホストなのだから、USB-MIDI インターフェースという手があるではないかと。

手元には RolandのUM-1S という 5p DIN MIDIが 1-in, 1-out の USB-MIDI インターフェースがあった。いつ買ったんだろう。2005年にはすでに持っていたようだ。うわー、8年前か。MIDI2CV0 の実験をしていたのね。

自ブログを漁っていて、UM-1Sにまつわる悲しいニュースも思い出した。

ようやく Camera Connection Kit を購入したので手持ちの機材を試してみた。使用したアプリは MIDI Monitor。

  • iOS 4.2.1 + Camera Connection Kit + UM-1S は対応していない とメッセージが出た
はてなグループの終了日を2020年1月31日(金)に決定しました - はてなグループ日記 - 機能変更、お知らせなど

ううう…

そんな UM-1S であるが、件の RasPi に繋いでみた。結果はイカに! あっさりOSが認識した。

↓繋ぐ前;USBハブも見えてるね。

pi@raspberrypi% lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB

↓繋いだ後;

pi@raspberrypi% lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 006: ID 0582:0009 Roland Corp. Edirol UM-1SX MIDI Adapter   ←コレ

↓ChucK からも見えた。

pi@raspberrypi% chuck --probe
[chuck]: found 1 device(s) ...
[chuck]: ------( audio device: 1 )---------------
[chuck]: device name = "hw:bcm2835 ALSA,0"
[chuck]: probe [success] ...
[chuck]: # output channels = 2
[chuck]: # input channels  = 0
[chuck]: # duplex Channels = 0
[chuck]: default output = NO
[chuck]: default input = NO
[chuck]: natively supported data formats:
[chuck]:   16-bit int
[chuck]: supported sample rates:
[chuck]:   8000 Hz
[chuck]:   9600 Hz
[chuck]:   11025 Hz
[chuck]:   16000 Hz
[chuck]:   22050 Hz
[chuck]:   32000 Hz
[chuck]:   44100 Hz
[chuck]:   48000 Hz
[chuck]:
[chuck]:
[chuck]: ------( chuck -- 2 MIDI inputs )------
[chuck]:     [0] : "Midi Through Port-0"
[chuck]:     [1] : "UM-1 MIDI 1"                ←コレ
[chuck]:
[chuck]: ------( chuck -- 2 MIDI outputs )-----
[chuck]:     [0] : "Midi Through Port-0"
[chuck]:     [1] : "UM-1 MIDI 1"                ←コレ
[chuck]:

バイス番号[1]番として ChucK は認識しているようだ。

さくっとこの[1]番デバイスをオープン。テストプログラム↓ を走らせてみた。

pi@raspberrypi% cat chuck/gomidi.ck
// number of the device to open (see: chuck --probe)
1 => int device;
// get command line
if( me.args() ) me.arg(0) => Std.atoi => device;

// the midi event
MidiIn min;
// the message for retrieving data
MidiMsg msg;

// open the device
if( !min.open( device ) ) me.exit();

// print out device that was opened
<<< "MIDI device:", min.num(), " -> ", min.name() >>>;

// infinite time-loop
while( true )
{
    // wait on the event 'min'
    min => now;

    // get the message(s)
    while( min.recv(msg) )
    {
        // print out midi message
        <<< msg.data1, msg.data2, msg.data3 >>>;
    }
}

MIDI IN が来たらメッセージを受信してコンソールにプリントするプログラム。

iPod touchMIDI Mobilizer →(5p DINケーブル)→ UM-1S → RasPi => ChucK → コンソールにMIDIメッセージをプリント

ができました。

簡単すぎる!

これなら USBしかない楽器インターフェース (KorgとかKorgとかKorgとか)を繋いでも行けるんじゃね?