アールテクニカ地下ガレージ

アールテクニカ株式会社の製品開発・研究開発・日々の活動です

Raspberry Pi Zero をMIDI音源ボックス化

 Author

コイデマサヒロ

Raspberry Pi Zero(RPi Zero)には、USBクライアント機器として動作できるUSB OTG(On The Go)機能があります。これは、ZeroとPCをUSB接続するとPCからZeroが特定の機能を持ったハードウェアとして利用できるということです。今回は、OTGのMIDI機能をためしてみます。さらにソフトシンセソフトを自動実行するように設定し、Raspberry Pi Zeroをパソコンに繋げばMIDI音源として使えるようにします。

RPi ZeroのOTG機能

MIDIだけではなく、Audio、ストレージ、USB HID(キーボードとかマウスとか)、ネットワーク等の機能が使えます。基本的には、どれか1つ(場合によっては2つ)の機能が使えるだけです。PC等のUSBホスト側からはRPi ZeroがMIDI機器として見えますが、RPi Zero側は設定したOTG機能の機能が使える他は通常の動作と変わりありません。例えばMIDIの場合は、PRi Zero内ではPC側がMIDIポートとして見えるだけです。たとえば高機能なMIDIコントローラを作っても面白いかもしれません。RPi Zeroにいろいろなセンサーを繋げてMIDI化するのも面白そうです。 なお、OTGモード時のUSB接続のケーブルは普通のケーブルで構いません。

RPi ZeroのOTG機能の弱点/制限

OTG機能は、通常のUSBホストとして利用しているポートを使います。ホスト機能とクライアント機能の両方同時に使えるというわけではないので、OTGモードで動作している場合はRPi Zeroにマウスやキーボードが接続できませんので注意が必要です。USBクライアント機器としてRPi Zeroを動作させているときに、何か問題があったり設定を変更したいといったことがあってもできないのです。PRi Zero Wやネットワークカードを指したRPi Zeroであればネットワーク経由でZeroの中にsshで入ることができます。OTGモードでもHDMI出力はできますのでタッチパネル付きのディスプレイを使うのもよいかもしれません。
本記事では、OTG動作時でもネットワークが接続でき、sshでRPi Zeroに入れるという前提で進めます。

今回試すこと

  • PRi ZeroをOTGのMIDIモードで動作させる。
  • RPi ZeroをMIDI 音源として動作させPCからMIDIを送ってRPi Zeroから音が出るようにします。
    具体的には、
    ・Fluidsynth(Soundfont対応MIDI音源)を自動起動。
    ・RPi Zero内ではPCがMIDIポートして見えるので、Fluidsysnthと自動接続。
    といった設定を行います

OTGを設定する

通常の起動の仕方でRPiを立ち上げ、ターミナルで設定作業を行います。

起動設定のファイルを編集します。

$ sudo nano /boot/config.txt

最後の方に、​dtoverlay=dwc2を追加します。

$ sudo nano /boot/cmdline.txt

一行目の最後のあたりのrootwaitという記述があるのでそれ以降に ​modules-load=dwc2,g_midi という記述を追加します。
これで再起動してUSBポート(電源では無い方)でPCと接続すればPC側からはMIDIポートといて見えるはずです。 この設定を行ってもノーマルの(OTGではない)方法で起動すればUSBキーボードなどを接続して通常通り起動するはずです。

OTGモードで動作しているかの確認

OTGモード時は、​mac/WindowsからはMIDI GadgetというMIDIポートとしてRPi Zerogが見えるようになります。RPi側ではf_midiというポートでPC側が見えます。

f:id:atkoide:20170425142013p:plain (macOS上から見たRaspberry Pi Zero)

RPi Zero側のターミナルで

$ amidi --dump

とし、PC側からMIDIを送ってやるとターミナルにMIDI情報がダンプされます。 もしamidiが動かない場合は、

$ sudo apt-get install alsa-utils

でインストールできます。 ただしくMIDIがダンプできれば設定は正常に行われているはずです。

FruidSynth等の自動起動設定

RPi Zeroを起動したときに自動的にFruidSynthを起動しf_midiポート(PCを表すぽーと)と接続するようにします。
こうすれば、RPi Zeroを接続するだけでMIDI音源として利用できます。 FruidSynthをサービスとして起動するように設定します。

FruidSynthはサウンドフォントを音源とするソフトシンセです。サンプラーと言って良いでしょう。ロードするサウンドフォントは任意のものが利用できます。まずこのFruidSynthをインストールします。デフォルトでGMのサウンドフォントも一緒にインストールされます。

$ sudo apt-get install fruidsynth

エディタを起動し、自動起動のための設定ファイルを作成します。

$ sudo nano /etc/systemd/system/fluidsynth.service

以下の内容をコピーしてください。

[Unit]
Description=FluidSynth Daemon
After=sound.target

[Service]
ExecStart=/usr/bin/fluidsynth -is -a alsa -m alsa_seq /usr/share/sounds/sf2/FluidR3_GM.sf2
EnvironmentFile=/etc/conf.d/fluidsynth

[Install]
WantedBy=multi-user.target

自動的にデフォルトのAlsaデバイスを再生デバイスとし、さらにFruidSyntと一緒にインストールされたサウンドフォントをロードするようにします。このfluidsynth.serviceというファイルが起動時に読み込まれてExecStartのコマンドが実行されます。

設定ファイルを保存したら

$ sudo systemctl start fluidsynth 

とするとFruidSynthが起動するはずですので、

$ aplaymidi -l

とすると、正しく設定できていれば、

 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 16:0    f_midi                           f_midi
128:0    FLUID Synth (1048)               Synth input port (1048:0)

とMIDIポート一覧が表示されるはずです。FruidSynthの起動には少し時間がかかりかすので、すぐに表示されなければ何度か試してみてください。f_midiはOTGモード時のMIDIポートですが、通常起動時でも利用はポートは利用できないもののリストアップはされるようになります。

sudo systemctl stop fluidsynth

でFruidSynthは終了できます。

次に、FruidSynthとf_midiポートを接続する設定を行います。新たな設定ファイルを作成します。

$ sudo nano /etc/systemd/system/midiconnect.service

エディタが起動するので以下の内容をコピーします。

[Unit]
Description=Midi Connection
After=fluidsynth.service

[Service]
ExecStart=/home/pi/midiconnect.sh
Type = simple

[Install]
WantedBy=multi-user.target

これはfruidsynth.serviceが実行された後に、/home/pi/midiconnect.sh を実行するという設定です。 FruidSynthとf_midiポートの接続は、/home/pi/に置かれたmidiconnect.shに書きます。 このmidiconnect.shを作成します。

$ sudo nano /home/pi/midiconnect.sh

としてエディタを開き、

#!/bin/bash
sleep 30
aconnect 20:0 128:0

このスクリプトが実行されると30秒まってから、aconnect 20:0 128:0でFruidSynthとf_midiをMIDI接続します。30秒のウェイトを入れるのは、FruidSynthが起動し終わらないとMIDI接続できないので、余裕を持たせています。いろいろ試したところOS起動にあわせてFruidSynthも起動するため時間がかかるようです。Raspbianをヘッドレス設定(Xwindowを起動しない)しておけばもう少し短い時間にできると思います。

MIDIポートの指定について

MIDIのポート番号は環境によって変わってきます。僕の環境では、FruidSynthが128:0 でf_midiは20:0でした。 これは一度OTGモードで起動して確認するのが確実ですが、他にMIDIソフトやデバイスを自動起動させないのであれば、OTGモードで起動してもおそらく同じポート番号のはずです。MIDI機器を接続していない状態で、先程のように、

$ aplaymidi -l

としてポートを調べて、midiconnect.shにセットします。

設定補足

僕は、MM-5102を使った自作のI2Sのオーディオインタフェースをデフォルトデバイスとして設定しています。デバイスを利用しない場合はHDMI経由の出力となるはずですが試していませんので予めご了承ください。

全て設定が完了したらOTG接続をして再起動します。PC側からMIDIを送信して音が出れば問題なしです。もし音がでない場合は接続を確認しましょう。

さいごに

今回のポイントはOTG接続と自動起動についてです。どちらもいろいろな応用が考えられます。例えばMIDIインタフェースを接続して自動起動するようにしたら完全にスタンドアロンな音源ボックスとすることもできます。OTG接続はオーディオも可能なのでRaspberry Piの出力をパソコンでデジタル録音するという用途でも使えます。一番便利なのはよく紹介されていますが、パソコンとネットワーク接続する設定でしょう。これであればRaspberry Pi ZeroとPCだけで開発ができます。

 

Author

コイデマサヒロ

ディレクター、プロデューサー、ギタリスト。mimiCopyをはじめ弊社リリースの全てソフトウェア製品の企画を担当。ネイティブアプリ開発がメインでOS問わず対応可。dubバンドのギタリストとしても活動中。

スポンサーリンク