midiと歌詞からmusicxmlを生成してNEUTRINOに渡したい(1)

前回NEUTRINOのパワーを実感したので、より便利に使いたく、試行錯誤しております。

初音ミクみたいにVSTiになってると最高に嬉しいのですが、計算時間が馬鹿にならないので相性は悪そう。
musicscoreがしんどすぎるので、せめてmidiと歌詞を渡したら歌ってほしい…。
僕は仮歌みたいなやつなので細かい調整は置いといてとにかく歌ってほしいのです。

こんなインタフェースだと嬉しい。

./midi2musicxml input.mid words.txt
# output.wav ができる

探したけど良いツールはありませんでした。

なかったので作ろうとしてみた

https://github.com/kaibadash/midi2musicxml

以下の理由でKotlinで書きました。

  • Javaには標準でMIDIのインタフェースがあった
  • どこでも動いてほしい
  • GUIもあったほうがよい

まだめっちゃWIPなのでひどい状態ですが、midiと歌詞からNEUTRINOで読めるmusicxmlを吐きます。
MIDIを解析して、XMLのテンプレート(thymeleafを使用)に従って吐き出す、という作りになっています。

テスト

fun main() {
  Test().main("sample/120bpm.mid", "うほうほはふはふうまうま")
}

できたもの

怖っ…

音を高くしてみたけど怖いものは怖い。

勉強になったこと

  • MIDIのイベントは音符の始まりと終わりが別々のイベントで定義される
  • MIDIでは曲の速度は、Microseconds Per Quater-note(MPQ、四分音符当たりのマイクロ秒)で定義される
  • 音符の長さはtickで表現される。tickとは何かがよくわかっていないが、タイムベースとテンポから決まるらしい。なるほどわからん。
  • MIDIでは休符はないがmusicxmlにはありそう(そのため今回は休符が無視されてしまっている)

課題、やりたいこと

  • テンポの反映
  • 音符の長さの表現(duration?)
  • 休符の表現
  • 漢字の歌詞もカバーしたい。ここは勘所がある。
  • NEUTRINOの呼び出しまでやる
  • GUIの整備
  • 吐いたwavをDTMにサクッとロードできるVSTiはないだろうか?

続く。