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のスピーカから音が出力されたら成功です。