[ この記事は LINE Messaging API を使って LaTex を送れるようにしてみた。 の続編です。 ]
LINE で音楽を送る
LINE で人と Z-MUSIC の話をするとき、どうしても音符を送りたいときがありますよね。
でも、鼻歌はマルチチャンネルにできませんし、紙がなければ五線譜も書けません。
相手が生の MML を読める人ならいいのですが、そうもいかないことも多々あります。
MML を送ると音楽を返してくれる bot がないかと思って探してみましたが、なかったので作ってみました。
動作イメージ
友だち追加はこちらからどうぞ。
MMLの変換には「サクラ」を使っているので、ストトン記法も使えます。
システムについて
サーバーはなんの変哲もない Debian Linux です。
サーバー側で mml → midi → wav → m4a という変換を行って、LINE で再生できる形式にします。
MML → MIDI
MML → MIDI の変換には CLI版サクラの csakura
を使います。
配布されているバイナリは MacOS と RPi 向けですので、Debian では使えません。
自前でビルドします。
sudo apt install fpc nkf
git clone https://github.com/kujirahand/sakuramml.git
cd sakuramml
./make.sh
MIDI → WAV
この変換には fluidsynth
を使います。
sudo apt install fluidsynth
ついでにお好みのサウンドフォントも探しておきましょう。
今回は、Z-MUSIC 風になればいいなということで、FM 音源風のサウンドフォントを見つけてきました。
ただし、あまりサウンドフォントが大きいとメモリ上に展開できずに fluidsynth
が死にます。
小さいサウンドフォントにするか、サーバーに課金してください。
ホントはちゃんと波形を生成するほうがリアルなんですけどね……
できたところで自分は使いこなせる気がしないので、とりあえず MIDI で妥協します。
WAV → M4A
LINE のドキュメントには m4a で投げろと書いてあったので、WAV のままではだめなんだと思います。
WAV のまま送れそうな気もしますが、実験はしていません。
WAV → M4A の変換のため、ffmpeg
をインストールします。
環境によっては、他のコンポーネントも必要になるかもしれません。適宜入れます。
sudo apt install ffmpeg
サーバー
今回は nginx を使います。
が、この記事にはサーバー設定回りは書きませんので、静的ファイルが配れて php が動けばなんでもいいです。
今回は php 用のサーバーに生成した m4a も置くのですが、絶対 s3 等のストレージにアップするべきだとは思っています。今後の課題です。
ソース
前回は受け取ったテキストを Google Charts API に投げるだけでよかったのですが、今回はそうはいきません。
今回のミソは、csakura
関係の部分です。こいつは SJIS で動くので、入出力をそのまま
UTF-8 系の PHP に食わせると文字化けします。つまり
- MML ソースの UTF-8 → SJIS 変換
-
csakura
の出力の SJIS → UTF-8 変換
をしてやる必要があります。
ソースでは前者は mbstring
で、後者は iconv
で実現しています。
サウンドフォントの都合で音が小さかったので、ffmpeg
で音量の調整をかけています。
音質も下がり、非力な音源チップ感が出て非常にいいです。
サンプル
冒頭のイメージで使った MML コードを貼っておきます。
きらきら星
ccggaag2 ffeeddc2 [ggffeed2] ccggaag2 ffeeddc2
ザナック1面のようなもの
トラック1
l16
れーふぁーらーそらーー↑どー↓しーそーら1
[
[れーみーふぁーれみーふぁーみれーみー]
[ふぁーそーらーふぁそーらーそふぁーそー]
[し-ー↑どーれー↓し-↑どーれーど↓し-ー↑どー↓]
らーし-ー↑どー↓らし-ー↑どー↓し-らーし-ー
らーし-ー↑[6どー]
れ2ど2↓し-らーそら2.
↑ど2↓し-2ら2そ4ら4
し-2ら2そ2ふぁ2
[8みふぁ]
み1
]
トラック2
l16
れーーれれーど↓しーししーらーそー[3らー↑どれ↓]↑ど↓しらー↓
[[
[4[4れ]ら[3れ]]
[4[4ふぁ]↑ど↓[3ふぁ]]
[4[4し-]↑ふぁ↓[3し-]]
[4[4ら]↑み↓[3ら]]
]]