Triggerhappyを使ってモニタなしのRaspberry Pi 3に接続したキーパッドからOSCを送る

# 1.概要

Raspberry Pi 3にPure Dataを入れて遊んでいます。

* [Raspberry Pi 3(Raspbian Stretch)にPure Dataをインストールする - Qiita](https://qiita.com/yuji_miyano/items/35144ebee1719ef8a07e)
* [Raspberry Pi 3のPure Data VanillaでOSC信号を受信する - Qiita](https://qiita.com/yuji_miyano/items/8ac0280115999e5d614c)
* [Raspberry Pi 3のPure Data Vanillaをコマンドラインから起動、終了する - Qiita](https://qiita.com/yuji_miyano/items/441d03b9bbfbd1e2aaae)

今回はRaspberry Pi 3にキーパッドをつないでPure Dataを操作しようと考えました。
キーの入力は取れたのですが、モニタなしで使おうとしてハマったので、メモです。

# 2. 環境・使用機器

* Raspberry Pi 3 (Rasbpian Stretch)
* Pure Data Vanilla (pd-0.47.1)

# 3. 手順

## 3.1 ハマるまでの経緯

まずは以下のサイトを参考に、Pure Dataで`key`や`select`使ってテンキーからの入力で操作するパッチを組みました。

* [Pure DataでPCのキーボードを鍵盤にする - aa develop](http://aa-deb.hatenablog.com/entry/2016/08/22/204552)

GUI上で上手く動いていましたが、今回はモニタを使用していないので以下のようにしてPuredataを起動しています。

```bash 
pd -nogui test.pd &
```

keyはPure Dataのウィンドウがアクティブのときに有効らしく、`-nogui`で起動した場合、使えないことが分かりました。

## 3.2 モニタなしでキーパッドの情報を受け取る方法 

方法をいろいろ調べてみましたが、pdで直接受け取るのは難しそうです。

それっぽい方法を2つ見つけました。

1. [Headless keyboard entry - how? - Raspberry Pi Forums](https://lb.raspberrypi.org/forums/viewtopic.php?t=20062)
  * Triggerhappyを使った方法
<img width="1195" alt="スクリーンショット 2018-05-25 11.13.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/94069/e0d6df9c-8528-0cd1-8a4e-f4726ef424ff.png">

2. [Anites: USB Keyboard on Raspberry Pi](http://www.anites.com/2013/12/usb-keyboard-on-raspberry-pi.html)
  * pythonを使った方法(詳しく読んでない)

1.で説明されていたTriggerhappyがRaspbianにもともと入っているっぽいのでこちらでやってみることにしました。

## 3.3 コマンドラインからOSCを送るためにosc-cliをインストールする

(* osc-cliはタイムラグがあったので最後にoscerで試した方法を追記しました) 
ターミナルからoscを送るnodeのモジュールをインストールします。

```bash 
npm install -g osc-cli
```

使い方は以下のサイトを見てください。

* [osc-cli  -  npm](https://www.npmjs.com/package/osc-cli)

例えば127.0.0.1:9001に`/play 1`を送る場合はターミナルで以下のコマンドを打ちます。

```bash 
osc --host 127.0.0.1:9001 /play 1
```

## 3.4 キーの名前の確認

Triggerhappyの設定ファイルを作成するために、以下のサイトを参考にしてまずはキーボードのキーがどういう名前で認識されているのかを調べます。

* [Keyboard volume controls - Raspberry Pi Forums](https://www.raspberrypi.org/forums/viewtopic.php?t=53916#p412570)


ターミナルで以下のコマンドを実行してキーを押すと表示されます。(`ctrl + c`で終了)

```bash 
thd --dump /dev/input/*
```

キーパッドの1を押して離したときの様子。

```bash 
EV_KEY        KEY_KP1        1        /dev/input/event0
# KEY_KP1        1        command
EV_KEY        KEY_KP1        0        /dev/input/event0
# KEY_KP1        0        command
```

## 3.4 .confファイルの作成、保存

以下のような内容のファイルを作成し、拡張子は`.conf`で`/etc/triggerhappy/triggers.d/`に保存します。

```:test.conf
# キーパッドの1を押したときにoscで/play 1を、離したときに/stop 1を送る
KEY_KP1 1 osc --host 127.0.0.1:9001 /play 1
KEY_KP1 0 osc --host 127.0.0.1:9001 /stop 1
```

私は.confファイルをプロジェクトフォルダ(この場合`myproject`フォルダ)に保存してシンボリックリンクを貼りました。

```bash
sudo ln -s ~/myproject/test.conf  /etc/triggerhappy/triggers.d/
```

リロードします。私の場合は再起動しないと上手く動きませんでした。

```bash
sudo /etc/init.d/triggerhappy reload
```

osc-cliの場合、少しタイムラグがあるのが気になりますが、とりあえず動くようになりました。

# (追記)osc-cliではなくoscerを試す

やっぱりosc-cliのタイムラグが気になったので、コマンドラインからOSCを送れる別のoscerを試してみました。

## 参考サイト
* [OSCをMacやWindowsやLinuxやRasPiから送るシンプルツール作った - aikeの日記](http://d.hatena.ne.jp/aike/201601140)
* [aike/oscer: simple command-line OSC messaging tool](https://github.com/aike/oscer)

## インストール
こうやってソースやビルドされたものが配布されているプロジェクトをどうやって使うのかが分からなくて、調べながら一応動くようにしたので、合っているか分かりません。

* githubをクローンする

```bash
git clone https://github.com/aike/oscer.git
```
* シンボリックリンクを作成する

```bash
sudo ln -s ~/oscer/build/LinuxARM/oscer  /usr/local/bin/
```
 
## コマンドラインでの使い方

```bash
oscer 127.0.0.1 9001 /play 1
```

## Triggerhappyの.confファイルを書き換える

```:test.conf
# キーパッドの1を押したときにoscで/play 1を、離したときに/stop 1を送る
KEY_KP1 1 oscer 127.0.0.1 9001 /play 1
KEY_KP1 0 oscer 127.0.0.1 9001 /stop 1
```

こっちの方が反応が早くて幸せになれました。