node-red-contrib-midiをRaspberry Piにインストールするときにハマったこと

# node-red-contrib-midi

NODE-REDでMIDIが使えるのかなと思って検索したら[node-red-contrib-midi](https://flows.nodered.org/node/node-red-contrib-midi)というノードを見つけたのでインストールしてみたのだが、一筋縄ではいかなかったので記録。

## 環境

* Raspberry Pi 4 Model B
* Raspbian buster
* NODE-RED v1.1.3

# インストール手順

## 普通にインストールしてみると失敗する

パレットの管理＞ノードを追加 から midi で検索すると node-red-contrib-midi が出てくるのでここからインストールしてみる。

<img width="579" alt="スクリーンショット 2020-08-14 0.35.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70022/808ad460-4c7b-e91d-a420-98608658606e.png">

しかし失敗。

<img width="503" alt="install failed" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70022/bde31d7f-eada-064a-d39f-99d4e1db1342.png">

## ログの調査→libasound2-devのインストールが必要

ログを見てみる。

```
2020-08-13T15:26:49.876Z 追加 : node-red-contrib-midi 1.0.1

2020-08-13T15:26:49.903Z npm install --no-audit --no-update-notifier --save --save-prefix="~" --production node-red-contrib-midi@1.0.1
2020-08-13T15:27:06.398Z [out] 
2020-08-13T15:27:06.398Z [out] > midi@0.9.5 install /home/pi/.node-red/node_modules/midi
2020-08-13T15:27:06.398Z [out] > node-gyp rebuild
2020-08-13T15:27:06.398Z [out] 
2020-08-13T15:27:14.202Z [out] make: ディレクトリ '/home/pi/.node-red/node_modules/midi/build'　に入ります
2020-08-13T15:27:14.205Z [out]   CXX(target) Release/obj.target/midi/src/node-midi.o
2020-08-13T15:27:14.509Z [err] In file included from ../src/node-midi.cpp:6:
2020-08-13T15:27:14.509Z [err] ../src/lib/RtMidi/RtMidi.cpp:1095:10: fatal error: alsa/asoundlib.h: そのようなファイルやディレクトリはありません
2020-08-13T15:27:14.509Z [err]  #include <alsa/asoundlib.h>
2020-08-13T15:27:14.509Z [err]           ^~~~~~~~~~~~~~~~~~
(以下略)
```

asoundlib.hが無いと怒られている。検索してみると、ALSAというLinux用サウンドドライバーの関係ファイルの模様。

もう一度よくログを見てみると、node-red-contrib-midi をインストールする中で midi というNode.jsモジュールをnpmでインストールしようとしている。

[npmのmidiのページ](https://www.npmjs.com/package/midi) を見ると、以下の記載がある。

> Linux
> A C++ compiler
> You must have installed and configured ALSA. Without it this module will NOT build.
> Install the libasound2-dev package.
> Python (for node-gyp)

libasound2-devをインストールしろと書いてある。

## libasound2-devをインストール後再試行→まだ失敗する

libasound2-devをインストールしてみる。

```bash
sudo apt update
sudo apt install libasound2-dev
```

再び パレットの管理＞ノードを追加 から node-red-contrib-midi をインストールしてみる。

しかしまたもや失敗。

<img width="503" alt="install failed" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70022/bde31d7f-eada-064a-d39f-99d4e1db1342.png">

## ログ調査→npmのmidiのバージョンが古いことが判明

ログを見てみる

```
2020-08-13T15:56:44.714Z 追加 : node-red-contrib-midi 1.0.1

2020-08-13T15:56:44.725Z npm install --no-audit --no-update-notifier --no-fund --save --save-prefix="~" --production node-red-contrib-midi@1.0.1
2020-08-13T15:56:53.480Z [out] 
2020-08-13T15:56:53.480Z [out] > midi@0.9.5 install /home/pi/.node-red/node_modules/midi
2020-08-13T15:56:53.480Z [out] > node-gyp rebuild
2020-08-13T15:56:53.480Z [out] 
2020-08-13T15:56:55.819Z [out] make: ディレクトリ '/home/pi/.node-red/node_modules/midi/build'　に入ります
2020-08-13T15:56:55.821Z [out]   CXX(target) Release/obj.target/midi/src/node-midi.o
2020-08-13T15:56:57.282Z [err] In file included from ../src/node-midi.cpp:1:
2020-08-13T15:56:57.282Z [err] ../../nan/nan.h: In function ‘void Nan::AsyncQueueWorker(Nan::AsyncWorker*)’:
2020-08-13T15:56:57.282Z [err] ../../nan/nan.h:2298:62: warning: cast between incompatible function types from ‘void (*)(uv_work_t*)’ {aka ‘void (*)(uv_work_s*)’} to ‘uv_after_work_cb’ {aka ‘void (*)(uv_work_s*, int)’} [-Wcast-function-type]
2020-08-13T15:56:57.282Z [err]      , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
2020-08-13T15:56:57.282Z [err]                                                               ^
2020-08-13T15:56:57.717Z [err] ../src/node-midi.cpp: At global scope:
2020-08-13T15:56:57.717Z [err] ../src/node-midi.cpp:14:26: error: ‘v8::Handle’ has not been declared
2020-08-13T15:56:57.717Z [err]      static void Init(v8::Handle<v8::Object> target)
2020-08-13T15:56:57.717Z [err]                           ^~~~~~
```

以前とエラーメッセージが変わっている。npm midiでエラーが出ているところは同じ。

npmのmidiのgithubのissueを見ていたら、https://github.com/justinlatimer/node-midi/issues/136 というのを発見した。内容を要約すると以下。

* Node.jsのv12だとインストールができない
* v1.0.0でこの問題を解決した

node-red-contrib-midiのインストール時のログには`midi@0.9.5 install /home/pi/.node-red/node_modules/midi`とあるのでnode-red-contrib-midiがv1.0.0を参照するようにすれば解決しそうな予感。

## node-red-contrib-midiのpackage.jsonの修正後再試行→インストール成功

node-red-contrib-midiをgithubからローカルにクローンする

```
cd ~/.node-red
git clone https://github.com/urbiworx/node-red-contrib-midi.git
```

package.jsonを修正する

```diff
    "dependencies": {
-        "midi": "~0.9.5"
+        "midi": "~1.0.0"
    },
```

修正したnode-red-contrib-midiをインストールする

```bash
npm install ./node-red-contrib-midi
```

エラーなくインストールできました。

Node-REDを再起動する

```bash
node-red-restart
```

無事インストールされていました。

<img width="178" alt="install success" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70022/4e2e54ed-3eb4-8464-1f87-cba2244ea1fc.png">

# おわりに

1つめのlibasound-devの件は、node-red-contrib-midiのREADMEにでも書いてあると良いのですが…

2つめのmidiのバージョンの件は、node-red-contrib-midiのgithubのプルリクエストを見たら、同じのがあった。
https://github.com/urbiworx/node-red-contrib-midi/pull/11
マージされれば2つ目の問題は発生しませんね。