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。
はてなグループの終了日を2020年1月31日(金)に決定しました - はてなグループ日記 - 機能変更、お知らせなど
- iOS 4.2.1 + Camera Connection Kit + UM-1S は対応していない とメッセージが出た
ううう…
そんな 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 touch + MIDI Mobilizer →(5p DINケーブル)→ UM-1S → RasPi => ChucK → コンソールにMIDIメッセージをプリント
ができました。
簡単すぎる!