ラズパイ＋加速度センサー＋PureDataで作る1人バンド演奏ツール

# はじめに

沖縄で毎年開催される**[ハッカーズチャンプルー２０１９](https://hackers-champloo.org/2019/program.html)**というカンファレンスで「ラズパイは〇〇」という
タイトルでLTしたのですが、ちょっと分かりづらかったかなー、という反省もあり解説を残しておきます。
（将来、再度作りたくなった時の自分用のメモも兼ねて）

# LT内容

[スライドはこちら](https://www.slideshare.net/ShinjiMiyazato/ss-152583546)

要約すると
**ギタープレイヤーが1人バンド演奏するために必要なものを全てラズパイ上で動かしてみたよ**
という内容です。

- 1人バンドやりたい場合に必要なもの
    - リズムサンプラー
        - ドラムの役割
    - ルーパー
        - 録音した音声をループ再生するもの
        - 1人バンドでは、ベース／ギターを同時演奏できないので、音を重ねていく際に必要
    - エフェクター
        - ギターの音声に、ディストーション、ワウ、ディレイ、コーラスなど音響効果を与える役割

これらを、Pure Dataというソフトウェアで実現しました。（説明後述）

また、リズムサンプラーやルーパーの開始終了を手元で操作したいので、ラズパイをギターにマジック
テープで装着し、タクトスイッチで制御できるようにしました。
さらに、ラズパイはいろいろなセンサーを扱えるので、加速度センサーを付けて、ギターのジェスチャー
でエフェクトの切り替えや[ワウ](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A6%E3%83%9A%E3%83%80%E3%83%AB)のような音響効果を実現しました。
（ワウについては、思いつきでしたが予想以上に滑らかないい感じのワウが出来ました。←lineオブジェクトのおかげ）

## Pure Data

音声をグラフィカルにプログラミングして加工・保存（録音）・再生できるソフトウェアです。
macOS, Windows, Linuxでも動きます。もちろんラズパイも。
詳細は下記サイトを参照ください。
[本家(英語)](http://puredata.info/)
[日本語紹介サイト](https://puredatajapan.info/?page_id=2)

以下の画像のように四角い枠を線で繋いでいろいろな加工・録音・再生ができます。
![patch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51108/99c2224a-c372-6e8f-a5e5-584be733e46d.jpeg)

スライド中にも書きましたが、PureDataには netreceiveというオブジェクトを使用してOSCという
プロトコルでネットワーク越しにPureDataを制御可能、という特徴があります。
これにより、センサーから取得した値やタクトスイッチなど、GPIOからの信号を判定するプログラム経由で
外からPureDataを制御することができます。

## デモ動画

どんなものを作ったのか、見てもらった方が早いので動画をYoutubeにあげました。
（スライド中にも同じリンクがあります）

- [エフェクターデモ](https://www.youtube.com/watch?v=FKiku7VrdEE&feature=youtu.be)
    - ギターのジェスチャー（ヘッドを縦 or 前後に振る動作）を加速度センサーで検知してPureDataを制御
        - ヘッドを縦に振る動作　：エフェクト切り替え
        - ヘッドを前後に振る動作：[ワウ](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A6%E3%83%9A%E3%83%80%E3%83%AB)エフェクト。「ワウ・ジャイロ」と勝手に名付けています^^
- [1⼈バンド演奏デモ](https://www.youtube.com/watch?v=moIaWK_jNWU&feature=youtu.be)
    - リズムサンプラー開始ボタンでドラム演奏開始
    - 録音ボタンでベースライン・バッキング・リフを順番に録音しルーパーで再生しつつ、音を重ねていきます
    - 最後はディストーションで自由にソロパートの練習（これが気持ちいい！！

*バッキングのリズムが少し遅れていることは、ご容赦ください。（１発撮りなので ^^;*

# 制作物について

## 名称（オレオレ定義）

マルチエフェクターにも、リズムサンプラーにも、ルーパーにもなる。これを的確に表す言葉が見当たらない
ので、とりあえず「ラズパイエフェクター」と呼んでいます。
また、これを取り付けたギターを「ラズパイギター」と呼んでいます。

## 制作目的

ギターを使って作曲やフレーズ作りをしたい場合に、いい感じのベースラインやバッキングが流れていると
捗ると思います。
通常は、オーディオプレイヤーを使って誰かの曲を流しながらやる、もしくは専用のツール（ルーパーなど）を
持っていればそれ使うと思いますが、ベースやバッキングをプレイヤーが自由につくり直せるツールがあると
さらに捗ると思い作りました。
また、そういうインスピレーションに任せて創作する段階では、音質などにこだわる必要はないので、
リズムサンプラー＋ルーパーで出力される音声とギター＋エフェクターの音声が一つのアンプから出せた方が
必要な機材も少なくて済み、手軽に使えると思いました。

## 必要なもの

- エレキギター
- アンプ
- モバイルバッテリー
- Raspberry Pi 3 Model B+
    - NOOBS v3.0.0（Raspbian-Stretch 2018-11-13)
    - 裸のままだと装着しにくいのでクリアケース付きを買うとよい
- ブレッドボード・ジャンパーワイヤ
- [加速度センサー](https://www.amazon.co.jp/dp/B0154PM102/)
    - 実際には、加速度検出、角度検出、方位検出ができます。それでこの値段はめっちゃ安い！！
    - 購入時は半田付けされていない状態ですので、半田ごてで半田付けしてください！！
- [サウンドカード](https://www.amazon.co.jp/dp/B00NMXY2MO/)
    - USBに挿して使用
    - Input側にギター、Output側にアンプに繋ぐ3.5mmステレオミニプラグを接続
- 3.5mm ステレオミニプラグ オーディオケーブル x 2
- 6.3mmモノラル(オス)-3.5mmステレオ(メス) 変換アダプター x 2
    - ギター／アンプのジャックが6.3mmモノラル端子の場合に必要。イヤホンを使う場合などは１つでOK

### 装着した様子

![ギターにラズパイ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51108/d7a660ae-3f91-cfb6-68b7-e9e92814d9d3.jpeg)

加速度センサーとラズパイをギターにつけて、ギター - ラズパイ - アンプって感じでシールド繋げてます。
（配線図は割愛、読み取ってください＾＾）

使用しているGPIOは、以下の通り

| GPIO　　　　 | 用途 |
|:-------|:----|
| GPIO04  | リズムサンプラー開始（=Pdプロセス再起動）／終了ボタン<br>6秒以上長押しするとラズパイOS停止<br>片方は3V3へ繋ぐ |
| GPIO17  | 録音ボタン、押すごとに３つのトラックを順番に切り替えてそこに録音<br>片方は3V3へ繋ぐ |
| GPIO27  | エフェクトの切り替えボタン（＝ギターを縦に振るジェスチャーと同じ効果）<br>片方は3V3へ繋ぐ |
| 3V3	 | MPU9250 - VCC |
| GPIO02 | MPU9250 - SDA |
| GPIO03 | MPU9250 - SCL |
| GND    | MPU9250 - GND |

※MPU9250は加速度センサーです。

# 制作手順

## 手順

### OS最新化

[raspberrypiのOSを更新する方法](https://qiita.com/akiraichi5430/items/6b9855f59fb3a3f9de35)を参考に

### PureDataインストール

```terminal
sudo apt install puredata
# => 0.47.1 pd vanilla が入ります
```
### deken＆Gemを導入

dekenはPdライブラリ（externals）を選択的に追加して管理できるプラグインプログラムです。
今回は、counterオブジェクトが含まれるcycloneというGemを入れます。

まず、GUI(vnc可)でpdを実行します。(ターミナルから `pd &`実行)
1. pdメニューから`Help -> Find externals`選択
2. `cyclone`を検索してインストール
3. パスは `/home/pi/pd/externals`を指定
4. `Preferences -> Path..`を開き`New..`をクリックし追加したパッケージを指定

-> これでCycloneに入っているcounterオブジェクトが使えます
参考）http://nakagaw.hateblo.jp/entry/2016/12/31/030951


### 加速度センサーセットアップ

```terminal
# I2C有効化
sudo raspi-config
# => I2C有効化して保存

# 再起動
sudo reboot

# 加速度センサーを使えるようにする
sudo apt install i2c-tools
sudo i2cdetect -y 1
# => 68が表示されることを確認
sudo apt install python-pip python-smbus
sudo pip install FaBo9Axis_MPU9250

# 加速度センサーの動作確認
mkdir ~/mpu9250
wget https://raw.githubusercontent.com/FaBoPlatform/FaBo9AXIS-MPU9250-Python/master/example/read9axis.py
python read9axis.py
# => ラズパイを動かして数値が変わることを確認
```

### センサーやタクトスイッチからの入力をPureDataに繋げるデーモンの準備

```terminal
# OCSプロトコルを扱うモジュールインストール
sudo python -m pip install pyOSC
# 自作コードをgit cloneして配置
cd /tmp
git clone https://github.com/miyaz/raspi-guitar.git
cd raspi-guitar
mv home/pi/* ~/
sudo vi /etc/rc.local
```

以下２行を追加し、OS起動時に自動実行されるようにする

```terminal:/etc/rc.local
(〜省略〜)
sudo su - pi -c "python /home/pi/pd-ctlr.py" &
sudo su - pi -c "python /home/pi/effect-ctlr.py" &
exit 0
```

あとはOS再起動するだけで自動的に起動します
３つのボタンを操作して、リズムサンプラーを開始したり、録音したり、エフェクトを切り替えたりできるはずです。

### パッチ修正方法

パッチファイルは `/home/pi/pd/hcmpl_lt1.pd` にあります。
編集したい場合は `pkill pd`してからGUI環境で、`pd /home/pi/pd/hcmpl_lt1.pd`して編集してください。
細かい説明は割愛しますが、パッチの機能ごとの配置は以下のようになっています。

![pdのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51108/715520f0-07de-cb3c-f1ec-a2c7395a5fe4.png)

# LTの反応

LTに反応していただいたツイートを抜粋（ありがたや〜

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ラズパイをギターにくっつけてエフェクターにして、加速度センサでエフェクトを変えてサンプリングもできるようにしたのすごい。未来の楽器感がある。<a href="https://twitter.com/hashtag/hcmpl?src=hash&amp;ref_src=twsrc%5Etfw">#hcmpl</a></p>&mdash; hikalium (@hikalium) <a href="https://twitter.com/hikalium/status/1144877034826420225?ref_src=twsrc%5Etfw">2019年6月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">加速度センサーとラズパイで、マルチエフェクターより強い何か(なんと形容していいのかわからん)もの作ってるのマジですごいし、欲しい<br> <a href="https://twitter.com/hashtag/hcmpl?src=hash&amp;ref_src=twsrc%5Etfw">#hcmpl</a></p>&mdash; つはゆうや@まごころポスト (@tsuhha) <a href="https://twitter.com/tsuhha/status/1144877027385700352?ref_src=twsrc%5Etfw">2019年6月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">うわ！！！めっちゃいい！！！！！欲しい！！！！！ <a href="https://twitter.com/hashtag/hcmpl?src=hash&amp;ref_src=twsrc%5Etfw">#hcmpl</a></p>&mdash; かび@𝐻𝑎𝑐𝑘𝑒𝑟𝑠𝐶ℎ𝑎𝑚𝑝𝑙𝑜𝑜 (@aokabin_) <a href="https://twitter.com/aokabin_/status/1144876419295506432?ref_src=twsrc%5Etfw">2019年6月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ほんと一部（たぶんギターやっている人）には支持されていますが、反応の格差が顕著で面白いです（ネタ選択ミスw

# LTを通して言いたいこと

（途中音声トラブル等でLT完走できず、まとめまで話せなかったので言いたかったことをここに書いておきます）

今回、LTタイトルを「ラズパイは〇〇」としました。
で、LTスライドの最後の方にこう書きました。（LTなので誇張気味ですが）

![raspi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51108/83a025f7-309a-2c63-6b5c-dfb8b1327bd2.jpeg)


今の時代、あらゆるものがソフトウェアで制御できるようになっています。
その多くがLinux(≒ラズパイ)上でも動きます。
ラズパイはコンパクトなので、`従来のLinuxサーバ`と違いいろいろな場所に取り付けることができ
電力消費が小さく数時間であればモバイルバッテリーに繋いで動かすことができます。
また、ラズパイは、温度・光・加速度などのセンサーやカメラモジュールの映像を扱うことができます。

ラズパイをギターにつけよう、と発想する人はあまりいないと思います。
でも、常識的には考えないかもしれませんが、作ってみてとても有用だと実感しました。

ラズパイって、アイデア次第で次のイノベーションやその種・卵を産み出せる可能性があると思うので、
もっと普及して、学校などでも使われるようになるといいなぁ、と思ってLTしました！
（会場が琉球大学で学生の参加者が多そうだったのもあります）