rakushoo blog

ジャズとプログラミングがやりたい人

music21をherokuサーバーで動かす時に困ったこと

自作アプリをWebサービスとして公開するにあたり、herokuを使うこととしました。

理由は、

  • Python-Djangoの情報が豊富そう
  • 無料プランがある
  • デプロイがしやすい

あたりです。とにかくWebサービスのアップが初めてなのでハードルが低くて経験できるものを選びました。

デプロイまでは他サイトを参考にこぎつけたのですが、music21が動作するまでに苦労した点を残しておきます。

png出力ができない

画像出力には、下記の処理を実施していました。

from music21 import stream  
〜省略〜  
s = stream.Score()  
s.write('lily.png')

ローカルではうまく出力できたのですが、本番環境では画像が生成されない問題にぶつかりました。
どうも、lilypondの呼び出しで失敗しているようでした。確かにインストールした覚えがない(笑)。

importしない外部アプリをどうやってインストールするか?

herokuのデプロイ時、pip installできるものはrequirements.txtを用意することで自動的にインストールされます。

しかし、music21を動かすために必要な、lilypond、museScoreは別途インストールが必要になります。(どちらも画像やXmlなど出力に関するもの)

herokuでは、BuildPakcsという仕組みを利用することでデプロイ時に必要な外部アプリをインストールが可能になります。 他の開発者のリポジトリもありましたが、バージョンが古いことや、配置するパスを指定したかったので、folkして自前リポジトリを用意しました。

https://github.com/rakushoo/heroku-buildpack-LilyPond

https://github.com/rakushoo/heroku-buildpack-MuseScore

そして、実装側のmusic21に対して下記の設定を追加しました。

from music21 import environment  
us = environment.UserSettings()  
us['lilypondPath'] = '/app/lilypond/usr/bin/lilypond'  
us['lilypondVersion'] = "2.20.0"  
us['musicxmlPath'] = '/app/tool/MuseScore-3.4.2-x86_64.AppImage'  
us['musescoreDirectPNGPath'] = '/app/tool/MuseScore-3.4.2-x86_64.AppImage'   
※ /app/はherokuサーバー上のソースコードが展開される場所

ひとまずBuildPacksに追加してデプロイをしたところ、write('musicxml')でのMusicXML出力はできるようになりました。

lilypondを使ったpng出力がまだできない状態だったので、別記事で対応方法を書きます。