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


node-red-contrib-midi

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

環境

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

インストール手順

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

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

しかし失敗。

ログの調査→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 [email protected]
2020-08-13T15:27:06.398Z [out] 
2020-08-13T15:27:06.398Z [out] > [email protected] 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のページ を見ると、以下の記載がある。

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をインストールしてみる。

sudo apt update
sudo apt install libasound2-dev

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

しかしまたもや失敗。

ログ調査→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 [email protected]
2020-08-13T15:56:53.480Z [out] 
2020-08-13T15:56:53.480Z [out] > [email protected] 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のインストール時のログには[email protected] 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を修正する

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

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

npm install ./node-red-contrib-midi

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

Node-REDを再起動する

node-red-restart

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

おわりに

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つ目の問題は発生しませんね。