Raspberry Pi zero WをパソコンにつなぐだけでMIDIを出力できるデバイスにする方法を紹介します。センサをつないで、それに応じて音を出力できたらオリジナルの電子楽器のでき上がりですね。

ここではセットアップの手順を簡潔にまとめていますので、もし詳しい解説が必要であれば、参考にさせて頂きましたアークテクニカ様のサイトをご覧ください。

環境

  • PC・・・Windows10 home
  • ソフトシンセ・・・synister(フリー)(Win10にインストールして使用)
  • 開発言語・・・Python

OTGの設定

OTG(On The Go)とは、デバイスがPCやシンセサイザなどに接続するだけでUSBクライアントになれる機能のことです。Raspberry Pi zero Wには標準でこの機能が搭載されており、設定ファイルをちょちょっと書き換えるだけでこの機能を実現することができます。下記の設定をしたラズパイzeroをUSBでパソコンに接続すると、PCからはUSBデバイスとして認識されます。

なお、ここでいうUSB接続とは、PSのUSBポート(一般的にはtype-A)とラズパイzeroのUSB(micro-B)をケーブルで直結した状態を指します。この手のケーブルは一般的

起動設定のファイルを編集

$ sudo nano /boot/config.txt

ファイル末尾にdtoverlay=dwc2を追記する。

$ sudo nano /boot/cmdline.txt

ファイル末尾にmodules-load=dwc2,g_midiを追記する。

rebootしてPCとUSB接続すればMIDIデバイスとして見えるはずです。

rtmidiをインストールする

rimidiはC++で作成されたMIDIライブラリです。しかし、ラズパイではpythonで開発できたほうが何かと都合がよかったりします。そこで、pythonでrimidiを使えるようにラップしたものがPython-rtmidiです。rimidiとPython-rtmidiは別のパッケージですので、それぞれダウンロードしてインストールする必要があります。

rtmidiのインストール

gitからダウンロードします。

sudo apt-get install libasound2-dev git build-essential python-dev libpython2.7-dev libpython3.4-dev libjack-jackd2-dev cython

ダウンロードしたライブラリは圧縮されていますので、解凍してビルド、インストールします。

$ wget <a href="http://www.music.mcgill.ca/~gary/rtmidi/release/rtmidi-2.1.1.tar.gz" target="_blank" rel="noreferrer noopener">http://www.music.mcgill.ca/~gary/rtmidi/release/rtmidi-2.1.1.tar.gz</a>
$ tar zxvf rtmidi-2.1.1.tar.gz
$ cd rtmidi-2.1.1
$ ./configure
$ make -j2
$ sudo make install
$ cd ..

Python-rtmidiのインストール

こちらもgitから落としてきます。

$ git clone —recursive —depth 1 <a href="https://github.com/SpotlightKid/python-rtmidi.git" target="_blank" rel="noreferrer noopener">https://github.com/SpotlightKid/python-rtmidi.git</a>
$ cd python-rtmidi
$sudo python setup.py install

これでrimidiがpythonから使えるようになりました。念のためrebootします。

$sudo reboot

動作テスト

ソフトシンセの設定

ソフトシンセは無料のsynisterを使います。ダウンロードリンクはこちらです。synisterは有料のソフトシンセ並みの機能を兼ね備ています。まぁ、midi入力しか使わないんですけどね・・・

左上のoptionをクリックすると設定画面が表示されます。Active MIDI inputの欄に「MIDI function」とあるので、クリックして白くしましょう。Outputの欄は、PCが搭載しているサウンドカードによって異なります。

ちなみに、画像ではAudio device typeを「Direct Sound」にしていますが、もう一つの選択肢の「Windows Audio」と比較してやや遅延気味でした。環境依存もあるかもしれませんので、両方試してみてください。

サンプルコード

下記のコードはrtmidi-python作者のgitにあるexampleフォルダを参考にし、必要な部分だけ抜き出したものです。3C(中央どドの音)を一定時間出力して消音するプログラムになります。

from __future__ import print_function

import logging
import sys
import time

from rtmidi.midiutil import open_midioutput
from rtmidi.midiconstants import NOTE_OFF, NOTE_ON

port = 1 #[1] f_midi:f_midi 16:0

midiout, port_name = open_midioutput(port)

note_on = [NOTE_ON, 60, 112]  # channel 1, middle C, velocity 112
note_off = [NOTE_OFF, 60, 0]

with midiout:
    print("Sending NoteOn event.")
    midiout.send_message(note_on)
    time.sleep(1)
    print("Sending NoteOff event.")
    midiout.send_message(note_off)
    time.sleep(0.1)

del midiout
print("Exit.")

保存して実行します。

$ sudo python midiout.py

無事、PCのスピーカから音が出力されたら成功です。

参考サイト