Home -> Blog -> ESPr DeveloperでつくるワイヤレスMIDIコントローラ ~製作・実演編~

2016/12/17
ESPr DeveloperでつくるワイヤレスMIDIコントローラ ~製作・実演編~



この記事は、DTM Advent Calender 2016 17日目の記事です。
ソースコードの記述等、実装に関してはQiitaの当該記事を御覧ください。

なにこれ?

MQTTを用いたワイヤレス型のMIDIコントローラー(もどき)です。
※このデバイス自体はMIDIを送信してないので、厳密に言えばMIDIコントローラーではありません…

ボタンを押すとMIDIのノートオン、離すとノートオフを送信できます。
たとえば、それぞれのボタンをドラムのキックやスネアに割り当てたり、再生/停止といったトランスポート機能をもたせることが出来ます。

何よりも”ワイヤレス”なのです。ただでさえUSBケーブルで溢れている机に対して、更なる悩みの種を持ち込む心配がありませんよ!

作ろうと思ったきっかけ

私の使っているMIDIキーボードKX25は付属機能が豊富で、中でも「トランスポート機能」は使用頻度がとても高いです。
※トランスポート機能:DAWの再生/停止、録音、巻き戻し/早送りを行う機能

MIDIキーボードでリアルタイム録音を行うとなると、手元にそういったボタンがあったほうが遥かに効率がいいのです。

ところがこのKXシリーズは生産終了となってしまい、ヤマハさんからは今のところ後継種は出ていないようです。
ヤマハ以外にも国産・海外製の様々なMIDIキーボードがありますが、このトランスポート機能を備えたキーボードというのは中々出会うことが出来ません。

他製品への乗り換えを検討するものの、トランスポート機能の不足のために踏ん切りがつかない…
MIDIコントローラー(例:http://www.mi7.co.jp/products/presonus/faderport/)を買うという手段もあるものの、これ以上デスクにUSBの配線を増やしたくない…

かくして私はMIDIキーボード難民となってしまったのです…。

そこで考えたのが
「トランスポート機能とワイヤレスに対応したMIDIコントローラがないのなら、自分で作ればいいじゃないか!」

ということで、格安マイコン「ESPr Developer」とイマドキのIoT技術を組み合わせた、ワイヤレスのMIDIコントローラ(もどき)を作成することにしました。

概要

大きな要素は以下の3つです。

  1. ハードウェアデバイス
    • ボタンの状態(オン/オフ)をVPSに送信
    • MQTTのPublish機能を使用
    • ボタンを押したタイミングで、対応したボタンのトピック(/dc01/*)にメッセージ(0 or 1)を送信
  2. VPS
    • MQTTサーバ(Mosquitto)、ログ収集サーバ(fluentd)として動作
    • 将来的にはトピックデータをfluentdで収集して、DTM活動のライフログアプリなんかを作れればいいなぁと模索中
  3. クライアントPC
    • 受け取ったMQTTデータをMIDIに変換し、Cubaseをコントロール
    • MQTTトピックをMIDIに変換するC#プログラムと、仮想MIDIインターフェイス「loopMidi」を組み合わせています
    • Cubaseのプロファイル設定で、MIDIノートをトランスポート機能に割り振っています

なぜMQTTを使うのか

ぶっちゃけ、Arduino Unoなんかを使えば、Arduino自体をMIDIデバイスと認識させることで直接繋いでMIDIを送信することが出来ます。
では何故、このような回りくどい方法を採っているのか?以下の図で説明します。

上の図は、従来の手法である1対1型通信によるデータのやり取りを表しています。
シンプルで分かりやすいシステムですね。

ある日、あなたは既存のシステムに対して「ログを取ってグラフ化する」という機能を付け加えたいと考え始めました。
どう対処すべきでしょうか。

対処方法は幾つかあると思いますが、大きく分けて「送信元であるESPr Developer側で対処する方法」と「MIDIコンバータ側で対処する方法」のどちらかになるでしょう。
ここでは既存のプログラム(スケッチ)では対応できないため、新たにプログラムを用意しなくてはなりません。

一方、最初に振り戻って今度はMQTTを使った多対多型通信の例を見てみます。
先ほどと異なり、MQTTブローカーが間に挟まった形となりましたね。

さて、再びこの問題を解決するにはどうすべきでしょうか?
どちらかのプログラムを書き直さなければならないのでしょうか?

答えはノーです。MQTTは非同期・多方面通信という特徴があるため、ただ単に2人がやり取りしていたデータをそのまま横流し(サブスクライブ)してやればいいのです。

このように、MQTTは既存の資源を”組み合わせた”システムを構築していくという用途にはうってつけなのです。
こんな訳で、とりわけ昨今のIoT界隈では多くのデバイスと通信する必要があるため、MQTTが広く使われるようになったのですね。

以上、小話でした。

作り方

材料

カテゴリ 名称 価格 購入場所
マイコン ESPr Developer ¥2,160 スイッチサイエンス
ボタン 押しボタン(三和電子製) ¥180 * 5個 マルツオンライン
ケース SS型プラスチックケース ¥490 マルツオンライン
抵抗 カーボン抵抗 10kΩ ¥270 マルツオンライン
抵抗 カーボン抵抗 270Ω ¥270 マルツオンライン
LED ¥30 マルツオンライン

材料はすべて、通販で揃えることが出来ます。
以下の機材が既に手元にあれば、だいたい4千円くらいで作れてしまいます。素晴らしい!

必要な機材:

1. ケースを加工する

まずは、ケースに穴を開けていきます。
ボタンスイッチとケースのデータシートを参考に、穴を開ける箇所にマークを付けていきます。

キリ→ミニビット→テーパリーマの順に、穴を広げていきます。

2. ボタンをはんだ付けする

ボタン端子にジャンパワイヤを取り付けます。
ケースの高さに制限があるため、足は折り曲げています。

3. 配線・接続テスト

一旦ブレッドボードに取り付け、配線と接続のチェックを行います。

スケッチをESPr Developerに書き込み、VPSとクライアントPCの設定をします。
実際にCubaseを操作できるかどうか、ここでチェックします。

チェックの手順は、以下のとおりです。

  1. VPSでMosquittoを起動
  2. ESPr Developerに電源を入れる
  3. クライアントPCで、MIDIコンバータプログラムとloopMIDI、Cubaseを起動
  4. ESPr Developerのボタンを押し、Cubaseが操作できるかどうか確認

Cubaseの設定は下図の通りです。

システム構築に使用したプログラムやスケッチ、配線図などはQiitaの当該記事を参照してください。

4. ESPr Developer・パーツを基盤にはんだ付けする

最後に、ブレッドボードのパーツをユニバーサル基板に移し替えてはんだ付けします。

ボタンのジャンパワイヤを差し込み、フタに取り付けるネジを締めて完成です。
結構ケースのサイズがギリギリでした…

inkscapeでコントロールパネルのデザインを決めていたので、折角なので印刷して貼り付けてみました。
穴あけの精度が悪く、ヨレが多く出てしまいました…

操作説明・操作デモ

操作手順

  1. サーバ側でMQTTブローカーのセットアップをします
  2. 当デバイスのバッテリーの電源をONにします
  3. LEDライトが常灯します。サーバに接続完了となると消灯し、準備完了の合図です。
  4. ボタンを押すと、対応したMIDIデータをDAWに送信します

デモ動画

苦労した点

電子工作に不慣れなもので、半田の扱いや穴の空け方など、下調べも含め時間を掛けてしまいました。
今回の一番の大きなミスはピンヘッダのはんだ付けです…上の図を見てもらえば分かるかと…。

おわりに

ESPr Developerは安価ながらも信頼のできる素晴らしいデバイスです。
今後も何か、こういった小物IoTデバイスを量産していきたいなぁと思いました。

ありがとうございました。