モチベーション
youtubeにあるsynthesiaで生成されたピアノ動画と同じものを弾きたい、となったときに楽譜が公開されていない(購入もできない)、ということは多々ある。自分は楽譜が無いと弾けないので、どうにか動画から楽譜を作成できないかと思い試したところ、案外うまくいったので記録を残しておこうと思う。
ちなみにgithubはこちら。サイトとして公開してみたくて、htmlなど勉強してサイトを作ってみたは良いものの、結局サーバー費用などの関係で公開は泣く泣く断念...。
最終目標はmidiファイル生成
まず、楽譜を生成するには音の情報ファイルを用意してmusescoreなどのソフトに読み込ませればよい。音の情報ファイルとしては、midiファイルとmusicxmlファイルを検討してみたが、結局midiファイルを選んだ。
musicxmlは音符の情報を細かく設定できるが、その分四分音符か八分音符かなど自分で特定する必要がある。一方、midiでは音のピッチと開始時間、終了時間を指定すればよいので、よりシンプルでやりやすい。
ただ、これだとグリッサンドなどがうまく表現できないので、より高いクオリティを目指すならmusicxmlを使うべきなのだろう。
とりあえず今回は、降ってくる各音のピッチとその開始時刻、長さを取得することを目標とした。
簡単な流れ
まず、キーボードの色の変化から判定する方法を考えたが、音が同じピッチで連続しているとき、フレームごとに見てもキーボードの色が変化していなかった。つまり、連続した音は一つの長い音として捉えられてしまう。
そこで、キーボードではなく降ってくる音の方に着目することにした。つまり、小節ごとに画像をキャプチャし、各四角を捉え、その横方向の位置からピッチを、縦方向の位置から時間を取得する。長さを時間に変換する際は、一小節が流れ終わるのにかかる時間を利用した。ついでに色も取得し、楽器または右手左手を区別するようにする。(midiファイルでは楽器の種類を指定できる。)
四角を捉える部分はCanny edge detectionを利用。鍵盤の位置は、動画によって異なるので、鍵盤の数と黒鍵白鍵の位置から特定するようにした。オクターブを特定する方法は音源を使用したり、あれば鍵盤上のC3などの文字を利用できるだろうが、そこまでは実装していない。
小節ごとのキャプチャの部分や、四角を上手く捉えて音情報に変換するところは、かなり試行錯誤をしたが、細かい部分は割愛。
②Canny edge detectionで各音を抽出し、一つずつ処理
最後に
今回、小節ごとに音を処理することで、処理を単純にしていたが、小節を示す線がそもそもない動画、あっても画質が悪く抽出できない動画がかなりあった。
そのような動画に対応する方法も今後検討したい。余裕があれば機械学習とかも使ってみたい。