最近 2022 年の Raspberry Pi OS で Node-RED で node-red-contrib-midi を使おうとしたら node-gyp エラーになったのを解決したメモ

最近 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 をインストールしたらエラー

image

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

このあたりがあやしくて調べていると、

midi – npm

こちらのほうの issue が出てきて、トップページに

image

と書かれていました。親切。あと、これを 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 パッケージを入れたところ、うまくインストールできました!

image

インストールしたあと 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 では問題なさそうなので、対応しなくてよかったです。

ともあれ、これらの記事で対応が間違ってないことが補強されて良かったです。ありがとうございました。