M5Stack / M5StickC と nüno を使って MIDI keyboard を作ってみた。

# はじめに
こんにちは。野良ハックチーム ざっきー と申します。
この記事は 2019 年 7 月 31 日に開催された「<A HREF="https://enebular.connpass.com/event/137352/">e-textile + ノンコーディング IoT の勉強会</A>」で LT 登壇した際に使用した導電布タッチセンサーモジュール <A HREF="https://github.com/tendots/nuno">nüno</A> を MIDI keyboard 化したメモです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/35de103a-620c-c2b5-3382-b9e81bd565dd.png" width="50%">
※ LT 登壇資料は<A HREF="https://www.slideshare.net/kitazaki/20190731-enebular-meetup-vol13-by-kitazaki-v1">こちら</A>。

# コンセプト
nüno を使って MIDI keyboard を作ろうと思った背景 (=コンセプト) をメモに残しておきます。

## ハンズオンへ参加
上記の勉強会で LT 登壇する前に 2019 年 4 月 26 日に「<A HREF="https://enebular.connpass.com/event/122739/">MIDI と MQTT を使ってリモート演奏する仕組みを作ってみよう</A>」と 2019 年 6 月 20 日に「<A HREF="https://enebular.connpass.com/event/132544/">MIDI と MQTT を使ってリモート演奏する仕組みを作ってみよう 改</A>」で MQTT を使ってリモートで MIDI を演奏する仕組みについて勉強していたことが大きいです。
リンク先にハンズオン資料が公開されていますので、仕組みについて詳細を確認することができます。

## nüno の仕様を調べた
- 静電容量タッチセンサモジュール　(mtch6102) を使用している  
→使ったことないなー。
- コネクタ GROVEコネクタ (I2C) が付いている  
→おっ！何とかなりそう！
- タッチチャンネル数 8 (mtch6102 の仕様は最大チャンネル数 15)  
→キーボードにできるのでは？

<img width="75%" alt="スクリーンショット 2019-12-09 10.04.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7f5cdb58-b1d7-6cc6-635d-f75ac9eb703c.png">

## 静電容量タッチセンサモジュール (mtch6102) の特性
M5Stack を使用して<A HREF="https://github.com/tendots/nuno/tree/master/sample/M5Stack/Touchtest">サンプルコード</A>を動かすとディスプレイに数値と線グラフが表示されます。(更新間隔: 100 msec)
何もしない状態では数値はほぼ０(ゼロ)ですが、導電布に手を触れるとかなりノイズが多く幅が大きいことが分かります。
センサー値をそのまま MIDI ベロシティ値として使用すると音が波打っているように聞こえてしまうため、閾値を用いてオン・オフする仕様にしました。
また、閾値が 1 つだと閾値付近でオン・オフを繰り返してしまい音が連打して聞こえてしまうため、閾値を 2 つ (上限閾値、下限閾値) にしました。

<img width="50%" alt="スクリーンショット 2019-12-09 10.54.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/9d608509-60f9-28c2-46a9-5f231bd3b196.png">

# 材料
- 導電布タッチセンサーモジュール nüno (静電容量タッチセンサモジュール　mtch6102)
- M5Stack または M5StickC
- Grove ケーブル
- MQTT ブローカー (Mosquitto、Shiftr.io など)
- PC (Mac または Windows)
- MIDI 音源 (ポケット・ミクなど。無くてもソフトウェア MIDI 音源 (<A HREF="https://juno-106.js.org/">106.js</A> など) で代用可。)

# 構成
送信側は M5Stack と導電布タッチセンサーモジュール nüno を Grove ケーブルで I2C 接続し、静電容量タッチセンサモジュールから取得したデータ (チャンネル番号と数値) に応じて MIDI 信号 (音階と音量 (プログラムでは MIDI チャンネルは固定)) を MQTT ブローカーへ送信します。
受信側は PC に MIDI 音源を接続 (MIDI 音源が無い場合はソフトウェア MIDI 音源を使用) し、<A HREF="https://github.com/TheOriginalAndrobot/midi2mqtt">midi2mqtt</A> プログラムを使用して MQTT ブローカーから受信した MIDI 信号を MIDI 音源へ入力しています。
<img width="100%" alt="スクリーンショット 2019-12-09 12.05.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a2780741-715c-812f-9bc3-5f35ce740df9.png">

# プログラム
M5Stack のサンプルコードに Wi-Fi 接続機能と MQTT ブローカーとの接続機能 (Publish / Subscribe) を追加しました。また、MIDI ベロシティ値を調整する機能が含まれます。

- M5Stack 版  
https://github.com/kitazaki/nuno_keyboard

M5StickC と obniz にもポーティングしました。

- M5StickC 版  
https://github.com/kitazaki/nuno_keyboard2  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/47d2146b-6b4a-39b4-8ea0-02ade0b77b65.jpeg" width="35%">
- obniz 版  
https://github.com/kitazaki/nuno_obniz  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4ea0ccc4-7239-6d8d-cd7c-9fc77d7089ba.jpeg" width="35%">  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/643a6326-9298-e359-04a5-6b9cc40c97b4.jpeg" width="35%">

# デモ動画
デモでは単音だけですが、複数同時発音にも対応しています。
<A HREF="https://youtu.be/K2BQXyfT9VQ"><img width="50%" alt="スクリーンショット 2019-12-09 11.01.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f58da101-aa35-a68e-24e4-a9e73ee33ca7.png"></A>


# まとめ
いつもと違う導電布製のキーボードで音楽を演奏してみませんか？！
良き M5Stack & nüno ライフを！