藤本健のDigital Audio Laboratory
第956回
MIDIで動くぞ! 「Arduino Uno」でシンセサイザ自作した。後編
2022年9月26日 09:11
前編では、Arduino Uno(の互換機)を購入し、音を鳴らしたり、簡単な演奏を行なってみたりしたが、後編は、Maker Fair Tokyo 2022でデモ演奏していたISGK Instrumentsのシンセサイザ再現を目指す。
「すべてオープンソースとして公開されているので、誰でもできる」と聞いていたが、本当に音が鳴らせるのか、MIDIでコントロールしたり、DAWから演奏させることが可能なのか、実際に試してみた。
Arduino Unoに「VRA8-U」プログラムを転送する
今さらながらArduinoの面白さ、スゴさを知って感激したわけだが、“Lチカ”したり、小さなブザーで“ビービー音”を鳴らしたりと、喜んでいても仕方がない。あくまでもArduinoをどうやって使うかのお試しであり、本番はここからなのだ。
ISGK Instrumentsの石垣良氏がWebで公開している情報を元に、Arduino Unoに接続するステレオのオーディオ出力回路をブレッドボード上に組んで音が出ることまでは前回確認できた。また想像以上に高音質に音を鳴らせることも分かった。ハード的な準備はすでに完了している。あとは、石垣氏が公開しているDigitalSynth VRA8-UのプログラムをArduino Uno上で走らせればいいだけだ。
まずは「DigitalSynth VRA8-U」のサイトでリンクされているGitHubへ行き、そこにあるSource CodeというZIPファイルをダウンロードする。
これを展開すると、フォルダ内に「DigitalSynthVRA8U.ino」というファイルが入っている。これがArduinoの開発環境ソフトであるArduino IDE用のスケッチ、つまりプログラムとなっているようだ。
Arduino IDEのアイコンをダブルクリックすると、Arduino IDEが起動するとともに、VRA8-Uのスケッチが読み込まれた。
ここでArudino UNOとPCがUSB接続されていることを確認した上で、矢印アイコンをクリックするとコンパイルが実行され、USBでプログラムがArduino UNOに転送される。
この間、3秒程度。Aruduino UNOの画面下には「スケッチが使用できるメモリが少なくなっています。動作が不安定になる可能性があります。」とのメッセージが表示されたが、問題なく転送されている模様。先日、石垣氏もArduino UNOの限界に挑戦している…という旨のことを話していたので、まさにギリギリまでのプログラムを詰め込んでいるからこそ、こうしたメッセージが出るのだろう。
ちなみに本体プログラムは「DigitalSYnthVRA8U」となっているが、その右側には数多くのタブがある。ちょっと覗いてみるとamp.h、audio-out.h、common.h……とたくさんのヘッダープログラムがあり、これすべてでシンセサイザを構成しているようだ。
それぞれをざっと見る限り、それほど長いプログラムではないので、これを解読しつつ活用することで自分だけのオリジナルのシンセサイザを開発できるかも……とワクワクしてくる。が、ここでは、まずホントに音が鳴るのかを試すことが最優先。
“橋渡しツール”でMIDIキーボードから音を出す
このプログラムを転送できた時点で、すでにArduino UNOはシンセサイザになっているはずだが、さすがにこれだけだと、まだ音を鳴らすことができない。MIDIキーボードを演奏して鳴らしたいところだが、そうするためにはいくつかの準備が必要となる。
今回はIK Multimedia「iRig Keys 2 mini」を使って演奏しようと思っているが、これはPCと接続する機材。つまり、PCからMIDI信号をArudino UNOに送らなければならない。
そこで必要になるのが「The Hairless MIDI to Serial Bridge」なるソフトのインストール。
昨今のデジタル楽器でUSB端子を持っているものはPCと接続すれば、自動的にMIDIデバイスとして認識されるようになっているが、Arduino UNOはシンセサイザのプログラムを動かしているとはいえ、MIDIデバイスとして認識されるわけではない。
そこで、PCからArduino UNOへMIDI信号を送るためのツールがこのソフトというわけ。もう少しいうと、USBを通じてシリアル信号をArduino UNOへ流す仕組みを利用し、MIDIドライバからのMIDI信号を流すのだ。
といっても、実際にはシンプルなソフトなのでインストール作業は不要で、単に起動するだけ。左側で、Arduino Unoが接続されているポートを選び、右のMIDI INにiRig Keys 2 miniを設定すればOK。
すると、The Hairless MIDI to Serial Bridgeの画面上にはMIDIの信号が表示されると同時に、一発でシンセサウンドが鳴った!
しかもエッジの効いたリードシンセの音で5度差の音が重ねられたモノフォニックサウンド。音は非常にクリアで、自作シンセなどにありがちなハムノイズもまったくなし。細いケーブルで繋いでブレッドボードに組み上げた回路から出てくる音とは思えない、図太いサウンドが出てきて驚くと同時に感激!
1,500円のArduino Uno互換機と500円程度で作った出力回路の計2,000円でこれだけのシンセサイザができるなんて、スゴすぎる!
しかし。この前のMaker Faire Tokyo 2022で見たデモは、単にこのサウンドが鳴らせるというものではなかった。音色プリセットもいくつか用意されていたし、MIDIコントローラーのノブを動かすとフィルタのカットオフやレゾナンスがコントロールできていたので、それも試してみたい。
そういえば、シンセサイザのパラメータをブラウザを介して動かしていたような……と思い、先ほどダウンロードしたZIPファイルの中身を見てみると、VRA8U CTRLなる画面が立ち上がった。
ここでMIDI入力とMIDI出力を設定すれば、DAWなど必要とせずに演奏できるようだが、Windowsの場合、ソフトからソフトへのMIDIの橋渡しができない。つまり、このVRA8U CTRLとThe Hairless MIDI to Serial BridgeのMIDI接続ができないため、その橋渡しをするためのツールが必要になるのだ。
橋渡しのツールはいくつか存在しているが、定番となっているのが「loopMIDI」というフリーウェア。これを間に介すことで、この画面でパラメータを動かしてArduino Unoをコントロールできるようになった。
仕様書を確認したところ、VRA8U CTRLを使わなくても、各パラメーターはMIDIコントロールチェンジに割り振られているので、iRig Keys 2 miniのノブやボタンから動かすことができるようだ。そこでちょっとキーボードを弾いて鳴らしてみたのが以下の動画だ。
PCレスで、Arduinoだけでシンセサイザを実現する
ソフトシンセでも動画のようなサウンドは出せるので、正直珍しくはないのだけれど、この小さなコンピュータ・Arduinoでここまでできるというのがスゴイし面白い。
そして、せっかくならPCの力に頼らない演奏をしてみたい。やはりUSBでPCと繋がっていると、せっかくArduinoで動かしているありがたみが半減してしまうように感じるからだ。
実は、この事についてもMaker Faire会場で石垣氏から話を聞いていた。すると、Arduino用にいろいろ出ている“MIDIシールド”なるものを用意すれば、PCとの接続不要でDigitalSynth VRA8-Uを鳴らすことができる、とのことだった。
この“MIDIシールド”なるものを少し調べてみたところ、3,000円~5,000円程度で販売されている様子。しかし、単なる端子なのにArduino本体より高いのはちょっと納得いかない。
そこでAliExpressで検索すると、500円のMIDIシールドを発見。送料は200円、到着まで1週間とあったがえいやと購入。しかし、予定日を過ぎても一向に届かない。念のため配送のステータスを確認してみたら、いつのまにか到着まで1カ月と記載されていた……。
1カ月も待っていたら、記事に間に合わない。改めてAmazonを探すと、1,610円のものを発見。“星印1”が気になったが、なんとかなるだろうと注文することに。
もう1つ。USB接続せずにArduino Unoを動かすためにはACアダプタが必要になる。これについては、秋葉原で400円で購入。ついでに前回ブレッドボードで組み上げたアナログ出力回路をもう少し丈夫なモノにするための部品も購入した。
50円で売っていた3cm×3cmのユニバーサル基板とそれの脚としてつけるスペーサーとナットがそれぞれ120円。さらに前回回路を組んだ時にフィルムコンデンサを使っていてちょっと不格好なので10本100円で売っていた小さなセラミックコンデンサを購入した。
MIDIテストの前に作ったのが、ユニバーサル基板を使ったアナログ出力回路。モノ自体はブレッドボードで組んだものと同じだが、はんだ付けしたので安定したし、とくにステレオミニジャックが基板から外れなくなったので使いやすくなった。
では、肝心のMIDIシールドについて。あまり詳しくも調べずに購入し、前述のAmazon購入品が届いたのだが、開封してチェックしてみたところ大ショック。脚が思い切り曲がっていた。
シールドはArduinoの基板上に合体できるものと思っていたが、この状態だと接続するのは不可能。かといって、返品するのも時間がかかるため、ラジオペンチを使ってなんとか垂直にしてみたが……やはりどうも“ガタピシ”している。
試しに、Arduino Unoの上に取り付けようとも思ったが、刺さらないどころか、そもそもピン数が合わない。Arduino UNO R3用と書かれていたのに、ちょっとダマされたように思う。が、もし、うまく刺さったとしても、問題があった。そう、MIDIシールドの上にコネクタが取り付けられていないため、先ほど作った回路などへの接続ができなくなってしまう。
Amazonから送られてきたのは基板だけでマニュアルもないので、どうしよう……と思いながら、改めてAmazonのページを見たところ接続図のようなものが掲載されていた。
これによれば、なるほど電源とRX端子同士、TX端子同士を接続すればいいらしい。これを見ても、やはりArduino Uno用のMIDIシールドではなさそうに思う。さらに、ここで発見してしまったのは、掲載されている製品写真のピンも曲がっていること(苦笑)。そもそもかなりいい加減な製品のようだ。
こうなったら仕方がない。ルーペを使って基板上の記載をチェックしてみたところ、RX端子、TX端子、そして5Vとグランドがどこにあるか見つけることができた。
外部接続用と思われる穴が基板上にいっぱい並んでいるので、ここにRXやTXが来ているのでは……とテスターを使って探してみたが、ここにはない。
5Vとグランドは見つけられたので、ここにジャンパー線をはんだ付け。さらに、RXとTXは直接ここにジャンパー線をはんだ付けしてみた。これでホントに動くのかわからないけれど、これら4つのジャンパー線をArduino Unoの端子上に接続。これでハード的には完成なはずだ。
もう一つ必要な設定がある。Digital Synth VRA8-Uのサイトには「オプション:MIDIシールドを使用する場合」との記載があり……
「スケッチ "DigitalSynthVRA8U.ino" で #define SERIAL_SPEED (38400) でなく #define SERIAL_SPEED (31250) を有効にすると、MIDIシールド(またはMIDIブレイクアウトボード)を使用可能になります」
……と書かれていた。
これを見て、ものすごく懐かしい記憶がフラッシュバックしてきた。その昔、NECのPC-9801のシリアルポートでは、MIDIの通信規格と同様の31.25kbpsでの通信が可能だったが、DOS/Vパソコンを接続する場合には“38.4kbpsに設定”していたのだ。
いまのWindowsマシンはDOS/Vパソコンの後継だから、こうなっていたのだろう。ただし、USB経由ではなく、直接MIDIシールドでのやり取りをする場合には、31.25kbpsで通信をする必要があるということのようだ。
スケッチを見てみると……なるほど、冒頭にその記載がある。デフォルトでは……
//#define SERIAL_SPEED (31250)
……とコメントアウトされているので、頭の//を削除。代わりに……
#define SERIAL_SPEED (38400)
……の頭に//をコメントアウトした上で、再度コンパイルして転送してみた。
結果、こちらもあっさりと動作。プログラム転送後はUSBケーブルを取り外し、ACアダプタで使ってみたところ、問題なく動いてくれる。もちろん、ユニバーサル基板上で組んだアナログ回路のほうもしっかり動作しているので、これでMIDIで動く本格的シンセサイザの完成である。
できればこれをちゃんとシャーシに組み込んで小さな音源モジュールにしたいところだが、今回はとりあえずここまで。
現時点では、Digital Synth VRA8-Uのプログラムの中身をまったく見ていないので、本当にプログラムを利用させてもらっているだけだが、いつかこれを少し解読した上で、少し変更を加えたり、これをライブラリとして活用させてもらいながら自分のシンセを作れたら、と思っているところだ。