最近 2022 年の Raspberry Pi OS で Node-RED で node-red-contrib-midi を使おうとしたら node-gyp エラーになったのを解決したメモです。
Node-RED Advent Calendar 2022 の 4 日目の記事として 12/13 に参戦させていただきました。
Raspberry Pi OS のバージョン
Raspberry Pi OS バージョンは以下の通りです。
uname -a
こちらのコマンドでは、
Linux raspberrypi 5.15.61-v7l+ #1579 SMP Fri Aug 26 11:13:03 BST 2022 armv7l GNU/Linux
となり、
lsb_release -a
こちらのコマンドでは、
No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 11 (bullseye) Release: 11 Codename: bullseye
こうなりまして、2022 年夏ごろのバージョンを Raspberry Pi 4 にインストールしています。たしか、 Recomended のものです。
node-red-contrib-midi をインストールしたらエラー
node-red-contrib-midi (node) – Node-RED
こちらをインストールしたらエラーになりました。
----------------------------------------------------------- 2022-12-08T23:58:13.936Z 追加 : node-red-contrib-midi 1.1.2 2022-12-08T23:58:14.024Z npm install --no-audit --no-update-notifier --no-fund --save --save-prefix=~ --production --engine-strict node-red-contrib-midi@1.1.2 2022-12-08T23:58:15.242Z [err] npm 2022-12-08T23:58:15.243Z [err] 2022-12-08T23:58:15.243Z [err] WARN config production Use `--omit=dev` instead. 2022-12-08T23:58:25.161Z [err] npm 2022-12-08T23:58:25.162Z [err] ERR! code 1 2022-12-08T23:58:25.162Z [err] npm 2022-12-08T23:58:25.162Z [err] 2022-12-08T23:58:25.163Z [err] ERR! path /home/pi/.node-red/node_modules/midi 2022-12-08T23:58:25.167Z [err] npm 2022-12-08T23:58:25.167Z [err] ERR! command failed 2022-12-08T23:58:25.167Z [err] npm ERR! command sh -c -- node-gyp rebuild 2022-12-08T23:58:25.168Z [err] npm ERR! make: Entering directory '/home/pi/.node-red/node_modules/midi/build' 2022-12-08T23:58:25.168Z [err] npm 2022-12-08T23:58:25.168Z [err] ERR! CXX(target) Release/obj.target/midi/vendor/rtmidi/RtMidi.o 2022-12-08T23:58:25.168Z [err] npm ERR! make: Leaving directory '/home/pi/.node-red/node_modules/midi/build' 2022-12-08T23:58:25.168Z [err] npm 2022-12-08T23:58:25.168Z [err] ERR! gyp info it worked if it ends with ok 2022-12-08T23:58:25.168Z [err] npm ERR! 2022-12-08T23:58:25.169Z [err] gyp info using node-gyp@9.1.0 2022-12-08T23:58:25.169Z [err] npm ERR! gyp info using node@16.18.1 | linux | arm 2022-12-08T23:58:25.169Z [err] npm ERR! 2022-12-08T23:58:25.169Z [err] gyp info find Python using Python version 3.9.2 found at "/usr/bin/python3" 2022-12-08T23:58:25.169Z [err] npm ERR! gyp http GET https://nodejs.org/download/release/v16.18.1/node-v16.18.1-headers.tar.gz 2022-12-08T23:58:25.169Z [err] npm ERR! 2022-12-08T23:58:25.169Z [err] gyp http 200 https://nodejs.org/download/release/v16.18.1/node-v16.18.1-headers.tar.gz 2022-12-08T23:58:25.169Z [err] npm ERR! gyp http GET https://nodejs.org/download/release/v16.18.1/SHASUMS256.txt 2022-12-08T23:58:25.169Z [err] npm ERR! gyp http 200 https://nodejs.org/download/release/v16.18.1/SHASUMS256.txt 2022-12-08T23:58:25.169Z [err] npm ERR! gyp info spawn /usr/bin/python3 2022-12-08T23:58:25.169Z [err] npm ERR! gyp info spawn args [ 2022-12-08T23:58:25.169Z [err] npm ERR! gyp info spawn args '/usr/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py', 2022-12-08T23:58:25.169Z [err] npm ERR! gyp info spawn args 'binding.gyp', 2022-12-08T23:58:25.169Z [err] npm 2022-12-08T23:58:25.170Z [err] ERR! gyp info spawn args '-f', 2022-12-08T23:58:25.170Z [err] npm ERR! gyp info spawn args 'make', 2022-12-08T23:58:25.170Z [err] npm ERR! gyp info spawn args '-I', 2022-12-08T23:58:25.170Z [err] npm 2022-12-08T23:58:25.170Z [err] ERR! gyp info spawn args '/home/pi/.node-red/node_modules/midi/build/config.gypi', 2022-12-08T23:58:25.170Z [err] npm ERR! gyp info spawn args '-I', 2022-12-08T23:58:25.170Z [err] npm ERR! 2022-12-08T23:58:25.170Z [err] gyp info spawn args '/usr/lib/node_modules/npm/node_modules/node-gyp/addon.gypi', 2022-12-08T23:58:25.170Z [err] npm ERR! gyp info spawn args '-I', 2022-12-08T23:58:25.170Z [err] npm ERR! gyp info spawn args '/home/pi/.cache/node-gyp/16.18.1/include/node/common.gypi', 2022-12-08T23:58:25.170Z [err] npm ERR! 2022-12-08T23:58:25.170Z [err] gyp info spawn args '-Dlibrary=shared_library', 2022-12-08T23:58:25.170Z [err] npm ERR! gyp info spawn args '-Dvisibility=default', 2022-12-08T23:58:25.170Z [err] npm 2022-12-08T23:58:25.170Z [err] ERR! gyp info spawn args '-Dnode_root_dir=/home/pi/.cache/node-gyp/16.18.1', 2022-12-08T23:58:25.170Z [err] npm ERR! gyp info spawn args '-Dnode_gyp_dir=/usr/lib/node_modules/npm/node_modules/node-gyp', 2022-12-08T23:58:25.170Z [err] npm 2022-12-08T23:58:25.171Z [err] ERR! gyp info spawn args '-Dnode_lib_file=/home/pi/.cache/node-gyp/16.18.1/<(target_arch)/node.lib', 2022-12-08T23:58:25.171Z [err] npm ERR! 2022-12-08T23:58:25.171Z [err] gyp info spawn args '-Dmodule_root_dir=/home/pi/.node-red/node_modules/midi', 2022-12-08T23:58:25.171Z [err] npm ERR! gyp info spawn args '-Dnode_engine=v8', 2022-12-08T23:58:25.171Z [err] npm ERR! 2022-12-08T23:58:25.171Z [err] gyp info spawn args '--depth=.', 2022-12-08T23:58:25.171Z [err] npm ERR! gyp info spawn args '--no-parallel', 2022-12-08T23:58:25.171Z [err] npm ERR! gyp info spawn args '--generator-output', 2022-12-08T23:58:25.171Z [err] npm ERR! gyp info spawn args 'build', 2022-12-08T23:58:25.171Z [err] npm ERR! gyp info spawn args '-Goutput_dir=.' 2022-12-08T23:58:25.171Z [err] npm ERR! gyp info spawn args ] 2022-12-08T23:58:25.171Z [err] npm ERR! gyp info spawn make 2022-12-08T23:58:25.172Z [err] npm ERR! gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] 2022-12-08T23:58:25.172Z [err] npm ERR! ../vendor/rtmidi/RtMidi.cpp:1543:10: fatal error: alsa/asoundlib.h: No such file or directory 2022-12-08T23:58:25.172Z [err] npm ERR! 2022-12-08T23:58:25.172Z [err] 1543 | #include <alsa/asoundlib.h> 2022-12-08T23:58:25.172Z [err] npm ERR! | ^~~~~~~~~~~~~~~~~~ 2022-12-08T23:58:25.172Z [err] npm 2022-12-08T23:58:25.172Z [err] ERR! compilation terminated. 2022-12-08T23:58:25.172Z [err] npm ERR! make: *** [midi.target.mk:118: Release/obj.target/midi/vendor/rtmidi/RtMidi.o] Error 1 2022-12-08T23:58:25.172Z [err] npm ERR! gyp ERR! build error 2022-12-08T23:58:25.172Z [err] npm ERR! 2022-12-08T23:58:25.172Z [err] gyp ERR! stack Error: `make` failed with exit code: 2 2022-12-08T23:58:25.172Z [err] npm ERR! gyp ERR! stack at ChildProcess.onExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:201:23) 2022-12-08T23:58:25.172Z [err] npm 2022-12-08T23:58:25.172Z [err] ERR! gyp ERR! stack at ChildProcess.emit (node:events:513:28) 2022-12-08T23:58:25.172Z [err] npm ERR! gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:293:12) 2022-12-08T23:58:25.173Z [err] npm ERR! gyp ERR! System Linux 5.15.61-v7l+ 2022-12-08T23:58:25.173Z [err] npm ERR! 2022-12-08T23:58:25.173Z [err] gyp ERR! command "/usr/bin/node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" 2022-12-08T23:58:25.173Z [err] npm ERR! gyp ERR! cwd /home/pi/.node-red/node_modules/midi 2022-12-08T23:58:25.173Z [err] npm 2022-12-08T23:58:25.173Z [err] ERR! gyp ERR! node -v v16.18.1 2022-12-08T23:58:25.173Z [err] npm ERR! gyp ERR! node-gyp -v v9.1.0 2022-12-08T23:58:25.173Z [err] npm ERR! gyp ERR! not ok 2022-12-08T23:58:25.178Z [err] 2022-12-08T23:58:25.178Z [err] npm 2022-12-08T23:58:25.178Z [err] ERR! A complete log of this run can be found in: 2022-12-08T23:58:25.178Z [err] npm ERR! /home/pi/.npm/_logs/2022-12-08T23_58_15_177Z-debug-0.log
こんな感じのエラーです。うおお、node-gyp エラーは、えぐそう。
Node.js の midi ライブラリのエラーに由来していた
ともあれ戦わねばなりません。
こちらのエラー、さっきのログを見ているとNode.js の midi ライブラリのエラーに由来してることが分かりました。
../vendor/rtmidi/RtMidi.cpp:1543:10: fatal error: alsa/asoundlib.h: No such file or directory
このあたりがあやしくて調べていると、
こちらのほうの issue が出てきて、トップページに
と書かれていました。親切。あと、これを node-red-contrib-midi のほうに説明くわえてくれたらいいな。
- 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)
このリスト Python、C++ compiler、ALSA はおそらく入っているので、 libasound2-dev パッケージが足りなそうなので入れてみます。
sudo apt-get install libasound2-dev
うちの環境では、このコマンドを実行して libasound2-dev パッケージを入れたところ、うまくインストールできました!
インストールしたあと nanoKEY2 というキーボードデバイスを認識させてみたところ。わーい。
これで、色々な MIDI デバイスをつないで楽しめそうです!
参考文献
と、ここまで調べきっていたところ、
node-red-contrib-midiをRaspberry Piにインストールするときにハマったこと – Qiita
こちらに、同じ苦労をされていた方がいらっしゃいました。2 年前に。
先に調べればよかったとも思ったけど、ここから 2 年後も同じハマりをするなら書いておこうと思った次第。
実は、遠い昔にも自分が今回と同じハマり方をしてた気がするんですよね。
この記事と私の状況の違いは、さらに MIDI ライブラリのバージョンでハマるみたいなんですが、これは node-red-contrib-midi 内の package.json で解決されたようなので、そこは回避されててよかったです。
Raspbianの”sudo alsamixer”が通らない場合 – DreamerDreamのブログ
なお、この記事のように ALSA がないかなと最初思ったんですが、このあたりは現在の Raspberry Pi OS では問題なさそうなので、対応しなくてよかったです。
ともあれ、これらの記事で対応が間違ってないことが補強されて良かったです。ありがとうございました。