ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2018年3月11日日曜日

Raspberry piでCLIのみでSonic piを動かすサンプルを改善した

前にSonic piをCLI単体でnodeから鳴らす超適当なサンプルを書きなぐった。で、もう二年ぐらい放置していたのだけど、気づいたら今年の1月に、あんたドキュメント英語で書きなはれや(意訳)、というイシューが立っていた。

あんた専門卒に無茶言いなや……(意訳)、という内なる声を感じつつ、そもそも二年も立っているのでバージョンがかなり上がってるだろうから動作するかわからんし、だいたいなぜ日本語で書きなぐったリポジトリに人来るねんと思って調べると、node sonic pi で検索すると先頭に表示されるというあまり有り難くない状態になっていることに気づいた。

こりゃ人来るわなあ、というわけで、ごくいい加減な英文の説明を1,2行書くのと同時に、ちゃんと動くようにあれこれ直した。というかサンプルのコードに関してはほぼ全部書き直した。

CLIでそのまま動かすコアの部分に関しては前回と変わらずで、とにかくGUIで動作してないと定義されないいくつかの環境変数を適切に拾って渡してやれば良いだけで、起動シェル内で実行している。バージョンが上がって変わったのが、これまでは第一引数にそのまま演奏するコードを渡せばよかったのが、すべてのメッセージで第一引数にgui idというものを渡せと要求してくるようになったことだ。とはいえ、こっちにはGUIなんて無いので、適当に文字列で数値を渡しておけば良い。

サンプルとしては、もうちょっと使いやすいように、node内でシェルを実行して、サーバーの起動を待って、終了時は正しくsonic piの関連プロセスを全部落とすようにした。シェルから実行するとsonic pi本体が孫プロセスになってしまい、強制終了時なんかに孫プロセスまで殺しきれないので残ってしまう。調べてみると、子プロセスを起動するときに{detach:true}で上げて親プロセスと完全に分離して起動して、process.exit(-子プロセスのpid)として子プロセスのプロセスグループ全体を落としてしまえば良いらしい。

そのあたり適当に対応して使えるようにした。
以前よりかなり安定して動くようになったので、割と使えるものになったのではないかなと思う。なにか思いついたら音が鳴るおもちゃみたいなものにしてみようかなと思う。