LoginSignup
2
1

More than 5 years have passed since last update.

LINE Messaging API を使って MML を送れるようにしてみた。

Last updated at Posted at 2018-10-11

[ この記事は LINE Messaging API を使って LaTex を送れるようにしてみた。 の続編です。 ]

LINE で音楽を送る

LINE で人と Z-MUSIC の話をするとき、どうしても音符を送りたいときがありますよね。
でも、鼻歌はマルチチャンネルにできませんし、紙がなければ五線譜も書けません。

相手が生の MML を読める人ならいいのですが、そうもいかないことも多々あります。
MML を送ると音楽を返してくれる bot がないかと思って探してみましたが、なかったので作ってみました。

動作イメージ

友だち追加はこちらからどうぞ。

image.png

image.png

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ら]]
]]
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1